diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index ec946e62..bbe55fbe 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,2 @@ github: [tobiasdiez, JabRef] -custom: ['https://github.com/JabRef/jabref/wiki/Donations'] +custom: ["https://github.com/JabRef/jabref/wiki/Donations"] diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3ee93ad5..3866160b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,19 +1,27 @@ +# Basic `dependabot.yml` file with +# minimum configuration for three package managers + version: 2 updates: -- package-ecosystem: npm - directory: "/" - schedule: - interval: weekly - day: friday - time: "18:00" - open-pull-requests-limit: 10 - labels: - - type:dependency -- package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: weekly - day: friday - time: "18:00" - labels: - - type:dependency + # Enable version updates for npm + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + day: sunday + + # Enable version updates for GitHub Actions + - package-ecosystem: "github-actions" + # Workflow files stored in the default location of `.github/workflows` + # You don't need to specify `/.github/workflows` for `directory`. You can use `directory: "/"`. + directory: "/" + schedule: + interval: "weekly" + day: sunday + + - package-ecosystem: "gitsubmodule" + directory: "/" + schedule: + interval: weekly + day: sunday + labels: [] diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 31afbd71..20f1e6d2 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest if: github.actor == 'dependabot[bot]' steps: - - name: 'Wait for status checks' + - name: "Wait for status checks" id: waitforstatuschecks uses: "WyriHaximus/github-action-wait-for-status@v1.8" with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0c857a33..af1a30bc 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,14 +1,33 @@ -name: Lint test -on: [push] +name: Lint + +on: + push: + branches: + - main + pull_request: + merge_group: + workflow_dispatch: + jobs: run: name: Run runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 'lts/*' - cache: 'npm' - - run: npm install - - run: $(npm bin)/web-ext lint --self-hosted + - uses: actions/checkout@v6 + with: + submodules: recursive + + - name: Install pnpm + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + + - name: Setup Node.js + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + with: + node-version: 24.11.0 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install + + - name: Run linter + run: pnpm lint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..7cdaee48 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,33 @@ +name: Tests + +on: + pull_request: + push: + branches: + - main + merge_group: + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: true + + - name: Install pnpm + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + + - name: Setup Node.js + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24.14.0 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install + + - name: Run tests + run: pnpm test diff --git a/.gitignore b/.gitignore index a97f0816..21376022 100644 --- a/.gitignore +++ b/.gitignore @@ -124,9 +124,6 @@ $RECYCLE.BIN/ # *.iml # *.ipr -# CMake -cmake-build-*/ - # Mongo Explorer plugin .idea/**/mongoSettings.xml @@ -212,3 +209,7 @@ fabric.properties # Support for Project snippet scope # End of https://www.toptal.com/developers/gitignore/api/intellij,visualstudiocode + +# Temporary files +dist/ +test_cache/ diff --git a/.gitmodules b/.gitmodules index e69de29b..de83e05d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "translators/zotero"] + path = translators/zotero + url = https://github.com/tobiasdiez/translators.git +[submodule "sources/zotero-translate"] + path = sources/zotero-translate + url = https://github.com/tobiasdiez/translate.git +[submodule "sources/zotero-utilities"] + path = sources/zotero-utilities + url = https://github.com/tobiasdiez/utilities.git diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 00000000..ea7a87e8 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,4 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "ignorePatterns": ["translators/zotero/**", "sources/zotero-*/**"] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000..9ca7448e --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,144 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["unicorn", "typescript", "oxc"], + "categories": {}, + "rules": { + "constructor-super": "warn", + "for-direction": "warn", + "no-async-promise-executor": "warn", + "no-caller": "warn", + "no-class-assign": "warn", + "no-compare-neg-zero": "warn", + "no-cond-assign": "warn", + "no-const-assign": "warn", + "no-constant-binary-expression": "warn", + "no-constant-condition": "warn", + "no-control-regex": "warn", + "no-debugger": "warn", + "no-delete-var": "warn", + "no-dupe-class-members": "warn", + "no-dupe-else-if": "warn", + "no-dupe-keys": "warn", + "no-duplicate-case": "warn", + "no-empty-character-class": "warn", + "no-empty-pattern": "warn", + "no-empty-static-block": "warn", + "no-eval": "warn", + "no-ex-assign": "warn", + "no-extra-boolean-cast": "warn", + "no-func-assign": "warn", + "no-global-assign": "warn", + "no-import-assign": "warn", + "no-invalid-regexp": "warn", + "no-irregular-whitespace": "warn", + "no-loss-of-precision": "warn", + "no-new-native-nonconstructor": "warn", + "no-nonoctal-decimal-escape": "warn", + "no-obj-calls": "warn", + "no-self-assign": "warn", + "no-setter-return": "warn", + "no-shadow-restricted-names": "warn", + "no-sparse-arrays": "warn", + "no-this-before-super": "warn", + "no-unassigned-vars": "warn", + "no-unsafe-finally": "warn", + "no-unsafe-negation": "warn", + "no-unsafe-optional-chaining": "warn", + "no-unused-expressions": "warn", + "no-unused-labels": "warn", + "no-unused-private-class-members": "warn", + "no-unused-vars": "warn", + "no-useless-backreference": "warn", + "no-useless-catch": "warn", + "no-useless-escape": "warn", + "no-useless-rename": "warn", + "no-with": "warn", + "require-yield": "warn", + "use-isnan": "warn", + "valid-typeof": "warn", + "oxc/bad-array-method-on-arguments": "warn", + "oxc/bad-char-at-comparison": "warn", + "oxc/bad-comparison-sequence": "warn", + "oxc/bad-min-max-func": "warn", + "oxc/bad-object-literal-comparison": "warn", + "oxc/bad-replace-all-arg": "warn", + "oxc/const-comparisons": "warn", + "oxc/double-comparisons": "warn", + "oxc/erasing-op": "warn", + "oxc/missing-throw": "warn", + "oxc/number-arg-out-of-range": "warn", + "oxc/only-used-in-recursion": "warn", + "oxc/uninvoked-array-callback": "warn", + "typescript/await-thenable": "warn", + "typescript/no-array-delete": "warn", + "typescript/no-base-to-string": "warn", + "typescript/no-duplicate-enum-values": "warn", + "typescript/no-duplicate-type-constituents": "warn", + "typescript/no-extra-non-null-assertion": "warn", + "typescript/no-floating-promises": "warn", + "typescript/no-for-in-array": "warn", + "typescript/no-implied-eval": "warn", + "typescript/no-meaningless-void-operator": "warn", + "typescript/no-misused-new": "warn", + "typescript/no-misused-spread": "warn", + "typescript/no-non-null-asserted-optional-chain": "warn", + "typescript/no-redundant-type-constituents": "warn", + "typescript/no-this-alias": "warn", + "typescript/no-unnecessary-parameter-property-assignment": "warn", + "typescript/no-unsafe-declaration-merging": "warn", + "typescript/no-unsafe-unary-minus": "warn", + "typescript/no-useless-empty-export": "warn", + "typescript/no-wrapper-object-types": "warn", + "typescript/prefer-as-const": "warn", + "typescript/require-array-sort-compare": "warn", + "typescript/restrict-template-expressions": "warn", + "typescript/triple-slash-reference": "warn", + "typescript/unbound-method": "warn", + "unicorn/no-await-in-promise-methods": "warn", + "unicorn/no-empty-file": "warn", + "unicorn/no-invalid-fetch-options": "warn", + "unicorn/no-invalid-remove-event-listener": "warn", + "unicorn/no-new-array": "warn", + "unicorn/no-single-promise-in-promise-methods": "warn", + "unicorn/no-thenable": "warn", + "unicorn/no-unnecessary-await": "warn", + "unicorn/no-useless-fallback-in-spread": "warn", + "unicorn/no-useless-length-check": "warn", + "unicorn/no-useless-spread": "warn", + "unicorn/prefer-set-size": "warn", + "unicorn/prefer-string-starts-ends-with": "warn" + }, + "settings": { + "jsx-a11y": { + "polymorphicPropName": null, + "components": {}, + "attributes": {} + }, + "next": { + "rootDir": [] + }, + "react": { + "formComponents": [], + "linkComponents": [], + "version": null + }, + "jsdoc": { + "ignorePrivate": false, + "ignoreInternal": false, + "ignoreReplacesDocs": true, + "overrideReplacesDocs": true, + "augmentsExtendsReplacesDocs": false, + "implementsReplacesDocs": false, + "exemptDestructuredRootsFromChecks": false, + "tagNamePreference": {} + }, + "vitest": { + "typecheck": false + } + }, + "env": { + "builtin": true + }, + "globals": {}, + "ignorePatterns": ["translators/zotero/**"] +} diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index ef2ab100..00000000 --- a/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "semi": false, - "singleQuote": true, - "tabWidth": 4 -} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..99e2f7dd --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["oxc.oxc-vscode"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json index c62d8674..3712d482 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,17 +1,17 @@ { - "version": "0.2.0", - "configurations": [ - { - "name": "Launch WebExtension", - "type": "firefox", - "request": "launch", - "reAttach": true, - "reloadOnChange": { - "watch": "${workspaceFolder}/**/*.js", - "ignore": ["**/node_modules/**", "{workspaceFolder}/zotero-connectors/**"] - }, - "addonPath": "${workspaceFolder}", - "firefoxArgs": ["https://arxiv.org/a/diez_t_1.html", "about:debugging#/runtime/this-firefox"] - } - ] + "version": "0.2.0", + "configurations": [ + { + "name": "Launch WebExtension", + "type": "firefox", + "request": "launch", + "reAttach": true, + "reloadOnChange": { + "watch": "${workspaceFolder}/**/*.js", + "ignore": ["**/node_modules/**"] + }, + "addonPath": "${workspaceFolder}", + "firefoxArgs": ["https://arxiv.org/a/diez_t_1.html", "about:debugging#/runtime/this-firefox"] + } + ] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..a5a32b4c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,24 @@ +{ + "editor.defaultFormatter": "oxc.oxc-vscode", + "editor.formatOnSave": true, + "editor.formatOnSaveMode": "file", + "[json]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "[html]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "[css]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "cSpell.words": ["Zotero"], + "chat.tools.terminal.autoApprove": { + "/^python scripts/import_and_patch_translators\\.py$/": { + "approve": true, + "matchCommandLine": true + } + } +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..41245436 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,43 @@ +## Contributing to the Development + +JabRef browser extension uses the [WebExtensions API](https://developer.mozilla.org/en-US/Add-ons/WebExtensions). + +Preparation: + +1. Install [Node.js](https://nodejs.org) (e.g., `choco install nodejs`) and [pnpm](https://pnpm.io) (e.g., `npm install -g pnpm`). +2. [Fork the repository](https://help.github.com/articles/fork-a-repo/). +3. Checkout the repository. +4. Install development dependencies via `pnpm install`. +5. Start browser with the add-on activated: + Firefox: `pnpm dev:firefox` + Chrome: `pnpm dev:opera` + +Now just follow the typical steps to [contribute code](https://guides.github.com/activities/contributing-to-open-source/#contributing): + +1. Create your feature branch: `git checkout -b my-new-feature` +2. Make your changes and test them by running the extension in the browser as described above. +3. Commit your changes: `git commit -am 'Add some feature'` +4. Push to the branch: `git push origin my-new-feature` +5. Submit a pull request. + +## Updating dependencies & Zotero translators + +- `python scripts/import_and_patch_translators.py` updates all Zotero submodules, post-processes the translators and applies the necessary patches for our extension + +The following commands are used to update the dependencies of the project; as we use automatic dependency updates this should not be necessary in most cases, but it is good to know how to do it manually: + +- `pnpm outdated` gives an overview of outdated packages ([doc](https://pnpm.io/cli/outdated)) +- `pnpm update --latest` updates all packages +- `pnpm install` installs updated packages + +## Release of new version + +- Increase version number in `manifest.json` +- `pnpm build` +- Upload to: + - https://addons.mozilla.org/en-US/developers/addon/jabref/versions/submit/ + - https://chrome.google.com/u/2/webstore/devconsole/26c4c347-9aa1-48d8-8a22-1c79fd3a597e/bifehkofibaamoeaopjglfkddgkijdlh/edit/package + - https://addons.opera.com/developer/upload/ + - https://developer.apple.com/app-store-connect/ +- Remove the `key` field in `manifest.json` and build again. Then upload to: + - https://partner.microsoft.com/en-us/dashboard/microsoftedge/2045cdc1-808f-43c4-8091-43e2dcaff53d/packages diff --git a/PrivacyPolicy.md b/PrivacyPolicy.md index b5ad952c..075db1ef 100644 --- a/PrivacyPolicy.md +++ b/PrivacyPolicy.md @@ -1,15 +1,18 @@ # Privacy Policy -Your privacy is critically important to us. + +Your privacy is critically important to us. To better protect your privacy we provide this privacy policy notice. Below we explain how we collect, use, and share information about you, along with the choices that you have with respect to that information. This Privacy Policy governs your use of the JabRef Browser Extension. ## Information We Collect + When you use your browser to access a website, the extension aims to save you time by allowing to quickly import bibliographic information into JabRef. In order to provide this service, the extension collects and analyzes certain information concerning your browser activity. We only collect information about you if we have a reason to do so. In particular, the following information is used: + - the url of the current website you are visiting, - the content of the current website. @@ -17,14 +20,17 @@ No personal data (like name, email address, billing address or credit card) is c By using the extension you will remain completely anonymous. ## Storing Information + We do not store any data, locally or on our servers. The accessed information (like the content of the current website) is only used to extract the relevant bibliographic references, which are then send to JabRef. ## Sharing Information + Certain operations you perform in JabRef may trigger requests to public third-party services such as Zotero, Crossref or the Library of Congress for metadata retrieval. These third parties may log your IP address and search terms (e.g., DOI, ISBN or the current URL) according to their privacy policies, but no other identifying information is provided. ## Changes To This Privacy Policy + Although most changes are likely to be minor, we may change this Privacy Policy from time to time. We encourage you to check this Privacy Policy periodically for any changes. If we make any material changes to this Privacy Policy, we will notify you by placing a prominent notice on our website. @@ -32,6 +38,7 @@ If we make any material changes to this Privacy Policy, we will notify you by pl This Privacy Policy is effective as of 2020-03-20 and will remain in effect except with respect to any changes in its provisions in the future, which will be in effect immediately after being posted on this page. ## Contact Information + For any questions or concerns regarding the privacy policy, please send us an email to . That’s it! Thanks for reading. diff --git a/README.md b/README.md index b2cf504c..3882df0a 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,26 @@ # JabRef Browser Extension -> [Firefox](https://addons.mozilla.org/en-US/firefox/addon/jabref/?src=external-github) - [Chrome](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) - [Edge](https://microsoftedge.microsoft.com/addons/detail/pgkajmkfgbehiomipedjhoddkejohfna) - [Vivaldi](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) + +> [Firefox](https://addons.mozilla.org/en-US/firefox/addon/jabref/?src=external-github) - [Chrome](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) - [Edge](https://microsoftedge.microsoft.com/addons/detail/pgkajmkfgbehiomipedjhoddkejohfna) - [Vivaldi](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) Browser extension for users of the bibliographic reference manager [JabRef](https://www.jabref.org/). It automatically identifies and extracts bibliographic information on websites and sends them to JabRef with one click. When you find an interesting article through Google Scholar, the arXiv or journal websites, this browser extension allows you to add those references to JabRef. -Even links to accompanying PDFs are sent to JabRef, where those documents can easily be downloaded, renamed and placed in the correct folder. +Even links to accompanying PDFs are sent to JabRef, where those documents can easily be downloaded, renamed and placed in the correct folder. [A wide range of publisher sites, library catalogs and databases are supported](https://www.zotero.org/support/translators). _Please post any issues or suggestions [here on GitHub](https://github.com/JabRef/JabRef-Browser-Extension/issues)._ ## Installation and Configuration + Normally, you simply install the extension from the browser store and are ready to go. -> [Firefox](https://addons.mozilla.org/en-US/firefox/addon/jabref/?src=external-github) - [Chrome](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) - [Edge](https://microsoftedge.microsoft.com/addons/detail/pgkajmkfgbehiomipedjhoddkejohfna) - [Vivaldi](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) + +> [Firefox](https://addons.mozilla.org/en-US/firefox/addon/jabref/?src=external-github) - [Chrome](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) - [Edge](https://microsoftedge.microsoft.com/addons/detail/pgkajmkfgbehiomipedjhoddkejohfna) - [Vivaldi](https://chrome.google.com/webstore/detail/jabref-browser-extension/bifehkofibaamoeaopjglfkddgkijdlh) Sometimes, a manual installation is necessary (e.g. if you use the portable version of JabRef). In this case, please follow the steps described [in the user manual](https://docs.jabref.org/import-export/import/jabref-browser-extension). ## Usage + After the installation, you should be able to import bibliographic references into JabRef directly from your browser. Just visit a publisher site or some other website containing bibliographic information (for example, [the arXiv](http://arxiv.org/list/gr-qc/pastweek?skip=0&show=5)) and click the JabRef symbol in the Firefox search bar (or press Alt+Shift+J). Once the JabRef browser extension has extracted the references and downloaded the associated PDF's, the import window of JabRef opens. @@ -24,58 +28,8 @@ Once the JabRef browser extension has extracted the references and downloaded th You might want to configure JabRef so that new entries are always imported in an already opened instance of JabRef. For this, activate "Remote operation" under the Network tab in the JabRef Preferences. - ## About this Add-On Internally, this browser extension uses the magic of Zotero's site translators. Thus most of the credit has to go to the Zotero development team and to the many authors of the [site translators collection](https://github.com/zotero/translators). Note that this browser extension does not make any changes to the Zotero database and thus both plug-ins coexist happily with each other. - -## Contributing to the Development - -JabRef browser extension uses the [WebExtensions API](https://developer.mozilla.org/en-US/Add-ons/WebExtensions). - -Preparation: -1. Install [Node.js](https://nodejs.org) (e.g., `choco install nodejs`) -2. Install [gulp](https://gulpjs.com/) and [web-ext](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_started_with_web-ext): `npm install --global gulp-cli web-ext` -3. [Fork the repository](https://help.github.com/articles/fork-a-repo/). -4. Checkout the repository. -5. Install development dependencies via `npm install`. -6. Start browser with the add-on activated: - Firefox: `npm run dev:firefox` - Chrome: `npm run dev:opera` - -Now just follow the typical steps to [contribute code](https://guides.github.com/activities/contributing-to-open-source/#contributing): -1. Create your feature branch: `git checkout -b my-new-feature` -3. Build and run the add-on as described above. -3. Commit your changes: `git commit -am 'Add some feature'` -4. Push to the branch: `git push origin my-new-feature` -5. Submit a pull request. - -To update dependencies: - - - `npm outdated` gives an overview of outdated packages ([doc](https://docs.npmjs.com/cli/outdated)) - - `npm-upgrade` updates all packages - - `npm install` install updated packages - - running - ``` - git subtree pull --prefix zotero-connectors https://github.com/zotero/zotero-connectors.git master --squash - git subtree pull --prefix zotero-connectors/src/zotero https://github.com/zotero/zotero.git master --squash - git subtree pull --prefix zotero-connectors/src/translate https://github.com/zotero/translate.git master --squash - git subtree pull --prefix zotero-connectors/src/utilities https://github.com/zotero/utilities.git master --squash - git subtree pull --prefix zotero-scholar-citations https://github.com/MaxKuehn/zotero-scholar-citations.git master --squash - ``` - updates the `zotero-connectors` submodule and the `zotero-scholar-citations` submodule - - - `gulp update-external-scripts` copies and post-processes the scripts in the folders `zotero-connectors` and `zotero-scholar-citations` to the folder `external-scripts` - -## Release of new version -- Increase version number in `manifest.json` -- `npm run build` -- Upload to: - - https://addons.mozilla.org/en-US/developers/addon/jabref/versions/submit/ - - https://chrome.google.com/u/2/webstore/devconsole/26c4c347-9aa1-48d8-8a22-1c79fd3a597e/bifehkofibaamoeaopjglfkddgkijdlh/edit/package - - https://addons.opera.com/developer/upload/ - - https://developer.apple.com/app-store-connect/ -- Remove the `key` field in `manifest.json` and build again. Then upload to: - - https://partner.microsoft.com/en-us/dashboard/microsoftedge/2045cdc1-808f-43c4-8091-43e2dcaff53d/packages diff --git a/background.js b/background.js index 47791ff9..7142c213 100644 --- a/background.js +++ b/background.js @@ -1,276 +1,409 @@ -/* - Initialize -*/ -Zotero.Debug.init(1) -Zotero.Repo.init() -Zotero.Messaging.init() -Zotero.Connector_Types.init() -Zotero.Translators.init() -zsc.init() -//wsClient.startClient(); // TODO: don't start websocket client, until JabRef's counterpart is integrated +import { exportItems } from "./sources/translateEngine.js"; + +// Provide a minimal compatibility shim: if `browser` is missing, alias it to `chrome`. +if (typeof browser === "undefined" && typeof chrome !== "undefined") { + globalThis.browser = chrome; +} -this.tabInfo = new Map() +var tabInfo = new Map(); /* Show/hide import button for all tabs (when add-on is loaded). */ browser.tabs.query({}).then((tabs) => { - // We wait a bit before injection to give Zotero time to load the translators - setTimeout(() => { - console.log('JabRef: Inject into open tabs %o', tabs) - for (let tab of tabs) { - installInTab(tab) - } - }, 1500) -}) + console.log("JabRef: Inject into open tabs %o", tabs); + for (let tab of tabs) { + installInTab(tab); + } +}); /* Show/hide import button for the currently active tab, whenever the user navigates. */ -browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { - if (!changeInfo.url) { - return - } - browser.tabs - .query({ - active: true, - currentWindow: true, - }) - .then((tabs) => { - if (tabId === tabs[0].id) { - var tab = tabs[0] - - // Clear old translator information - Zotero.Connector_Browser.onPageLoad(tab) - - installInTab(tab) - } - }) -}) +browser.tabs.onUpdated.addListener((tabId, changeInfo, _tab) => { + if (!changeInfo.url) { + return; + } + browser.tabs + .query({ + active: true, + currentWindow: true, + }) + .then((tabs) => { + if (tabId === tabs[0].id) { + var tab = tabs[0]; + installInTab(tab); + } + }); +}); /* Remove translator information when tab is closed. */ -browser.tabs.onRemoved.addListener(Zotero.Connector_Browser.onPageLoad) +browser.tabs.onRemoved.addListener((tabId, _removeInfo) => { + tabInfo.delete(tabId); +}); /* Disable add-on for special browser pages */ function isDisabledForURL(url) { - return ( - url.includes('chrome://') || - url.includes('about:') || - (url.includes('-extension://') && !url.includes('/test/')) - ) + return ( + url.includes("chrome://") || + url.includes("about:") || + (url.includes("-extension://") && !url.includes("/test/")) + ); +} + +function getDocumentContentType() { + return document.contentType; } /* Searches for translators for the given tab and shows/hides the import button accordingly. + + Zotero.Connector_Browser.onPageLoad is the original function from the Zotero Connector, + see https://github.com/zotero/zotero-connectors/blob/dac609fb9dea1e98dbcc73387b05f7af5ef7814d/src/browserExt/background.js#L968. */ function installInTab(tab) { - if (isDisabledForURL(tab.url)) { - return - } + if (isDisabledForURL(tab.url)) { + return; + } + + // Reset tab info + tabInfo.delete(tab.id); - // Reset tab info - tabInfo.delete(tab.id) - - // We cannot inject content scripts into PDF: https://bugzilla.mozilla.org/show_bug.cgi?id=1454760 - // Thus, our detection algorithm silently fails in this case, as the Inject#init is never called - // Try to detect these situations by calling a content script; this fails - browser.tabs - .executeScript(tab.id, { - code: 'document.contentType', - }) - .then((result) => { - lookForTranslators(tab) - tabInfo.set(tab.id, { isPDF: false }) - }) - .catch((error) => { - console.debug(`JabRef: Error calling content script: ${error}`) - - // Assume a PDF is displayed in this tab - browser.pageAction.show(tab.id) - browser.pageAction.setTitle({ - tabId: tab.id, - title: 'Import references into JabRef as PDF', - }) - tabInfo.set(tab.id, { isPDF: true }) - }) + // We cannot inject content scripts into PDF: https://bugzilla.mozilla.org/show_bug.cgi?id=1454760 + // Thus, our detection algorithm silently fails in this case + // Try to detect these situations by calling a content script; this fails + browser.scripting + .executeScript({ + target: { tabId: tab.id }, + func: getDocumentContentType, + }) + .then((_result) => { + lookForTranslators(tab); + tabInfo.set(tab.id, { isPDF: false }); + }) + .catch((error) => { + console.debug(`JabRef: Error calling content script: ${error}`); + + // Assume a PDF is displayed in this tab + browser.pageAction.show(tab.id); + browser.pageAction.setTitle({ + tabId: tab.id, + title: "Import references into JabRef as PDF", + }); + tabInfo.set(tab.id, { isPDF: true }); + }); } -function lookForTranslators(tab) { - console.log('JabRef: Searching for translators for %o', tab) - Zotero.Translators.getWebTranslatorsForLocation(tab.url, tab.url).then( - (translators) => { - if (translators[0].length === 0) { - // No translators found, so hide button - console.log('JabRef: No translators found') - browser.pageAction.hide(tab.id) - } else { - // Potential translators found, Zotero will check if these can detect something on the website. - // We will be notified about the result of this check using the `onTranslators` method below, so nothing to do here. - console.log( - 'JabRef: Found potential translators %o', - translators[0] - ) - } - } - ) +/* + Looks for potential translators for the given tab. +*/ +async function lookForTranslators(tab) { + console.log("JabRef: Searching for translators for %o", tab); + + await initTranslateEngine(tab); + const response = await browser.tabs.sendMessage(tab.id, { + type: "detectTranslators", + url: tab.url, + }); + const translatorsInfo = response?.translatorsInfo || []; + onTranslators(translatorsInfo, tab.id); } async function evalInTab(tabsId, code) { - try { - result = await browser.tabs.executeScript(tabsId, { - code: code, - }) - console.log(`JabRef: code executed with result ${result}`) - return result - } catch (error) { - console.log(`JabRef: Error executing script: ${error}`) - } + try { + result = await browser.tabs.executeScript(tabsId, { + code: code, + }); + console.log(`JabRef: code executed with result ${result}`); + return result; + } catch (error) { + console.log(`JabRef: Error executing script: ${error}`); + } +} + +function openErrorPage(message, details = "", stacktrace = "") { + browser.tabs.create({ + url: + "/data/error.html?message=" + + encodeURIComponent(message) + + "&details=" + + encodeURIComponent(details ?? "") + + "&stacktrace=" + + encodeURIComponent(stacktrace ?? ""), + }); +} + +async function getBaseUrl() { + const settings = await browser.storage.sync.get({ httpPort: 23119 }); + return `http://localhost:${settings.httpPort}/`; } +async function sendBibEntryHttp(bibtex) { + const baseUrl = await getBaseUrl(); -saveAsWebpage = function (tab) { - var title = tab.title - var url = tab.url - var date = new Date().toISODate() + const health = await fetch(baseUrl, { method: "GET", cache: "no-store" }); + if (!(health.ok || health.status === 404)) { + throw new Error(`JabRef HTTP endpoint unavailable (${health.status})`); + } + + const resp = await fetch(baseUrl + "libraries/current/entries", { + method: "POST", + headers: { "Content-Type": "application/x-bibtex" }, + body: bibtex, + }); + + if (!resp.ok) { + const body = await resp.text().catch(() => ""); + throw new Error(`HTTP ${resp.status}${body ? `: ${body}` : ""}`); + } +} + +async function sendBibEntryNative(bibtex) { + const response = await browser.runtime.sendNativeMessage("org.jabref.jabref", { + text: bibtex, + }); + if (response?.message === "ok") { + return; + } + + if (response?.message === "error") { + console.error( + `JabRef: Error connecting to JabRef: '${response.output}' at '${response.stacktrace}'`, + ); + openErrorPage(response.output, "", response.stacktrace); + } + + console.error( + `JabRef: Error connecting to JabRef: '${response.message}' with details '${response.output}' at '${response.stacktrace}'`, + ); + openErrorPage(response.message, response.output, response.stacktrace); +} - // Construct a manual Bibtex Entry for the webpage - var bibtexString = `@misc{,\ +async function sendBibTexToJabRef(bibtex) { + await browser.runtime.sendMessage({ onSendToJabRef: "sendToJabRefStarted" }); + console.log("JabRef: Send BibTeX to JabRef: %o", bibtex); + + try { + await sendBibEntryHttp(bibtex); + await browser.runtime.sendMessage({ popupClose: "close" }); + return; + } catch (httpError) { + console.warn("JabRef: HTTP send failed, falling back to native messaging", httpError); + } + + await sendBibEntryNative(bibtex); + await browser.runtime.sendMessage({ popupClose: "close" }); +} + +function saveAsWebpage(tab) { + var title = tab.title; + var url = tab.url; + var date = new Date().toISOString(); + + // Construct a manual Bibtex Entry for the webpage + var bibtexString = `@misc{,\ title={${title}},\ url = {${url}},\ urlDate={${date}},\ - }` - Zotero.Connector.sendBibTexToJabRef(bibtexString) + }`; + sendBibTexToJabRef(bibtexString); } -savePdf = function (tab) { - var title = tab.title.replace('.pdf', '') - var url = tab.url - var urlEscaped = tab.url.replace(':', '\\:') - var date = new Date().toISODate() +function savePdf(tab) { + var title = tab.title.replace(".pdf", ""); + var url = tab.url; + var urlEscaped = tab.url.replace(":", "\\:"); + var date = new Date().toISOString(); - // Construct a manual Bibtex Entry for the PDF - var bibtexString = `@misc{,\ + // Construct a manual Bibtex Entry for the PDF + var bibtexString = `@misc{,\ title={${title}},\ file={:${urlEscaped}:PDF},\ url = {${url}},\ urlDate={${date}},\ - }` - Zotero.Connector.sendBibTexToJabRef(bibtexString) + }`; + sendBibTexToJabRef(bibtexString); } /* - Is called after Zotero injected all scripts and checked if the potential translators can find something on the page. + Is called after lookForTranslators found matching translators. We need to hide or show the page action accordingly. */ -onTranslators = function (translators, tabId, contentType) { - if (translators.length === 0) { - console.log( - 'JabRef: Found no suitable translators for tab %o', - JSON.parse(JSON.stringify(tabId)) - ) - tabInfo.set(tabId, { ...tabInfo.get(tabId), hasTranslator: false }) - browser.pageAction.setIcon({ - tabId: tabId, path: { - "48": "data/JabRef-icon-48.png", - "96": "data/JabRef-icon-96.png" - } - }) - browser.pageAction.show(tabId) - browser.pageAction.setTitle({ - tabId: tabId, - title: - 'Import simple website reference into JabRef', - }) - } else { - console.log( - 'JabRef: Found translators %o for tab %o', - translators, - JSON.parse(JSON.stringify(tabId)) - ) - tabInfo.set(tabId, { ...tabInfo.get(tabId), hasTranslator: true }) - browser.pageAction.setIcon({ - tabId: tabId, path: { - "48": "data/JabRef-icon-plus-48.png", - "96": "data/JabRef-icon-plus-96.png" - } - }) - browser.pageAction.show(tabId) - browser.pageAction.setTitle({ - tabId: tabId, - title: - 'Import references into JabRef using ' + translators[0].label, - }) +function onTranslators(translatorsInfo, tabId) { + if (!translatorsInfo || translatorsInfo.length === 0) { + console.log(`JabRef: Found no suitable translators for tab ${tabId}`); + tabInfo.set(tabId, { ...tabInfo.get(tabId), translatorsInfo }); + browser.pageAction.show(tabId); + browser.pageAction.setTitle({ + tabId: tabId, + title: "Import simple website reference into JabRef", + }); + } else { + console.log(`JabRef: Found translators %o for tab ${tabId}`, translatorsInfo); + tabInfo.set(tabId, { ...tabInfo.get(tabId), translatorsInfo }); + browser.pageAction.show(tabId); + browser.pageAction.setTitle({ + tabId: tabId, + title: "Import references into JabRef using " + translatorsInfo[0].label, + }); + } +} + +async function initOffscreenDocument() { + if (!browser.offscreen) return false; + const has = await browser.offscreen.hasDocument(); + if (has) return true; + try { + await browser.offscreen.createDocument({ + url: browser.runtime.getURL("offscreen.html"), + reasons: ["DOM_PARSER"], + justification: "Scraping the document for bibliographic data", + }); + return true; + } catch (e) { + console.warn("Failed to create offscreen document", e); + return false; + } +} + +async function initContentScript(tabId) { + return await browser.scripting.executeScript({ + target: { tabId }, + files: ["sources/contentScript.js"], + }); +} + +async function initTranslateEngine(tab) { + // The basic issue is that the background script doesn't have access + // to the DOM. + // Depending on the browser, we run the translators thus in: + // - the offscreen page (Chrome), + // - the content script (Firefox). + if (browser.offscreen) { + await initOffscreenDocument(); + } else { + await initContentScript(tab.id); + } +} + +async function onPopupOpened(tab, info) { + if (!info.translatorsInfo.length) throw new Error("No translator paths provided"); + + await browser.tabs.sendMessage(tab.id, { + type: "runTranslators", + url: tab.url, + translatorsInfo: info.translatorsInfo, + }); +} + +async function getConversionMode() { + const cfg = await browser.storage.sync.get({ exportMode: "bibtex" }); + return cfg.exportMode || "bibtex"; +} + +async function prepareForExport(items) { + const { takeSnapshots } = await browser.storage.sync.get({ takeSnapshots: false }); + + for (var i = 0; i < items.length; i++) { + var item = items[i]; + for (var j = 0; j < item.attachments.length; j++) { + var attachment = item.attachments[j]; + + var isLink = + attachment.mimeType === "text/html" || attachment.mimeType === "application/xhtml+xml"; + if (isLink && attachment.snapshot !== false) { + // Snapshot + if (takeSnapshots && attachment.url) { + attachment.localPath = attachment.url; + } else { + // Ignore + } + } else { + // Normal file + // Pretend we downloaded the file since otherwise it is not exported + if (attachment.url) { + attachment.localPath = attachment.url; + } + } + } + + // Fix date string + if (item.accessDate) { + item.accessDate = new Date().toISOString(); } + } } -browser.runtime.onMessage.addListener(function (message, sender, sendResponse) { - if (message.popupOpened) { - // The popup opened, i.e. the user clicked on the page action button - console.log('JabRef: Popup opened confirmed') - - browser.tabs - .query({ - active: true, - currentWindow: true, - }) - .then((tabs) => { - var tab = tabs[0] - var info = tabInfo.get(tab.id) - - if (info && info.isPDF) { - console.log( - 'JabRef: Export PDF in tab %o', - JSON.parse(JSON.stringify(tab)) - ) - savePdf(tab) - } else if (info.hasTranslator === false) { - console.log( - 'JabRef: No translation, simple saving %o', - JSON.parse(JSON.stringify(tab)) - ) - saveAsWebpage(tab); - } else { - console.log( - 'JabRef: Start translation for tab %o', - JSON.parse(JSON.stringify(tab)) - ) - Zotero.Connector_Browser.saveWithTranslator(tab, 0) - } - }) - } else if (message.getWsClientState) { - console.debug('JabRef: wsClientState requested') - let wsClientState = {} - wsClientState.clientStarted = wsClient.isClientStarted() - wsClientState.connectionState = wsClient.getConnectionState() - sendResponse(wsClientState) +browser.runtime.onMessage.addListener(async function (message, sender, _sendResponse) { + try { + if (message.type === "popupOpened") { + // The popup opened, i.e. the user clicked on the page action button + console.log("JabRef: Popup opened confirmed"); + const tabs = await browser.tabs.query({ + active: true, + currentWindow: true, + }); + var tab = tabs[0]; + var info = tabInfo.get(tab.id); + + if (info && info.isPDF) { + console.log("JabRef: Export PDF in tab %o", JSON.parse(JSON.stringify(tab))); + savePdf(tab); + } else if (!info.translatorsInfo) { + console.log("JabRef: No translators, simple saving %o", JSON.parse(JSON.stringify(tab))); + saveAsWebpage(tab); + } else { + console.log("JabRef: Start translation for tab %o", JSON.parse(JSON.stringify(tab))); + await onPopupOpened(tab, info); + } + + return { ok: true }; + } else if (message.type === "COHTTP.request") { + const { method, url, options } = message; + console.debug(`JabRef: COHTTP request in background.js: ${method} ${url} %o`, options); + const xhr = await Zotero.HTTP.request(method, url, options); + // From upstream: https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/messages.js#L302-L316 + let result = { + response: xhr.response, + responseType: xhr.responseType, + status: xhr.status, + statusText: xhr.statusText, + responseHeaders: xhr.getAllResponseHeaders(), + responseURL: xhr.responseURL, + }; + return result; + } else if (message.type === "offscreenResult") { + console.debug("JabRef: offscreenResult in background.js: %o", message); + if (message.error) { + console.error("JabRef: Error in offscreen translator execution", message.error); + return; + } + const { url, items } = message; + const conversionMode = await getConversionMode(); + await prepareForExport(items); + await browser.runtime.sendMessage({ onConvertToBibtex: "convertStarted" }); + const bib = await exportItems(items, conversionMode); + console.debug("JabRef: Exported BibTeX: %o", bib); + await sendBibTexToJabRef(bib); } else if (message.eval) { - console.debug( - 'JabRef: eval in background.js: %o', - JSON.parse(JSON.stringify(message.eval)) - ) - return evalInTab(sender.tab.id, message.eval) - } else if (message[0] === 'Connector_Browser.onTranslators') { - // Intercept message to Zotero background script - console.log( - 'JabRef: Intercept message to Zotero background script', - JSON.parse(JSON.stringify(message)) - ) - message[1][1] = sender.tab.id - onTranslators.apply(null, message[1]) - } else if (message[0] === 'Debug.log') { - console.log(message[1]) - } else if (message[0] === 'Errors.log') { - console.log(message[1]) - } else if (message[0] === 'Prefs.getAll') { - // Ignore, this is handled by Zotero + console.debug("JabRef: eval in background.js: %o", JSON.parse(JSON.stringify(message.eval))); + return evalInTab(sender.tab.id, message.eval); + } else if (message[0] === "Debug.log") { + console.log(message[1]); + } else if (message[0] === "Errors.log") { + console.log(message[1]); } else { - console.log( - 'JabRef: other message in background.js: %o', - JSON.parse(JSON.stringify(message)) - ) + console.log( + "JabRef: other message in background.js: %o", + JSON.parse(JSON.stringify(message)), + ); } -}) + } catch (e) { + console.error("JabRef: Error handling message in background.js", e); + throw e; + } +}); diff --git a/bibtexConverter.js b/bibtexConverter.js deleted file mode 100644 index fe8ddb33..00000000 --- a/bibtexConverter.js +++ /dev/null @@ -1,58 +0,0 @@ -convertToBibTex = function(items, conversionMode) { - let deferred = Zotero.Promise.defer(); - let translation = new Zotero.Translate.Export(); - - translation.setItems(items); - if (conversionMode === "biblatex") { - console.log("JabRef: Converting item(s) to BibLaTeX: %o", items); - translation.setTranslator("b6e39b57-8942-4d11-8259-342c46ce395f"); // BibLaTeX - } - else { - console.log("JabRef: Converting item(s) to BibTeX: %o", items); - translation.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); // BibTeX - } - translation.setHandler("done", function(obj, worked) { - if (worked) { - deferred.resolve(obj.string); - } else { - deferred.reject("Problem translating the item to BibTeX.") - } - }); - translation.translate(); - return deferred.promise; -}; - -Zotero.Translate.ItemGetter = function() { - this._itemsLeft = []; - this._collectionsLeft = null; - this._exportFileDirectory = null; - this.legacy = false; -}; - -Zotero.Translate.ItemGetter.prototype = { - "setItems": function(items) { - this._itemsLeft = items; - this._itemsLeft.sort(function(a, b) { - return a.id - b.id; - }); - this.numItems = this._itemsLeft.length; - }, - - /** - * Retrieves the next available item - */ - "nextItem": function() { - if (this._itemsLeft.length !== 0) { - return this._itemsLeft.shift(); - } else { - return false; - } - } -}; - -browser.runtime.onMessage.addListener(message => { - if (message.convertToBibTex) { - console.log("JabRef: Got task to convert %o to BibTeX", message.convertToBibTex); - return convertToBibTex(message.convertToBibTex, message.conversionMode); - } -}); diff --git a/connector.js b/connector.js deleted file mode 100644 index e80d8670..00000000 --- a/connector.js +++ /dev/null @@ -1,150 +0,0 @@ -if (!Date.prototype.toISODate) { - Date.prototype.toISODate = function() { - return this.getFullYear() + '-' + - ('0' + (this.getMonth() + 1)).slice(-2) + '-' + - ('0' + this.getDate()).slice(-2); - } -} - -Zotero.Connector = new function() { - this.callMethod = Zotero.Promise.method(function(options, data, cb, tab) { - throw new Error("JabRef: Tried to contact Zotero standalone: " + options); - }); - - this.callMethodWithCookies = function(options, data, tab) { - if (options === "saveItems") { - browser.storage.sync.get({'exportMode': 'bibtex', 'takeSnapshots': false, 'retrieveCitationCounts': false}) - .then(configuration => { - // fetch current settings - console.debug("exportMode: " + configuration.exportMode); - console.debug("takeSnapshots: " + configuration.takeSnapshots); - console.debug("retrieveCitationCounts: " + configuration.retrieveCitationCounts); - - let items = []; - - if (configuration.retrieveCitationCounts) { - console.log("[scholar-citations] fetching citation counts..."); - - // create zsc compatible items - for (let i = 0; i < data.items.length; i++) { - let item = new ZscItem(data.items[i]); - // add internal metadata - item.setField('_externalRequest', false); // false: triggered from browser; true: triggered from JabRef - item.setStatus(false, true, false, false); // init: no success, item complete (initial assumption), no captcha, not too many requests - items.push(item); - } - - // get citations counts for all items - zsc.processItems(items); - } else { - items = data.items; - } - - this.convertToBibTex(items, configuration.exportMode, configuration.takeSnapshots) - .then((bibtex) => this.sendBibTexToJabRef(bibtex)); - }); - } else if (options === "saveSnapshot") { - // Ignore this - } else { - throw new Error("JabRef: Tried to contact Zotero standalone: " + options); - } - }; - - this.checkIsOnline = Zotero.Promise.method(function() { - var deferred = Zotero.Promise.defer(); - // Pretend that we are connected to Zotero standalone - deferred.resolve(true); - return deferred.promise; - }); - - this.prepareForExport = function(items, takeSnapshots) { - for (var i = 0; i < items.length; i++) { - var item = items[i]; - for (var j = 0; j < item.attachments.length; j++) { - var attachment = item.attachments[j]; - - var isLink = attachment.mimeType === 'text/html' || attachment.mimeType === 'application/xhtml+xml'; - if (isLink && attachment.snapshot !== false) { - // Snapshot - if (takeSnapshots && attachment.url) { - attachment.localPath = attachment.url; - } else { - // Ignore - } - } else { - // Normal file - // Pretend we downloaded the file since otherwise it is not exported - if (attachment.url) { - attachment.localPath = attachment.url; - } - } - } - - // Fix date string - if (item.accessDate) { - item.accessDate = new Date().toISODate(); - } - } - }; - - this.convertToBibTex = function(items, conversionMode, takeSnapshots) { - this.prepareForExport(items, takeSnapshots); - - browser.runtime.sendMessage({ - "onConvertToBibtex": "convertStarted" - }); - - return browser.tabs.query({ - currentWindow: true, - active: true - }).then(tabs => { - for (let tab of tabs) { - return browser.tabs.sendMessage( - tab.id, { - convertToBibTex: items, - conversionMode: conversionMode - } - ); - } - }) - }; - - this.sendBibTexToJabRef = function(bibtex) { - browser.runtime.sendMessage({ - "onSendToJabRef": "sendToJabRefStarted" - }); - console.log("JabRef: Send BibTeX to JabRef: %o", bibtex); - - handleError = function(message, details, stacktrace) { - // Open error page - browser.tabs.create({ - url: "/data/error.html?message=" - + encodeURIComponent(message) - + "&details=" + encodeURIComponent(details ?? "") - + "&stacktrace=" + encodeURIComponent(stacktrace ?? "") - }) - } - - browser.runtime.sendNativeMessage("org.jabref.jabref", { - "text": bibtex - }) - .then(response => { - if (response.message === 'ok') { - console.log("JabRef: Got success response from JabRef with details %o", response.output); - browser.runtime.sendMessage({ - "popupClose": "close" - }); - } else if(response.message === 'error') { - console.error(`JabRef: Error connecting to JabRef: '${response.output}' at '${response.stacktrace}'`); - handleError(response.output, '', response.stacktrace) - } else { - console.error(`JabRef: Error connecting to JabRef: '${response.message}' with details '${response.output}' at '${response.stacktrace}'`); - handleError(response.message, response.output, response.stacktrace) - } - }) - .catch(error => { - console.error(`JabRef: Error connecting to JabRef: ${error}`); - handleError(error.message, '', error.stack) - }); - } -}; diff --git a/data/JabRef-icon-128.png b/data/JabRef-icon-128.png new file mode 100644 index 00000000..84bb13b9 Binary files /dev/null and b/data/JabRef-icon-128.png differ diff --git a/data/JabRef-icon-16.png b/data/JabRef-icon-16.png new file mode 100644 index 00000000..677a3123 Binary files /dev/null and b/data/JabRef-icon-16.png differ diff --git a/data/JabRef-icon-48.png b/data/JabRef-icon-48.png index 82f44c76..7a6159ac 100644 Binary files a/data/JabRef-icon-48.png and b/data/JabRef-icon-48.png differ diff --git a/data/error.html b/data/error.html index 6c2b7d87..8bf9c33d 100644 --- a/data/error.html +++ b/data/error.html @@ -1,9 +1,9 @@ - + - +
Error connecting to JabRef class="flex text-lg items-center md:justify-start justify-center absolute bottom-5" >
-
+

-

+

diff --git a/data/error.js b/data/error.js index 8fb641c6..de7cb287 100644 --- a/data/error.js +++ b/data/error.js @@ -1,21 +1,21 @@ // Get message from query parameter URL -const parameter = new URLSearchParams(window.location.search) -let message = parameter.get('message') -let details = parameter.get('details') -const stacktrace = parameter.get('stacktrace') +const parameter = new URLSearchParams(window.location.search); +let message = parameter.get("message"); +let details = parameter.get("details"); +const stacktrace = parameter.get("stacktrace"); -if (details !== '') { - details = `${details}

` +if (details !== "") { + details = `${details}

`; } -if (stacktrace !== '') { - details = `${details}${stacktrace}

` +if (stacktrace !== "") { + details = `${details}${stacktrace}

`; } -let message_to_user = '' -const referToGithub = `If the error persists, please open an issue on GitHub.` +let message_to_user = ""; +const referToGithub = `If the error persists, please open an issue on GitHub.`; if ( - message === 'An unexpected error occurred' || // Firefox - message === 'Error when communicating with the native messaging host.' // Chrome + message === "An unexpected error occurred" || // Firefox + message === "Error when communicating with the native messaging host." // Chrome ) { // The browser doesn't tell us what the error is // Firefox at least prints it to the browser console prefixed by 'stderr output from native app' @@ -35,20 +35,20 @@ if (
${referToGithub} - ` -} else if (message === 'jarNotFound') { + `; +} else if (message === "jarNotFound") { // This error is thrown by the powershell/python script if the JabRef executable is not found - message = `Could not find JabRef executable` + message = `Could not find JabRef executable`; message_to_user = ` ${details} Please follow the manual installation instructions to make sure your setup is correct. In particular, ensure that the correct file name of the JabRef.bat file is specified in JabRefHost.ps1 under $jabRefExe.

${referToGithub} - ` + `; } else if ( - message === 'Attempt to postMessage on disconnected port' || // Firefox - message === 'Specified native messaging host not found.' // Chrome + message === "Attempt to postMessage on disconnected port" || // Firefox + message === "Specified native messaging host not found." // Chrome ) { // This error is thrown by the browser if the batch script or the jabref-firefox.json is not in the right place // Sadly, we don't get more information than this from the browser @@ -66,10 +66,10 @@ if (
  • The path to jabref-firefox.json or jabref-chrome.json specified in the registry is not correct.

  • ${referToGithub} - ` -} else if (message === 'flatpakPermissionsError') { + `; +} else if (message === "flatpakPermissionsError") { // This error is thrown by the powershell/python script if the JabRef executable is not found - message = `Flatpak is missing the permissions to access the JabRef executable` + message = `Flatpak is missing the permissions to access the JabRef executable`; message_to_user = ` ${details} For flatpak based browsers you have to enable the org.freedesktop.Flatpak permission.
    @@ -85,13 +85,13 @@ if ( to make sure your setup is correct. In particular, verify that the Flatpak permissions are set.

    ${referToGithub} - ` + `; } else { // We have no idea what the error is // Usually, this is caused by some bug in the powershell/python script and the error message is usually helpful - message_to_user = `${details}

    ${referToGithub}` + message_to_user = `${details}

    ${referToGithub}`; } // Set message and details to the corresponding elements -document.getElementById('message').innerHTML = message -document.getElementById('details').innerHTML = message_to_user +document.getElementById("message").innerHTML = message; +document.getElementById("details").innerHTML = message_to_user; diff --git a/data/jabref_settings.png b/data/jabref_settings.png new file mode 100644 index 00000000..f5e6a83b Binary files /dev/null and b/data/jabref_settings.png differ diff --git a/data/options.css b/data/options.css index a08e636a..34506f4f 100644 --- a/data/options.css +++ b/data/options.css @@ -1,62 +1,72 @@ body { - font: message-box; - font-size: 15px; - font-weight: normal; - color: #333; - min-width: 500px; + font: message-box; + font-size: 15px; + font-weight: normal; + color: #333; + min-width: 500px; } label { - cursor: default; - margin-top: 1px; - margin-bottom: 2px; - margin-inline-start: 6px; - margin-inline-end: 5px; - font-weight: 400; + cursor: default; + margin-top: 1px; + margin-bottom: 2px; + margin-inline-start: 6px; + margin-inline-end: 5px; + font-weight: 400; } .grid-container { - display: grid; - grid-template-columns: minmax(15em, 1fr) 2fr; + display: grid; + grid-template-columns: minmax(23em, 1fr) 2fr; + grid-template-areas: + "header header" + "menu content"; } .grid-item { - border-top: 1px solid #d7d7db; - -moz-box-align: center; - min-height: 35px; - line-height: 20px; - text-shadow: 0 1px 1px #fefffe; - padding-top: 6px; - padding-bottom: 7px; + border-top: 1px solid #d7d7db; + -moz-box-align: center; + min-height: 35px; + line-height: 20px; + text-shadow: 0 1px 1px #fefffe; + padding-top: 6px; + padding-bottom: 7px; +} + +.grid-container .grid-header { + grid-area: header; + text-align: center; } input[type="radio"] { vertical-align: middle; - -moz-appearance: none; - width: 20px; - height: 20px; - border: 1px solid #d7d7db; - border-radius: 50%; - margin: 0; - margin-top: -1px; - margin-right: 5px; - background-color: #f1f1f1; - background-image: linear-gradient(#fff, rgba(255, 255, 255, 0.80)); - box-shadow: 0 1px 1px 0 #fff, inset 0 2px 0 0 rgba(0, 0, 0, 0.03); + -moz-appearance: none; + width: 20px; + height: 20px; + border: 1px solid #d7d7db; + border-radius: 50%; + margin: 0; + margin-top: -1px; + margin-right: 5px; + background-color: #f1f1f1; + background-image: linear-gradient(#fff, rgba(255, 255, 255, 0.8)); + box-shadow: + 0 1px 1px 0 #fff, + inset 0 2px 0 0 rgba(0, 0, 0, 0.03); } input[type="radio"]:checked { - background: #2292d0; - border: 5px solid white; - box-shadow: 0 0 0 1px #d7d7db; + background: #2292d0; + border: 5px solid white; + box-shadow: 0 0 0 1px #d7d7db; } input[type="radio"]:hover { - border: 1px solid #2292d0; + border: 1px solid #2292d0; } input[type="radio"]:checked:hover { - background: #2292d0; - border: 5px solid white; - box-shadow: 0 0 0 1px #2292d0; + background: #2292d0; + border: 5px solid white; + box-shadow: 0 0 0 1px #2292d0; } diff --git a/data/options.html b/data/options.html index 18afcd46..06549113 100644 --- a/data/options.html +++ b/data/options.html @@ -1,61 +1,94 @@ - + - - - - + + + JabRef Browser Extension - + - +
    -
    - -
    -
    - Testing connection... -
    +
    + +
    +
    + + + + +
    -
    - -
    -
    - pending... -
    +
    + +
    +
    + + + + +
    -
    - -
    -
    - - - - -
    +
    + +
    +
    + + + + +
    -
    - -
    -
    - - - - -
    +
    + +
    +
    + +
    +
    +
    +
    +

    Connection Status

    +
    +
    + +
    +
    + Testing connection... +
    -
    - -
    -
    - - - - -
    +
    + +
    +
    + Testing connection... +
    - - + diff --git a/data/options.js b/data/options.js index f3bdae8e..5cdcd4f5 100644 --- a/data/options.js +++ b/data/options.js @@ -1,115 +1,155 @@ var ExportMode = Object.freeze({ - BibLaTeX: "biblatex", - BibTeX: "bibtex" + BibLaTeX: "biblatex", + BibTeX: "bibtex", }); -function checkConnections() { - let status = document.getElementById('connectionStatus'); - browser.runtime.sendNativeMessage("org.jabref.jabref", { - "status": "validate" - }) - .then(response => { - if (response.message === 'jarNotFound') { - status.setAttribute('class', 'alert-error'); - status.textContent = 'Unable to locate JabRef at:
    ' + response.path; - } else if (response.message === 'jarFound') { - status.setAttribute('class', 'alert-positive'); - status.textContent = 'Communication to JabRef successful!'; - } else { - status.setAttribute('class', 'alert-error'); - status.innerHTML = 'Unexpected response:
    ' + response.message; - } - }) - .catch(error => { - status.setAttribute('class', 'alert-error'); - status.textContent = error.message; - }); +const DEFAULT_PORT = 23119; - let wsClientStatus = document.getElementById('wsClientStatus'); - browser.runtime.sendMessage({ - "getWsClientState": true - }).then(response => { - if (response.clientStarted) { - switch (response.connectionState) { - case WebSocket.CONNECTING: - wsClientStatus.setAttribute('class', 'alert-positive'); - wsClientStatus.textContent = 'connecting'; - break; - case WebSocket.OPEN: - wsClientStatus.setAttribute('class', 'alert-positive'); - wsClientStatus.textContent = 'connected'; - break; - case WebSocket.CLOSING: - wsClientStatus.setAttribute('class', 'alert-error'); - wsClientStatus.textContent = 'closing'; - break; - case WebSocket.CLOSED: - wsClientStatus.setAttribute('class', 'alert-error'); - wsClientStatus.textContent = 'closed'; - break; - default: - wsClientStatus.setAttribute('class', 'alert-error'); - wsClientStatus.textContent = 'n/a'; - } - } else { - wsClientStatus.setAttribute('class', 'alert-error'); - wsClientStatus.textContent = 'Websocket client not started'; - } - }); +async function connectToJabRef(port) { + base = `http://localhost:${port}/`; + try { + // Try a simple GET to the base URL to detect availability. + const response = await fetch(base, { method: "GET", cache: "no-store" }); + if (response && (response.ok || response.status === 404)) { + return { success: true }; + } else { + return { success: false, status: response.status }; + } + } catch (error) { + return { success: false, error: error }; + } } -function restoreOptions() { - browser.storage.sync.get({'exportMode': ExportMode.BibTeX, 'takeSnapshots': false, 'retrieveCitationCounts': false}) - .then(res => { - console.log("exportMode = " + res.exportMode); - console.log("takeSnapshots = " + res.takeSnapshots); - console.log("retrieveCitationCounts = " + res.retrieveCitationCounts); - if (res.exportMode === ExportMode.BibLaTeX) { - document.getElementById("exportBiblatex").checked = true; - } else { - document.getElementById("exportBibtex").checked = true; - } - if (res.takeSnapshots) { - document.getElementById("snapshotsOn").checked = true; - } else { - document.getElementById("snapshotsOff").checked = true; - } - if (res.retrieveCitationCounts) { - document.getElementById("retrieveCitationCountsOn").checked = true; - } else { - document.getElementById("retrieveCitationCountsOff").checked = true; - } - }); +function checkConnections({ httpPort }) { + let status = document.getElementById("connectionStatusNative"); + browser.runtime + .sendNativeMessage("org.jabref.jabref", { + status: "validate", + }) + .then((response) => { + if (response.message === "jarNotFound") { + status.setAttribute("class", "alert-error"); + status.textContent = "Unable to locate JabRef at:
    " + response.path; + } else if (response.message === "jarFound") { + status.setAttribute("class", "alert-positive"); + status.textContent = "Communication to JabRef successful!"; + } else { + status.setAttribute("class", "alert-error"); + status.innerHTML = "Unexpected response:
    " + response.message; + } + }) + .catch((error) => { + status.setAttribute("class", "alert-error"); + status.textContent = error.message; + }); + + let httpStatus = document.getElementById("connectionStatusHttp"); + httpStatus.textContent = `Testing connection on port ${httpPort}...`; + connectToJabRef(httpPort).then((result) => { + if (result.success) { + httpStatus.setAttribute("class", "alert-positive"); + httpStatus.textContent = `JabRef reachable on port ${httpPort}`; + } else { + httpStatus.setAttribute("class", "alert-error"); + if (result.status) { + httpStatus.textContent = `Errors with status code "${result.status}"`; + } else if (result.error) { + httpStatus.textContent = `Connection error: ${result.error.message}`; + if ( + result.error instanceof TypeError && + (result.error.message.includes("Failed to fetch") || + result.error.message.includes("NetworkError")) + ) { + httpStatus.textContent += `\nConnection to port ${httpPort} failed. Is JabRef running and configured to accept HTTP connections on this port?`; + } + } else { + httpStatus.textContent = `Connection to port ${httpPort} failed for unknown reasons.`; + } + } + }); +} + +async function restoreOptions() { + const options = await browser.storage.sync.get({ + exportMode: ExportMode.BibTeX, + takeSnapshots: false, + retrieveCitationCounts: false, + httpPort: DEFAULT_PORT, + }); + + console.log("exportMode = " + options.exportMode); + console.log("takeSnapshots = " + options.takeSnapshots); + console.log("retrieveCitationCounts = " + options.retrieveCitationCounts); + console.log("httpPort = " + options.httpPort); + if (options.exportMode === ExportMode.BibLaTeX) { + document.getElementById("exportBiblatex").checked = true; + } else { + document.getElementById("exportBibtex").checked = true; + } + if (options.takeSnapshots) { + document.getElementById("snapshotsOn").checked = true; + } else { + document.getElementById("snapshotsOff").checked = true; + } + if (options.retrieveCitationCounts) { + document.getElementById("retrieveCitationCountsOn").checked = true; + } else { + document.getElementById("retrieveCitationCountsOff").checked = true; + } + + document.getElementById("portInput").value = options.httpPort; + return options; } function saveOptions() { - let exportMode; - if (document.getElementById("exportBiblatex").checked) { - exportMode = ExportMode.BibLaTeX; - } else { - exportMode = ExportMode.BibTeX; - } - var takeSnapshots = document.getElementById("snapshotsOn").checked; - var retrieveCitationCounts = document.getElementById("retrieveCitationCountsOn").checked; - browser.storage.sync.set({ - exportMode: exportMode, - takeSnapshots: takeSnapshots, - retrieveCitationCounts: retrieveCitationCounts - }); + let exportMode; + if (document.getElementById("exportBiblatex").checked) { + exportMode = ExportMode.BibLaTeX; + } else { + exportMode = ExportMode.BibTeX; + } + var takeSnapshots = document.getElementById("snapshotsOn").checked; + var retrieveCitationCounts = document.getElementById("retrieveCitationCountsOn").checked; + var port = document.getElementById("portInput").value; + const options = { + exportMode: exportMode, + takeSnapshots: takeSnapshots, + retrieveCitationCounts: retrieveCitationCounts, + httpPort: port, + }; + browser.storage.sync.set(options); + return options; } -function init() { - restoreOptions(); - checkConnections(); +async function init() { + const options = await restoreOptions(); + checkConnections(options); + + document.getElementById("exportBiblatex").addEventListener("change", () => saveOptions()); + document.getElementById("exportBibtex").addEventListener("change", () => saveOptions()); - document.getElementById("exportBiblatex").addEventListener('change', () => saveOptions()); - document.getElementById("exportBibtex").addEventListener('change', () => saveOptions()); + document.getElementById("snapshotsOn").addEventListener("change", () => saveOptions()); + document.getElementById("snapshotsOff").addEventListener("change", () => saveOptions()); - document.getElementById("snapshotsOn").addEventListener('change', () => saveOptions()); - document.getElementById("snapshotsOff").addEventListener('change', () => saveOptions()); + document + .getElementById("retrieveCitationCountsOn") + .addEventListener("change", () => saveOptions()); + document + .getElementById("retrieveCitationCountsOff") + .addEventListener("change", () => saveOptions()); - document.getElementById("retrieveCitationCountsOn").addEventListener('change', () => saveOptions()); - document.getElementById("retrieveCitationCountsOff").addEventListener('change', () => saveOptions()); + const portInput = document.getElementById("portInput"); + const portChanged = () => { + const options = saveOptions(); + checkConnections(options); + }; + portInput.addEventListener("change", () => portChanged()); + portInput.addEventListener("blur", () => portChanged()); + portInput.addEventListener("keydown", (event) => { + if (event.key === "Enter") { + portChanged(); + } + }); } -document.addEventListener('DOMContentLoaded', init); +document.addEventListener("DOMContentLoaded", init); diff --git a/data/progressPanel.css b/data/progressPanel.css index aeb0a831..2d2d85ac 100644 --- a/data/progressPanel.css +++ b/data/progressPanel.css @@ -1,20 +1,20 @@ body { margin: 0; padding: 10px; - min-width: 260px; + min-width: 420px; } ul { - padding:0; + padding: 0; display: inline-block; } li { - padding:0.15em 0 0.5em 1.5em; - margin-bottom:0.2em; - font-weight:bold; - list-style:none; - background-repeat:no-repeat; - background-position: .0em .3em; + padding: 0.15em 0 0.5em 1.5em; + margin-bottom: 0.2em; + font-weight: bold; + list-style: none; + background-repeat: no-repeat; + background-position: 0em 0.3em; background-image: url(JabRef-icon-16.png); list-style-position: inside; } @@ -25,36 +25,51 @@ ul.attachmentList { ul.attachmentList li { padding-top: 0px; padding-bottom: 0px; - text-indent:0em; - font-weight:normal; + text-indent: 0em; + font-weight: normal; background-size: 8px 8px; - background-position: .55em .4em; + background-position: 0.55em 0.4em; background-image: url(JabRef-icon-16-gray.png); } li.inprogress:after { - background-image: url('spin.gif'); + background-image: url("spin.gif"); background-size: 14px 14px; display: inline-block; - width: 14px; + width: 14px; height: 14px; - content:""; -} -#citationCount { - display: none; - font-size: small; -} -#itemIncomplete { - display: none; - color: red; - font-size: small; -} -#googleScholarCaptcha { - display: none; - color: red; - font-size: small; -} -#tooManyRequests { - display: none; - color: red; - font-size: small; + content: ""; +} +#progressStatus { + margin: 0 0 0.5em 0; +} + +h1 { + font-size: 16px; + margin: 0 0 8px 0; +} + +.connection-section p { + margin: 3px 0px; +} + +.status-disconnected { + color: #b00; +} +.status-connected { + color: #080; +} + +.log-box { + max-height: 240px; + overflow: auto; + background: #f7f7f7; + padding: 8px; + border-radius: 4px; + font-family: monospace; + font-size: 12px; +} + +.log-line { + margin: 6px 0; + white-space: pre-wrap; } diff --git a/data/progressPanel.html b/data/progressPanel.html index a712b11f..00cd7032 100644 --- a/data/progressPanel.html +++ b/data/progressPanel.html @@ -1,20 +1,15 @@ - + - - + + +

    Searching for bibliographic data...

    - +
    + Logs +
    +
    diff --git a/data/progressPanel.js b/data/progressPanel.js index ced7cb20..2f800a50 100644 --- a/data/progressPanel.js +++ b/data/progressPanel.js @@ -1,35 +1,21 @@ -var mainList = document.getElementById("itemList"); -var status = document.getElementById("status"); +// Provide a minimal compatibility shim: if `browser` is missing, alias it to `chrome`. +if (typeof browser === "undefined" && typeof chrome !== "undefined") { + globalThis.browser = chrome; +} -window.addEventListener("load", function load(event) { - window.removeEventListener("load", load, false); // Remove listener, invoke only once - browser.runtime.sendMessage({ - "popupOpened": "opened" - }); - - console.log("JabRef: Popup opened") -}, false); - -browser.runtime.onMessage.addListener(function(message, sender, sendResponse) { - if (message.popupClose) { - // The popup should be closed - setTimeout(function() { window.close(); }, 3000); - console.log("JabRef: Popup closed"); - } else if (message.onCitationCount) { - document.getElementById("citationCountNumber").innerHTML = '' + message.onCitationCount; - document.getElementById("citationCount").style.display = "block"; - } else if (message.itemIncomplete) { - document.getElementById("itemIncomplete").style.display = "block"; - } else if (message.onGoogleScholarCaptcha) { - document.getElementById("googleScholarCaptchaLink").href = message.onGoogleScholarCaptcha; - document.getElementById("googleScholarCaptcha").style.display = "block"; - } else if (message.tooManyRequests) { - document.getElementById("tooManyRequests").style.display = "block"; - } else if (message.onConvertToBibtex) { - document.getElementById("status").innerHTML = 'Converting to BibTeX...'; - } else if (message.onSendToJabRef) { - document.getElementById("status").innerHTML = 'Sending to JabRef...'; - } +browser.runtime.onMessage.addListener(function (message, _sender, _sendResponse) { + console.debug("JabRef: Received message in popup:", message); + if (message.popupClose) { + // The popup should be closed + setTimeout(function () { + window.close(); + }, 3000); + console.log("JabRef: Popup closed"); + } else if (message.onConvertToBibtex) { + document.getElementById("status").innerHTML = "Converting to BibTeX..."; + } else if (message.onSendToJabRef) { + document.getElementById("status").innerHTML = "Sending to JabRef..."; + } }); /* @@ -85,3 +71,46 @@ addon.port.on("updateProgress", function onUpdateProgress(item) { attachmentListItem.className = ""; // Remove inprogress }); */ + +async function onPopupOpened() { + try { + appendLog("Popup opened, starting translator run", "info"); + const resp = await browser.runtime.sendMessage({ type: "popupOpened" }); + if (resp && resp.ok) appendLog("Background acknowledged request", "info"); + else appendLog(`Background error: ${resp && resp.error ? resp.error : "unknown"}`, "error"); + } catch (e) { + console.error("Failed to send popupOpened message", e); + } +} + +function appendLog(text) { + const log = document.getElementById("log"); + if (!log) return; + const d = document.createElement("div"); + d.className = "log-line"; + // Convert URLs in the text into clickable links + // Split the text keeping URLs (captures https?://...) + const parts = text.split(/(https?:\/\/(docs.jabref.org|github.com)[^\s]+)/); + for (const part of parts) { + if (!part) continue; + if (part.startsWith("http://") || part.startsWith("https://")) { + const a = document.createElement("a"); + a.href = part; + a.textContent = part; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + d.appendChild(a); + } else { + d.appendChild(document.createTextNode(part)); + } + } + log.appendChild(d); + log.scrollTop = log.scrollHeight; +} + +document.addEventListener("DOMContentLoaded", async () => { + console.log("JabRef: Popup opened"); + + // Run translators for the active tab + onPopupOpened(); +}); diff --git a/data/tailwind.js b/data/tailwind.js new file mode 100644 index 00000000..64019ccd --- /dev/null +++ b/data/tailwind.js @@ -0,0 +1,11868 @@ +"use strict"; +(() => { + var Jt = "4.1.18"; + function Ge(e) { + let r = [0]; + for (let n = 0; n < e.length; n++) e.charCodeAt(n) === 10 && r.push(n + 1); + function i(n) { + let s = 0, + a = r.length; + for (; a > 0; ) { + let c = (a | 0) >> 1, + u = s + c; + r[u] <= n ? ((s = u + 1), (a = a - c - 1)) : (a = c); + } + s -= 1; + let m = n - r[s]; + return { line: s + 1, column: m }; + } + function t({ line: n, column: s }) { + ((n -= 1), (n = Math.min(Math.max(n, 0), r.length - 1))); + let a = r[n], + m = r[n + 1] ?? a; + return Math.min(Math.max(a + s, 0), m); + } + return { find: i, findOffset: t }; + } + var _e = 92, + Ye = 47, + Ze = 42, + Qt = 34, + Xt = 39, + Li = 58, + Je = 59, + ae = 10, + Qe = 13, + Ue = 32, + De = 9, + er = 123, + At = 125, + $t = 40, + tr = 41, + ji = 91, + Ii = 93, + rr = 45, + Ct = 64, + Fi = 33, + se = class e extends Error { + loc; + constructor(r, i) { + if (i) { + let t = i[0], + n = Ge(t.code).find(i[1]); + r = `${t.file}:${n.line}:${n.column + 1}: ${r}`; + } + (super(r), + (this.name = "CssSyntaxError"), + (this.loc = i), + Error.captureStackTrace && Error.captureStackTrace(this, e)); + } + }; + function Se(e, r) { + let i = r?.from ? { file: r.from, code: e } : null; + e[0] === "\uFEFF" && (e = " " + e.slice(1)); + let t = [], + n = [], + s = [], + a = null, + m = null, + c = "", + u = "", + h = 0, + d; + for (let f = 0; f < e.length; f++) { + let v = e.charCodeAt(f); + if (!(v === Qe && ((d = e.charCodeAt(f + 1)), d === ae))) + if (v === _e) (c === "" && (h = f), (c += e.slice(f, f + 2)), (f += 1)); + else if (v === Ye && e.charCodeAt(f + 1) === Ze) { + let k = f; + for (let x = f + 2; x < e.length; x++) + if (((d = e.charCodeAt(x)), d === _e)) x += 1; + else if (d === Ze && e.charCodeAt(x + 1) === Ye) { + f = x + 1; + break; + } + let w = e.slice(k, f + 1); + if (w.charCodeAt(2) === Fi) { + let x = Xe(w.slice(2, -2)); + (n.push(x), i && ((x.src = [i, k, f + 1]), (x.dst = [i, k, f + 1]))); + } + } else if (v === Xt || v === Qt) { + let k = ir(e, f, v, i); + ((c += e.slice(f, k + 1)), (f = k)); + } else { + if ( + (v === Ue || v === ae || v === De) && + (d = e.charCodeAt(f + 1)) && + (d === Ue || d === ae || d === De || (d === Qe && (d = e.charCodeAt(f + 2)) && d == ae)) + ) + continue; + if (v === ae) { + if (c.length === 0) continue; + ((d = c.charCodeAt(c.length - 1)), d !== Ue && d !== ae && d !== De && (c += " ")); + } else if (v === rr && e.charCodeAt(f + 1) === rr && c.length === 0) { + let k = "", + w = f, + x = -1; + for (let C = f + 2; C < e.length; C++) + if (((d = e.charCodeAt(C)), d === _e)) C += 1; + else if (d === Xt || d === Qt) C = ir(e, C, d, i); + else if (d === Ye && e.charCodeAt(C + 1) === Ze) { + for (let y = C + 2; y < e.length; y++) + if (((d = e.charCodeAt(y)), d === _e)) y += 1; + else if (d === Ze && e.charCodeAt(y + 1) === Ye) { + C = y + 1; + break; + } + } else if (x === -1 && d === Li) x = c.length + C - w; + else if (d === Je && k.length === 0) { + ((c += e.slice(w, C)), (f = C)); + break; + } else if (d === $t) k += ")"; + else if (d === ji) k += "]"; + else if (d === er) k += "}"; + else if ((d === At || e.length - 1 === C) && k.length === 0) { + ((f = C - 1), (c += e.slice(w, C))); + break; + } else + (d === tr || d === Ii || d === At) && + k.length > 0 && + e[C] === k[k.length - 1] && + (k = k.slice(0, -1)); + let V = Tt(c, x); + if (!V) throw new se("Invalid custom property, expected a value", i ? [i, w, f] : null); + (i && ((V.src = [i, w, f]), (V.dst = [i, w, f])), + a ? a.nodes.push(V) : t.push(V), + (c = "")); + } else if (v === Je && c.charCodeAt(0) === Ct) + ((m = ze(c)), + i && ((m.src = [i, h, f]), (m.dst = [i, h, f])), + a ? a.nodes.push(m) : t.push(m), + (c = ""), + (m = null)); + else if (v === Je && u[u.length - 1] !== ")") { + let k = Tt(c); + if (!k) { + if (c.length === 0) continue; + throw new se(`Invalid declaration: \`${c.trim()}\``, i ? [i, h, f] : null); + } + (i && ((k.src = [i, h, f]), (k.dst = [i, h, f])), + a ? a.nodes.push(k) : t.push(k), + (c = "")); + } else if (v === er && u[u.length - 1] !== ")") + ((u += "}"), + (m = Y(c.trim())), + i && ((m.src = [i, h, f]), (m.dst = [i, h, f])), + a && a.nodes.push(m), + s.push(a), + (a = m), + (c = ""), + (m = null)); + else if (v === At && u[u.length - 1] !== ")") { + if (u === "") throw new se("Missing opening {", i ? [i, f, f] : null); + if (((u = u.slice(0, -1)), c.length > 0)) + if (c.charCodeAt(0) === Ct) + ((m = ze(c)), + i && ((m.src = [i, h, f]), (m.dst = [i, h, f])), + a ? a.nodes.push(m) : t.push(m), + (c = ""), + (m = null)); + else { + let w = c.indexOf(":"); + if (a) { + let x = Tt(c, w); + if (!x) + throw new se(`Invalid declaration: \`${c.trim()}\``, i ? [i, h, f] : null); + (i && ((x.src = [i, h, f]), (x.dst = [i, h, f])), a.nodes.push(x)); + } + } + let k = s.pop() ?? null; + (k === null && a && t.push(a), (a = k), (c = ""), (m = null)); + } else if (v === $t) ((u += ")"), (c += "(")); + else if (v === tr) { + if (u[u.length - 1] !== ")") throw new se("Missing opening (", i ? [i, f, f] : null); + ((u = u.slice(0, -1)), (c += ")")); + } else { + if (c.length === 0 && (v === Ue || v === ae || v === De)) continue; + (c === "" && (h = f), (c += String.fromCharCode(v))); + } + } + } + if (c.charCodeAt(0) === Ct) { + let f = ze(c); + (i && ((f.src = [i, h, e.length]), (f.dst = [i, h, e.length])), t.push(f)); + } + if (u.length > 0 && a) { + if (a.kind === "rule") + throw new se( + `Missing closing } at ${a.selector}`, + a.src ? [a.src[0], a.src[1], a.src[1]] : null, + ); + if (a.kind === "at-rule") + throw new se( + `Missing closing } at ${a.name} ${a.params}`, + a.src ? [a.src[0], a.src[1], a.src[1]] : null, + ); + } + return n.length > 0 ? n.concat(t) : t; + } + function ze(e, r = []) { + let i = e, + t = ""; + for (let n = 5; n < e.length; n++) { + let s = e.charCodeAt(n); + if (s === Ue || s === De || s === $t) { + ((i = e.slice(0, n)), (t = e.slice(n))); + break; + } + } + return M(i.trim(), t.trim(), r); + } + function Tt(e, r = e.indexOf(":")) { + if (r === -1) return null; + let i = e.indexOf("!important", r + 1); + return o(e.slice(0, r).trim(), e.slice(r + 1, i === -1 ? e.length : i).trim(), i !== -1); + } + function ir(e, r, i, t = null) { + let n; + for (let s = r + 1; s < e.length; s++) + if (((n = e.charCodeAt(s)), n === _e)) s += 1; + else { + if (n === i) return s; + if ( + n === Je && + (e.charCodeAt(s + 1) === ae || (e.charCodeAt(s + 1) === Qe && e.charCodeAt(s + 2) === ae)) + ) + throw new se( + `Unterminated string: ${e.slice(r, s + 1) + String.fromCharCode(i)}`, + t ? [t, r, s + 1] : null, + ); + if (n === ae || (n === Qe && e.charCodeAt(s + 1) === ae)) + throw new se( + `Unterminated string: ${e.slice(r, s) + String.fromCharCode(i)}`, + t ? [t, r, s + 1] : null, + ); + } + return r; + } + function ge(e) { + if (arguments.length === 0) throw new TypeError("`CSS.escape` requires an argument."); + let r = String(e), + i = r.length, + t = -1, + n, + s = "", + a = r.charCodeAt(0); + if (i === 1 && a === 45) return "\\" + r; + for (; ++t < i; ) { + if (((n = r.charCodeAt(t)), n === 0)) { + s += "\uFFFD"; + continue; + } + if ( + (n >= 1 && n <= 31) || + n === 127 || + (t === 0 && n >= 48 && n <= 57) || + (t === 1 && n >= 48 && n <= 57 && a === 45) + ) { + s += "\\" + n.toString(16) + " "; + continue; + } + if ( + n >= 128 || + n === 45 || + n === 95 || + (n >= 48 && n <= 57) || + (n >= 65 && n <= 90) || + (n >= 97 && n <= 122) + ) { + s += r.charAt(t); + continue; + } + s += "\\" + r.charAt(t); + } + return s; + } + function ye(e) { + return e.replace(/\\([\dA-Fa-f]{1,6}[\t\n\f\r ]?|[\S\s])/g, (r) => + r.length > 2 ? String.fromCodePoint(Number.parseInt(r.slice(1).trim(), 16)) : r[1], + ); + } + var nr = new Map([ + ["--font", ["--font-weight", "--font-size"]], + ["--inset", ["--inset-shadow", "--inset-ring"]], + [ + "--text", + [ + "--text-color", + "--text-decoration-color", + "--text-decoration-thickness", + "--text-indent", + "--text-shadow", + "--text-underline-offset", + ], + ], + ["--grid-column", ["--grid-column-start", "--grid-column-end"]], + ["--grid-row", ["--grid-row-start", "--grid-row-end"]], + ]); + function or(e, r) { + return (nr.get(r) ?? []).some((i) => e === i || e.startsWith(`${i}-`)); + } + var et = class { + constructor(r = new Map(), i = new Set([])) { + this.values = r; + this.keyframes = i; + } + prefix = null; + get size() { + return this.values.size; + } + add(r, i, t = 0, n) { + if (r.endsWith("-*")) { + if (i !== "initial") throw new Error(`Invalid theme value \`${i}\` for namespace \`${r}\``); + r === "--*" ? this.values.clear() : this.clearNamespace(r.slice(0, -2), 0); + } + if (t & 4) { + let s = this.values.get(r); + if (s && !(s.options & 4)) return; + } + i === "initial" + ? this.values.delete(r) + : this.values.set(r, { value: i, options: t, src: n }); + } + keysInNamespaces(r) { + let i = []; + for (let t of r) { + let n = `${t}-`; + for (let s of this.values.keys()) + s.startsWith(n) && s.indexOf("--", 2) === -1 && (or(s, t) || i.push(s.slice(n.length))); + } + return i; + } + get(r) { + for (let i of r) { + let t = this.values.get(i); + if (t) return t.value; + } + return null; + } + hasDefault(r) { + return (this.getOptions(r) & 4) === 4; + } + getOptions(r) { + return ((r = ye(this.#r(r))), this.values.get(r)?.options ?? 0); + } + entries() { + return this.prefix + ? Array.from(this.values, (r) => ((r[0] = this.prefixKey(r[0])), r)) + : this.values.entries(); + } + prefixKey(r) { + return this.prefix ? `--${this.prefix}-${r.slice(2)}` : r; + } + #r(r) { + return this.prefix ? `--${r.slice(3 + this.prefix.length)}` : r; + } + clearNamespace(r, i) { + let t = nr.get(r) ?? []; + e: for (let n of this.values.keys()) + if (n.startsWith(r)) { + if (i !== 0 && (this.getOptions(n) & i) !== i) continue; + for (let s of t) if (n.startsWith(s)) continue e; + this.values.delete(n); + } + } + #e(r, i) { + for (let t of i) { + let n = r !== null ? `${t}-${r}` : t; + if (!this.values.has(n)) + if (r !== null && r.includes(".")) { + if (((n = `${t}-${r.replaceAll(".", "_")}`), !this.values.has(n))) continue; + } else continue; + if (!or(n, t)) return n; + } + return null; + } + #t(r) { + let i = this.values.get(r); + if (!i) return null; + let t = null; + return (i.options & 2 && (t = i.value), `var(${ge(this.prefixKey(r))}${t ? `, ${t}` : ""})`); + } + markUsedVariable(r) { + let i = ye(this.#r(r)), + t = this.values.get(i); + if (!t) return !1; + let n = t.options & 16; + return ((t.options |= 16), !n); + } + resolve(r, i, t = 0) { + let n = this.#e(r, i); + if (!n) return null; + let s = this.values.get(n); + return (t | s.options) & 1 ? s.value : this.#t(n); + } + resolveValue(r, i) { + let t = this.#e(r, i); + return t ? this.values.get(t).value : null; + } + resolveWith(r, i, t = []) { + let n = this.#e(r, i); + if (!n) return null; + let s = {}; + for (let m of t) { + let c = `${n}${m}`, + u = this.values.get(c); + u && (u.options & 1 ? (s[m] = u.value) : (s[m] = this.#t(c))); + } + let a = this.values.get(n); + return a.options & 1 ? [a.value, s] : [this.#t(n), s]; + } + namespace(r) { + let i = new Map(), + t = `${r}-`; + for (let [n, s] of this.values) + n === r + ? i.set(null, s.value) + : n.startsWith(`${t}-`) + ? i.set(n.slice(r.length), s.value) + : n.startsWith(t) && i.set(n.slice(t.length), s.value); + return i; + } + addKeyframes(r) { + this.keyframes.add(r); + } + getKeyframes() { + return Array.from(this.keyframes); + } + }; + var H = class extends Map { + constructor(i) { + super(); + this.factory = i; + } + get(i) { + let t = super.get(i); + return (t === void 0 && ((t = this.factory(i, this)), this.set(i, t)), t); + } + }; + function Ke(e) { + return { kind: "word", value: e }; + } + function Mi(e, r) { + return { kind: "function", value: e, nodes: r }; + } + function Wi(e) { + return { kind: "separator", value: e }; + } + function J(e) { + let r = ""; + for (let i of e) + switch (i.kind) { + case "word": + case "separator": { + r += i.value; + break; + } + case "function": + r += i.value + "(" + J(i.nodes) + ")"; + } + return r; + } + var lr = 92, + Bi = 41, + ar = 58, + sr = 44, + qi = 34, + ur = 61, + cr = 62, + fr = 60, + pr = 10, + Hi = 40, + Gi = 39, + Yi = 47, + dr = 32, + mr = 9; + function G(e) { + e = e.replaceAll( + `\r +`, + ` +`, + ); + let r = [], + i = [], + t = null, + n = "", + s; + for (let a = 0; a < e.length; a++) { + let m = e.charCodeAt(a); + switch (m) { + case lr: { + ((n += e[a] + e[a + 1]), a++); + break; + } + case Yi: { + if (n.length > 0) { + let u = Ke(n); + (t ? t.nodes.push(u) : r.push(u), (n = "")); + } + let c = Ke(e[a]); + t ? t.nodes.push(c) : r.push(c); + break; + } + case ar: + case sr: + case ur: + case cr: + case fr: + case pr: + case dr: + case mr: { + if (n.length > 0) { + let d = Ke(n); + (t ? t.nodes.push(d) : r.push(d), (n = "")); + } + let c = a, + u = a + 1; + for ( + ; + u < e.length && + ((s = e.charCodeAt(u)), + !( + s !== ar && + s !== sr && + s !== ur && + s !== cr && + s !== fr && + s !== pr && + s !== dr && + s !== mr + )); + u++ + ); + a = u - 1; + let h = Wi(e.slice(c, u)); + t ? t.nodes.push(h) : r.push(h); + break; + } + case Gi: + case qi: { + let c = a; + for (let u = a + 1; u < e.length; u++) + if (((s = e.charCodeAt(u)), s === lr)) u += 1; + else if (s === m) { + a = u; + break; + } + n += e.slice(c, a + 1); + break; + } + case Hi: { + let c = Mi(n, []); + ((n = ""), t ? t.nodes.push(c) : r.push(c), i.push(c), (t = c)); + break; + } + case Bi: { + let c = i.pop(); + if (n.length > 0) { + let u = Ke(n); + (c?.nodes.push(u), (n = "")); + } + i.length > 0 ? (t = i[i.length - 1]) : (t = null); + break; + } + default: + n += String.fromCharCode(m); + } + } + return (n.length > 0 && r.push(Ke(n)), r); + } + var St = ((a) => ( + (a[(a.Continue = 0)] = "Continue"), + (a[(a.Skip = 1)] = "Skip"), + (a[(a.Stop = 2)] = "Stop"), + (a[(a.Replace = 3)] = "Replace"), + (a[(a.ReplaceSkip = 4)] = "ReplaceSkip"), + (a[(a.ReplaceStop = 5)] = "ReplaceStop"), + a + ))(St || {}), + O = { + Continue: { kind: 0 }, + Skip: { kind: 1 }, + Stop: { kind: 2 }, + Replace: (e) => ({ kind: 3, nodes: Array.isArray(e) ? e : [e] }), + ReplaceSkip: (e) => ({ kind: 4, nodes: Array.isArray(e) ? e : [e] }), + ReplaceStop: (e) => ({ kind: 5, nodes: Array.isArray(e) ? e : [e] }), + }; + function D(e, r) { + typeof r == "function" ? hr(e, r) : hr(e, r.enter, r.exit); + } + function hr(e, r = () => O.Continue, i = () => O.Continue) { + let t = [[e, 0, null]], + n = { + parent: null, + depth: 0, + path() { + let s = []; + for (let a = 1; a < t.length; a++) { + let m = t[a][2]; + m && s.push(m); + } + return s; + }, + }; + for (; t.length > 0; ) { + let s = t.length - 1, + a = t[s], + m = a[0], + c = a[1], + u = a[2]; + if (c >= m.length) { + t.pop(); + continue; + } + if (((n.parent = u), (n.depth = s), c >= 0)) { + let v = m[c], + k = r(v, n) ?? O.Continue; + switch (k.kind) { + case 0: { + (v.nodes && v.nodes.length > 0 && t.push([v.nodes, 0, v]), (a[1] = ~c)); + continue; + } + case 2: + return; + case 1: { + a[1] = ~c; + continue; + } + case 3: { + m.splice(c, 1, ...k.nodes); + continue; + } + case 5: { + m.splice(c, 1, ...k.nodes); + return; + } + case 4: { + (m.splice(c, 1, ...k.nodes), (a[1] += k.nodes.length)); + continue; + } + default: + throw new Error( + `Invalid \`WalkAction.${St[k.kind] ?? `Unknown(${k.kind})`}\` in enter.`, + ); + } + } + let h = ~c, + d = m[h], + f = i(d, n) ?? O.Continue; + switch (f.kind) { + case 0: + a[1] = h + 1; + continue; + case 2: + return; + case 3: { + (m.splice(h, 1, ...f.nodes), (a[1] = h + f.nodes.length)); + continue; + } + case 5: { + m.splice(h, 1, ...f.nodes); + return; + } + case 4: { + (m.splice(h, 1, ...f.nodes), (a[1] = h + f.nodes.length)); + continue; + } + default: + throw new Error(`Invalid \`WalkAction.${St[f.kind] ?? `Unknown(${f.kind})`}\` in exit.`); + } + } + } + function tt(e) { + let r = []; + return ( + D(G(e), (i) => { + if (!(i.kind !== "function" || i.value !== "var")) + return ( + D(i.nodes, (t) => { + t.kind !== "word" || t.value[0] !== "-" || t.value[1] !== "-" || r.push(t.value); + }), + O.Skip + ); + }), + r + ); + } + var Zi = 64; + function q(e, r = []) { + return { kind: "rule", selector: e, nodes: r }; + } + function M(e, r = "", i = []) { + return { kind: "at-rule", name: e, params: r, nodes: i }; + } + function Y(e, r = []) { + return e.charCodeAt(0) === Zi ? ze(e, r) : q(e, r); + } + function o(e, r, i = !1) { + return { kind: "declaration", property: e, value: r, important: i }; + } + function Xe(e) { + return { kind: "comment", value: e }; + } + function fe(e, r) { + return { kind: "context", context: e, nodes: r }; + } + function F(e) { + return { kind: "at-root", nodes: e }; + } + function re(e) { + switch (e.kind) { + case "rule": + return { + kind: e.kind, + selector: e.selector, + nodes: e.nodes.map(re), + src: e.src, + dst: e.dst, + }; + case "at-rule": + return { + kind: e.kind, + name: e.name, + params: e.params, + nodes: e.nodes.map(re), + src: e.src, + dst: e.dst, + }; + case "at-root": + return { kind: e.kind, nodes: e.nodes.map(re), src: e.src, dst: e.dst }; + case "context": + return { + kind: e.kind, + context: { ...e.context }, + nodes: e.nodes.map(re), + src: e.src, + dst: e.dst, + }; + case "declaration": + return { + kind: e.kind, + property: e.property, + value: e.value, + important: e.important, + src: e.src, + dst: e.dst, + }; + case "comment": + return { kind: e.kind, value: e.value, src: e.src, dst: e.dst }; + default: + throw new Error(`Unknown node kind: ${e.kind}`); + } + } + function Le(e) { + return { + depth: e.depth, + get context() { + let r = {}; + for (let i of e.path()) i.kind === "context" && Object.assign(r, i.context); + return (Object.defineProperty(this, "context", { value: r }), r); + }, + get parent() { + let r = this.path().pop() ?? null; + return (Object.defineProperty(this, "parent", { value: r }), r); + }, + path() { + return e.path().filter((r) => r.kind !== "context"); + }, + }; + } + function Ae(e, r, i = 3) { + let t = [], + n = new Set(), + s = new H(() => new Set()), + a = new H(() => new Set()), + m = new Set(), + c = new Set(), + u = [], + h = [], + d = new H(() => new Set()); + function f(k, w, x = {}, V = 0) { + if (k.kind === "declaration") { + if (k.property === "--tw-sort" || k.value === void 0 || k.value === null) return; + if (x.theme && k.property[0] === "-" && k.property[1] === "-") { + if (k.value === "initial") { + k.value = void 0; + return; + } + x.keyframes || s.get(w).add(k); + } + if (k.value.includes("var(")) + if (x.theme && k.property[0] === "-" && k.property[1] === "-") + for (let C of tt(k.value)) d.get(C).add(k.property); + else r.trackUsedVariables(k.value); + if (k.property === "animation") for (let C of gr(k.value)) c.add(C); + (i & 2 && k.value.includes("color-mix(") && !x.keyframes && a.get(w).add(k), w.push(k)); + } else if (k.kind === "rule") { + let C = []; + for (let R of k.nodes) f(R, C, x, V + 1); + let y = {}, + K = new Set(); + for (let R of C) { + if (R.kind !== "declaration") continue; + let P = `${R.property}:${R.value}:${R.important}`; + ((y[P] ??= []), y[P].push(R)); + } + for (let R in y) for (let P = 0; P < y[R].length - 1; ++P) K.add(y[R][P]); + if ((K.size > 0 && (C = C.filter((R) => !K.has(R))), C.length === 0)) return; + k.selector === "&" ? w.push(...C) : w.push({ ...k, nodes: C }); + } else if (k.kind === "at-rule" && k.name === "@property" && V === 0) { + if (n.has(k.params)) return; + if (i & 1) { + let y = k.params, + K = null, + R = !1; + for (let L of k.nodes) + L.kind === "declaration" && + (L.property === "initial-value" + ? (K = L.value) + : L.property === "inherits" && (R = L.value === "true")); + let P = o(y, K ?? "initial"); + ((P.src = k.src), R ? u.push(P) : h.push(P)); + } + n.add(k.params); + let C = { ...k, nodes: [] }; + for (let y of k.nodes) f(y, C.nodes, x, V + 1); + w.push(C); + } else if (k.kind === "at-rule") { + k.name === "@keyframes" && (x = { ...x, keyframes: !0 }); + let C = { ...k, nodes: [] }; + for (let y of k.nodes) f(y, C.nodes, x, V + 1); + (k.name === "@keyframes" && x.theme && m.add(C), + (C.nodes.length > 0 || + C.name === "@layer" || + C.name === "@charset" || + C.name === "@custom-media" || + C.name === "@namespace" || + C.name === "@import") && + w.push(C)); + } else if (k.kind === "at-root") + for (let C of k.nodes) { + let y = []; + f(C, y, x, 0); + for (let K of y) t.push(K); + } + else if (k.kind === "context") { + if (k.context.reference) return; + for (let C of k.nodes) f(C, w, { ...x, ...k.context }, V); + } else k.kind === "comment" && w.push(k); + } + let v = []; + for (let k of e) f(k, v, {}, 0); + e: for (let [k, w] of s) + for (let x of w) { + if (kr(x.property, r.theme, d)) { + if (x.property.startsWith(r.theme.prefixKey("--animate-"))) + for (let y of gr(x.value)) c.add(y); + continue; + } + let C = k.indexOf(x); + if ((k.splice(C, 1), k.length === 0)) { + let y = Ji(v, (K) => K.kind === "rule" && K.nodes === k); + if (!y || y.length === 0) continue e; + y.unshift({ kind: "at-root", nodes: v }); + do { + let K = y.pop(); + if (!K) break; + let R = y[y.length - 1]; + if (!R || (R.kind !== "at-root" && R.kind !== "at-rule")) break; + let P = R.nodes.indexOf(K); + if (P === -1) break; + R.nodes.splice(P, 1); + } while (!0); + continue e; + } + } + for (let k of m) + if (!c.has(k.params)) { + let w = t.indexOf(k); + t.splice(w, 1); + } + if (((v = v.concat(t)), i & 2)) + for (let [k, w] of a) + for (let x of w) { + let V = k.indexOf(x); + if (V === -1 || x.value == null) continue; + let C = G(x.value), + y = !1; + if ( + (D(C, (P) => { + if (P.kind !== "function" || P.value !== "color-mix") return; + let L = !1, + U = !1; + if ( + (D(P.nodes, (j) => { + if (j.kind == "word" && j.value.toLowerCase() === "currentcolor") { + ((U = !0), (y = !0)); + return; + } + let W = j, + B = null, + ne = new Set(); + do { + if (W.kind !== "function" || W.value !== "var") return; + let le = W.nodes[0]; + if (!le || le.kind !== "word") return; + let l = le.value; + if (ne.has(l)) { + L = !0; + return; + } + if ((ne.add(l), (y = !0), (B = r.theme.resolveValue(null, [le.value])), !B)) { + L = !0; + return; + } + if (B.toLowerCase() === "currentcolor") { + U = !0; + return; + } + B.startsWith("var(") ? (W = G(B)[0]) : (W = null); + } while (W); + return O.Replace({ kind: "word", value: B }); + }), + L || U) + ) { + let j = P.nodes.findIndex( + (B) => B.kind === "separator" && B.value.trim().includes(","), + ); + if (j === -1) return; + let W = P.nodes.length > j ? P.nodes[j + 1] : null; + return W ? O.Replace(W) : void 0; + } else if (y) { + let j = P.nodes[2]; + j.kind === "word" && + (j.value === "oklab" || + j.value === "oklch" || + j.value === "lab" || + j.value === "lch") && + (j.value = "srgb"); + } + }), + !y) + ) + continue; + let K = { ...x, value: J(C) }, + R = Y("@supports (color: color-mix(in lab, red, red))", [x]); + ((R.src = x.src), k.splice(V, 1, K, R)); + } + if (i & 1) { + let k = []; + if (u.length > 0) { + let w = Y(":root, :host", u); + ((w.src = u[0].src), k.push(w)); + } + if (h.length > 0) { + let w = Y("*, ::before, ::after, ::backdrop", h); + ((w.src = h[0].src), k.push(w)); + } + if (k.length > 0) { + let w = v.findIndex( + (C) => + !( + C.kind === "comment" || + (C.kind === "at-rule" && (C.name === "@charset" || C.name === "@import")) + ), + ), + x = M("@layer", "properties", []); + ((x.src = k[0].src), v.splice(w < 0 ? v.length : w, 0, x)); + let V = Y("@layer properties", [ + M( + "@supports", + "((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b))))", + k, + ), + ]); + ((V.src = k[0].src), (V.nodes[0].src = k[0].src), v.push(V)); + } + } + return v; + } + function oe(e, r) { + let i = 0, + t = { file: null, code: "" }; + function n(a, m = 0) { + let c = "", + u = " ".repeat(m); + if (a.kind === "declaration") { + if ( + ((c += `${u}${a.property}: ${a.value}${a.important ? " !important" : ""}; +`), + r) + ) { + i += u.length; + let h = i; + ((i += a.property.length), + (i += 2), + (i += a.value?.length ?? 0), + a.important && (i += 11)); + let d = i; + ((i += 2), (a.dst = [t, h, d])); + } + } else if (a.kind === "rule") { + if ( + ((c += `${u}${a.selector} { +`), + r) + ) { + i += u.length; + let h = i; + ((i += a.selector.length), (i += 1)); + let d = i; + ((a.dst = [t, h, d]), (i += 2)); + } + for (let h of a.nodes) c += n(h, m + 1); + ((c += `${u}} +`), + r && ((i += u.length), (i += 2))); + } else if (a.kind === "at-rule") { + if (a.nodes.length === 0) { + let h = `${u}${a.name} ${a.params}; +`; + if (r) { + i += u.length; + let d = i; + ((i += a.name.length), (i += 1), (i += a.params.length)); + let f = i; + ((i += 2), (a.dst = [t, d, f])); + } + return h; + } + if ( + ((c += `${u}${a.name}${a.params ? ` ${a.params} ` : " "}{ +`), + r) + ) { + i += u.length; + let h = i; + ((i += a.name.length), a.params && ((i += 1), (i += a.params.length)), (i += 1)); + let d = i; + ((a.dst = [t, h, d]), (i += 2)); + } + for (let h of a.nodes) c += n(h, m + 1); + ((c += `${u}} +`), + r && ((i += u.length), (i += 2))); + } else if (a.kind === "comment") { + if ( + ((c += `${u}/*${a.value}*/ +`), + r) + ) { + i += u.length; + let h = i; + i += 2 + a.value.length + 2; + let d = i; + ((a.dst = [t, h, d]), (i += 1)); + } + } else if (a.kind === "context" || a.kind === "at-root") return ""; + return c; + } + let s = ""; + for (let a of e) s += n(a, 0); + return ((t.code = s), s); + } + function Ji(e, r) { + let i = []; + return ( + D(e, (t, n) => { + if (r(t)) return ((i = n.path()), i.push(t), O.Stop); + }), + i + ); + } + function kr(e, r, i, t = new Set()) { + if (t.has(e) || (t.add(e), r.getOptions(e) & 24)) return !0; + { + let s = i.get(e) ?? []; + for (let a of s) if (kr(a, r, i, t)) return !0; + } + return !1; + } + function gr(e) { + return e.split(/[\s,]+/); + } + var Et = [ + "calc", + "min", + "max", + "clamp", + "mod", + "rem", + "sin", + "cos", + "tan", + "asin", + "acos", + "atan", + "atan2", + "pow", + "sqrt", + "hypot", + "log", + "exp", + "round", + ]; + function je(e) { + return e.indexOf("(") !== -1 && Et.some((r) => e.includes(`${r}(`)); + } + function vr(e) { + if (!Et.some((s) => e.includes(s))) return e; + let r = "", + i = [], + t = null, + n = null; + for (let s = 0; s < e.length; s++) { + let a = e.charCodeAt(s); + if ( + ((a >= 48 && a <= 57) || + (t !== null && (a === 37 || (a >= 97 && a <= 122) || (a >= 65 && a <= 90))) + ? (t = s) + : ((n = t), (t = null)), + a === 40) + ) { + r += e[s]; + let m = s; + for (let u = s - 1; u >= 0; u--) { + let h = e.charCodeAt(u); + if (h >= 48 && h <= 57) m = u; + else if (h >= 97 && h <= 122) m = u; + else break; + } + let c = e.slice(m, s); + if (Et.includes(c)) { + i.unshift(!0); + continue; + } else if (i[0] && c === "") { + i.unshift(!0); + continue; + } + i.unshift(!1); + continue; + } else if (a === 41) ((r += e[s]), i.shift()); + else if (a === 44 && i[0]) { + r += ", "; + continue; + } else { + if (a === 32 && i[0] && r.charCodeAt(r.length - 1) === 32) continue; + if ((a === 43 || a === 42 || a === 47 || a === 45) && i[0]) { + let m = r.trimEnd(), + c = m.charCodeAt(m.length - 1), + u = m.charCodeAt(m.length - 2), + h = e.charCodeAt(s + 1); + if ((c === 101 || c === 69) && u >= 48 && u <= 57) { + r += e[s]; + continue; + } else if (c === 43 || c === 42 || c === 47 || c === 45) { + r += e[s]; + continue; + } else if (c === 40 || c === 44) { + r += e[s]; + continue; + } else + e.charCodeAt(s - 1) === 32 + ? (r += `${e[s]} `) + : (c >= 48 && c <= 57) || + (h >= 48 && h <= 57) || + c === 41 || + h === 40 || + h === 43 || + h === 42 || + h === 47 || + h === 45 || + (n !== null && n === s - 1) + ? (r += ` ${e[s]} `) + : (r += e[s]); + } else r += e[s]; + } + } + return r; + } + function ke(e) { + if (e.indexOf("(") === -1) return Ee(e); + let r = G(e); + return (Vt(r), (e = J(r)), (e = vr(e)), e); + } + function Ee(e, r = !1) { + let i = ""; + for (let t = 0; t < e.length; t++) { + let n = e[t]; + n === "\\" && e[t + 1] === "_" + ? ((i += "_"), (t += 1)) + : n === "_" && !r + ? (i += " ") + : (i += n); + } + return i; + } + function Vt(e) { + for (let r of e) + switch (r.kind) { + case "function": { + if (r.value === "url" || r.value.endsWith("_url")) { + r.value = Ee(r.value); + break; + } + if ( + r.value === "var" || + r.value.endsWith("_var") || + r.value === "theme" || + r.value.endsWith("_theme") + ) { + r.value = Ee(r.value); + for (let i = 0; i < r.nodes.length; i++) { + if (i == 0 && r.nodes[i].kind === "word") { + r.nodes[i].value = Ee(r.nodes[i].value, !0); + continue; + } + Vt([r.nodes[i]]); + } + break; + } + ((r.value = Ee(r.value)), Vt(r.nodes)); + break; + } + case "separator": + case "word": { + r.value = Ee(r.value); + break; + } + default: + Xi(r); + } + } + function Xi(e) { + throw new Error(`Unexpected value: ${e}`); + } + var Rt = new Uint8Array(256); + function de(e) { + let r = 0, + i = e.length; + for (let t = 0; t < i; t++) { + let n = e.charCodeAt(t); + switch (n) { + case 92: + t += 1; + break; + case 39: + case 34: + for (; ++t < i; ) { + let s = e.charCodeAt(t); + if (s === 92) { + t += 1; + continue; + } + if (s === n) break; + } + break; + case 40: + ((Rt[r] = 41), r++); + break; + case 91: + ((Rt[r] = 93), r++); + break; + case 123: + break; + case 93: + case 125: + case 41: + if (r === 0) return !1; + r > 0 && n === Rt[r - 1] && r--; + break; + case 59: + if (r === 0) return !1; + break; + } + } + return !0; + } + var it = new Uint8Array(256); + function z(e, r) { + let i = 0, + t = [], + n = 0, + s = e.length, + a = r.charCodeAt(0); + for (let m = 0; m < s; m++) { + let c = e.charCodeAt(m); + if (i === 0 && c === a) { + (t.push(e.slice(n, m)), (n = m + 1)); + continue; + } + switch (c) { + case 92: + m += 1; + break; + case 39: + case 34: + for (; ++m < s; ) { + let u = e.charCodeAt(m); + if (u === 92) { + m += 1; + continue; + } + if (u === c) break; + } + break; + case 40: + ((it[i] = 41), i++); + break; + case 91: + ((it[i] = 93), i++); + break; + case 123: + ((it[i] = 125), i++); + break; + case 93: + case 125: + case 41: + i > 0 && c === it[i - 1] && i--; + break; + } + } + return (t.push(e.slice(n)), t); + } + var eo = 58, + wr = 45, + br = 97, + yr = 122, + _t = /^[a-zA-Z0-9_.%-]+$/; + function* xr(e, r) { + let i = z(e, ":"); + if (r.theme.prefix) { + if (i.length === 1 || i[0] !== r.theme.prefix) return null; + i.shift(); + } + let t = i.pop(), + n = []; + for (let d = i.length - 1; d >= 0; --d) { + let f = r.parseVariant(i[d]); + if (f === null) return; + n.push(f); + } + let s = !1; + (t[t.length - 1] === "!" + ? ((s = !0), (t = t.slice(0, -1))) + : t[0] === "!" && ((s = !0), (t = t.slice(1))), + r.utilities.has(t, "static") && + !t.includes("[") && + (yield { kind: "static", root: t, variants: n, important: s, raw: e })); + let [a, m = null, c] = z(t, "/"); + if (c) return; + let u = m === null ? null : Ot(m); + if (m !== null && u === null) return; + if (a[0] === "[") { + if (a[a.length - 1] !== "]") return; + let d = a.charCodeAt(1); + if (d !== wr && !(d >= br && d <= yr)) return; + a = a.slice(1, -1); + let f = a.indexOf(":"); + if (f === -1 || f === 0 || f === a.length - 1) return; + let v = a.slice(0, f), + k = ke(a.slice(f + 1)); + if (!de(k)) return; + yield { + kind: "arbitrary", + property: v, + value: k, + modifier: u, + variants: n, + important: s, + raw: e, + }; + return; + } + let h; + if (a[a.length - 1] === "]") { + let d = a.indexOf("-["); + if (d === -1) return; + let f = a.slice(0, d); + if (!r.utilities.has(f, "functional")) return; + let v = a.slice(d + 1); + h = [[f, v]]; + } else if (a[a.length - 1] === ")") { + let d = a.indexOf("-("); + if (d === -1) return; + let f = a.slice(0, d); + if (!r.utilities.has(f, "functional")) return; + let v = a.slice(d + 2, -1), + k = z(v, ":"), + w = null; + if ((k.length === 2 && ((w = k[0]), (v = k[1])), v[0] !== "-" || v[1] !== "-" || !de(v))) + return; + h = [[f, w === null ? `[var(${v})]` : `[${w}:var(${v})]`]]; + } else h = Cr(a, (d) => r.utilities.has(d, "functional")); + for (let [d, f] of h) { + let v = { + kind: "functional", + root: d, + modifier: u, + value: null, + variants: n, + important: s, + raw: e, + }; + if (f === null) { + yield v; + continue; + } + { + let k = f.indexOf("["); + if (k !== -1) { + if (f[f.length - 1] !== "]") return; + let x = ke(f.slice(k + 1, -1)); + if (!de(x)) continue; + let V = null; + for (let C = 0; C < x.length; C++) { + let y = x.charCodeAt(C); + if (y === eo) { + ((V = x.slice(0, C)), (x = x.slice(C + 1))); + break; + } + if (!(y === wr || (y >= br && y <= yr))) break; + } + if (x.length === 0 || x.trim().length === 0 || V === "") continue; + v.value = { kind: "arbitrary", dataType: V || null, value: x }; + } else { + let x = m === null || v.modifier?.kind === "arbitrary" ? null : `${f}/${m}`; + if (!_t.test(f)) continue; + v.value = { kind: "named", value: f, fraction: x }; + } + } + yield v; + } + } + function Ot(e) { + if (e[0] === "[" && e[e.length - 1] === "]") { + let r = ke(e.slice(1, -1)); + return !de(r) || r.length === 0 || r.trim().length === 0 + ? null + : { kind: "arbitrary", value: r }; + } + return e[0] === "(" && e[e.length - 1] === ")" + ? ((e = e.slice(1, -1)), + e[0] !== "-" || e[1] !== "-" || !de(e) + ? null + : ((e = `var(${e})`), { kind: "arbitrary", value: ke(e) })) + : _t.test(e) + ? { kind: "named", value: e } + : null; + } + function Ar(e, r) { + if (e[0] === "[" && e[e.length - 1] === "]") { + if (e[1] === "@" && e.includes("&")) return null; + let i = ke(e.slice(1, -1)); + if (!de(i) || i.length === 0 || i.trim().length === 0) return null; + let t = i[0] === ">" || i[0] === "+" || i[0] === "~"; + return ( + !t && i[0] !== "@" && !i.includes("&") && (i = `&:is(${i})`), + { kind: "arbitrary", selector: i, relative: t } + ); + } + { + let [i, t = null, n] = z(e, "/"); + if (n) return null; + let s = Cr(i, (a) => r.variants.has(a)); + for (let [a, m] of s) + switch (r.variants.kind(a)) { + case "static": + return m !== null || t !== null ? null : { kind: "static", root: a }; + case "functional": { + let c = t === null ? null : Ot(t); + if (t !== null && c === null) return null; + if (m === null) return { kind: "functional", root: a, modifier: c, value: null }; + if (m[m.length - 1] === "]") { + if (m[0] !== "[") continue; + let u = ke(m.slice(1, -1)); + return !de(u) || u.length === 0 || u.trim().length === 0 + ? null + : { + kind: "functional", + root: a, + modifier: c, + value: { kind: "arbitrary", value: u }, + }; + } + if (m[m.length - 1] === ")") { + if (m[0] !== "(") continue; + let u = ke(m.slice(1, -1)); + return !de(u) || + u.length === 0 || + u.trim().length === 0 || + u[0] !== "-" || + u[1] !== "-" + ? null + : { + kind: "functional", + root: a, + modifier: c, + value: { kind: "arbitrary", value: `var(${u})` }, + }; + } + if (!_t.test(m)) continue; + return { kind: "functional", root: a, modifier: c, value: { kind: "named", value: m } }; + } + case "compound": { + if (m === null) return null; + t && (a === "not" || a === "has" || a === "in") && ((m = `${m}/${t}`), (t = null)); + let c = r.parseVariant(m); + if (c === null || !r.variants.compoundsWith(a, c)) return null; + let u = t === null ? null : Ot(t); + return t !== null && u === null + ? null + : { kind: "compound", root: a, modifier: u, variant: c }; + } + } + } + return null; + } + function* Cr(e, r) { + r(e) && (yield [e, null]); + let i = e.lastIndexOf("-"); + for (; i > 0; ) { + let t = e.slice(0, i); + if (r(t)) { + let n = [t, e.slice(i + 1)]; + if (n[1] === "" || (n[0] === "@" && r("@") && e[i] === "-")) break; + yield n; + } + i = e.lastIndexOf("-", i - 1); + } + e[0] === "@" && r("@") && (yield ["@", e.slice(1)]); + } + function Tr(e, r) { + let i = []; + for (let n of r.variants) i.unshift(ot(n)); + e.theme.prefix && i.unshift(e.theme.prefix); + let t = ""; + if ((r.kind === "static" && (t += r.root), r.kind === "functional" && ((t += r.root), r.value))) + if (r.value.kind === "arbitrary") { + if (r.value !== null) { + let n = Ut(r.value.value), + s = n ? r.value.value.slice(4, -1) : r.value.value, + [a, m] = n ? ["(", ")"] : ["[", "]"]; + r.value.dataType + ? (t += `-${a}${r.value.dataType}:${Ve(s)}${m}`) + : (t += `-${a}${Ve(s)}${m}`); + } + } else r.value.kind === "named" && (t += `-${r.value.value}`); + return ( + r.kind === "arbitrary" && (t += `[${r.property}:${Ve(r.value)}]`), + (r.kind === "arbitrary" || r.kind === "functional") && (t += $r(r.modifier)), + r.important && (t += "!"), + i.push(t), + i.join(":") + ); + } + function $r(e) { + if (e === null) return ""; + let r = Ut(e.value), + i = r ? e.value.slice(4, -1) : e.value, + [t, n] = r ? ["(", ")"] : ["[", "]"]; + return e.kind === "arbitrary" ? `/${t}${Ve(i)}${n}` : e.kind === "named" ? `/${e.value}` : ""; + } + function ot(e) { + if (e.kind === "static") return e.root; + if (e.kind === "arbitrary") return `[${Ve(io(e.selector))}]`; + let r = ""; + if (e.kind === "functional") { + r += e.root; + let i = e.root !== "@"; + if (e.value) + if (e.value.kind === "arbitrary") { + let t = Ut(e.value.value), + n = t ? e.value.value.slice(4, -1) : e.value.value, + [s, a] = t ? ["(", ")"] : ["[", "]"]; + r += `${i ? "-" : ""}${s}${Ve(n)}${a}`; + } else e.value.kind === "named" && (r += `${i ? "-" : ""}${e.value.value}`); + } + return ( + e.kind === "compound" && ((r += e.root), (r += "-"), (r += ot(e.variant))), + (e.kind === "functional" || e.kind === "compound") && (r += $r(e.modifier)), + r + ); + } + var to = new H((e) => { + let r = G(e), + i = new Set(); + return ( + D(r, (t, n) => { + let s = n.parent === null ? r : (n.parent.nodes ?? []); + if ( + t.kind === "word" && + (t.value === "+" || t.value === "-" || t.value === "*" || t.value === "/") + ) { + let a = s.indexOf(t) ?? -1; + if (a === -1) return; + let m = s[a - 1]; + if (m?.kind !== "separator" || m.value !== " ") return; + let c = s[a + 1]; + if (c?.kind !== "separator" || c.value !== " ") return; + (i.add(m), i.add(c)); + } else + t.kind === "separator" && t.value.length > 0 && t.value.trim() === "" + ? (s[0] === t || s[s.length - 1] === t) && i.add(t) + : t.kind === "separator" && t.value.trim() === "," && (t.value = ","); + }), + i.size > 0 && + D(r, (t) => { + if (i.has(t)) return (i.delete(t), O.ReplaceSkip([])); + }), + Pt(r), + J(r) + ); + }); + function Ve(e) { + return to.get(e); + } + var ro = new H((e) => { + let r = G(e); + return r.length === 3 && + r[0].kind === "word" && + r[0].value === "&" && + r[1].kind === "separator" && + r[1].value === ":" && + r[2].kind === "function" && + r[2].value === "is" + ? J(r[2].nodes) + : e; + }); + function io(e) { + return ro.get(e); + } + function Pt(e) { + for (let r of e) + switch (r.kind) { + case "function": { + if (r.value === "url" || r.value.endsWith("_url")) { + r.value = Ie(r.value); + break; + } + if ( + r.value === "var" || + r.value.endsWith("_var") || + r.value === "theme" || + r.value.endsWith("_theme") + ) { + r.value = Ie(r.value); + for (let i = 0; i < r.nodes.length; i++) Pt([r.nodes[i]]); + break; + } + ((r.value = Ie(r.value)), Pt(r.nodes)); + break; + } + case "separator": + r.value = Ie(r.value); + break; + case "word": { + (r.value[0] !== "-" || r.value[1] !== "-") && (r.value = Ie(r.value)); + break; + } + default: + no(r); + } + } + var oo = new H((e) => { + let r = G(e); + return r.length === 1 && r[0].kind === "function" && r[0].value === "var"; + }); + function Ut(e) { + return oo.get(e); + } + function no(e) { + throw new Error(`Unexpected value: ${e}`); + } + function Ie(e) { + return e.replaceAll("_", String.raw`\_`).replaceAll(" ", "_"); + } + function Ce(e, r, i) { + if (e === r) return 0; + let t = e.indexOf("("), + n = r.indexOf("("), + s = t === -1 ? e.replace(/[\d.]+/g, "") : e.slice(0, t), + a = n === -1 ? r.replace(/[\d.]+/g, "") : r.slice(0, n), + m = + (s === a ? 0 : s < a ? -1 : 1) || + (i === "asc" ? parseInt(e) - parseInt(r) : parseInt(r) - parseInt(e)); + return Number.isNaN(m) ? (e < r ? -1 : 1) : m; + } + var lo = new Set([ + "black", + "silver", + "gray", + "white", + "maroon", + "red", + "purple", + "fuchsia", + "green", + "lime", + "olive", + "yellow", + "navy", + "blue", + "teal", + "aqua", + "aliceblue", + "antiquewhite", + "aqua", + "aquamarine", + "azure", + "beige", + "bisque", + "black", + "blanchedalmond", + "blue", + "blueviolet", + "brown", + "burlywood", + "cadetblue", + "chartreuse", + "chocolate", + "coral", + "cornflowerblue", + "cornsilk", + "crimson", + "cyan", + "darkblue", + "darkcyan", + "darkgoldenrod", + "darkgray", + "darkgreen", + "darkgrey", + "darkkhaki", + "darkmagenta", + "darkolivegreen", + "darkorange", + "darkorchid", + "darkred", + "darksalmon", + "darkseagreen", + "darkslateblue", + "darkslategray", + "darkslategrey", + "darkturquoise", + "darkviolet", + "deeppink", + "deepskyblue", + "dimgray", + "dimgrey", + "dodgerblue", + "firebrick", + "floralwhite", + "forestgreen", + "fuchsia", + "gainsboro", + "ghostwhite", + "gold", + "goldenrod", + "gray", + "green", + "greenyellow", + "grey", + "honeydew", + "hotpink", + "indianred", + "indigo", + "ivory", + "khaki", + "lavender", + "lavenderblush", + "lawngreen", + "lemonchiffon", + "lightblue", + "lightcoral", + "lightcyan", + "lightgoldenrodyellow", + "lightgray", + "lightgreen", + "lightgrey", + "lightpink", + "lightsalmon", + "lightseagreen", + "lightskyblue", + "lightslategray", + "lightslategrey", + "lightsteelblue", + "lightyellow", + "lime", + "limegreen", + "linen", + "magenta", + "maroon", + "mediumaquamarine", + "mediumblue", + "mediumorchid", + "mediumpurple", + "mediumseagreen", + "mediumslateblue", + "mediumspringgreen", + "mediumturquoise", + "mediumvioletred", + "midnightblue", + "mintcream", + "mistyrose", + "moccasin", + "navajowhite", + "navy", + "oldlace", + "olive", + "olivedrab", + "orange", + "orangered", + "orchid", + "palegoldenrod", + "palegreen", + "paleturquoise", + "palevioletred", + "papayawhip", + "peachpuff", + "peru", + "pink", + "plum", + "powderblue", + "purple", + "rebeccapurple", + "red", + "rosybrown", + "royalblue", + "saddlebrown", + "salmon", + "sandybrown", + "seagreen", + "seashell", + "sienna", + "silver", + "skyblue", + "slateblue", + "slategray", + "slategrey", + "snow", + "springgreen", + "steelblue", + "tan", + "teal", + "thistle", + "tomato", + "turquoise", + "violet", + "wheat", + "white", + "whitesmoke", + "yellow", + "yellowgreen", + "transparent", + "currentcolor", + "canvas", + "canvastext", + "linktext", + "visitedtext", + "activetext", + "buttonface", + "buttontext", + "buttonborder", + "field", + "fieldtext", + "highlight", + "highlighttext", + "selecteditem", + "selecteditemtext", + "mark", + "marktext", + "graytext", + "accentcolor", + "accentcolortext", + ]), + ao = /^(rgba?|hsla?|hwb|color|(ok)?(lab|lch)|light-dark|color-mix)\(/i; + function Nr(e) { + return e.charCodeAt(0) === 35 || ao.test(e) || lo.has(e.toLowerCase()); + } + var so = { + color: Nr, + length: nt, + percentage: Dt, + ratio: xo, + number: Er, + integer: E, + url: Sr, + position: To, + "bg-size": $o, + "line-width": co, + image: mo, + "family-name": go, + "generic-name": ho, + "absolute-size": ko, + "relative-size": vo, + angle: Eo, + vector: Ro, + }; + function Z(e, r) { + if (e.startsWith("var(")) return null; + for (let i of r) if (so[i]?.(e)) return i; + return null; + } + var uo = /^url\(.*\)$/; + function Sr(e) { + return uo.test(e); + } + function co(e) { + return z(e, " ").every( + (r) => nt(r) || Er(r) || r === "thin" || r === "medium" || r === "thick", + ); + } + var fo = /^(?:element|image|cross-fade|image-set)\(/, + po = /^(repeating-)?(conic|linear|radial)-gradient\(/; + function mo(e) { + let r = 0; + for (let i of z(e, ",")) + if (!i.startsWith("var(")) { + if (Sr(i)) { + r += 1; + continue; + } + if (po.test(i)) { + r += 1; + continue; + } + if (fo.test(i)) { + r += 1; + continue; + } + return !1; + } + return r > 0; + } + function ho(e) { + return ( + e === "serif" || + e === "sans-serif" || + e === "monospace" || + e === "cursive" || + e === "fantasy" || + e === "system-ui" || + e === "ui-serif" || + e === "ui-sans-serif" || + e === "ui-monospace" || + e === "ui-rounded" || + e === "math" || + e === "emoji" || + e === "fangsong" + ); + } + function go(e) { + let r = 0; + for (let i of z(e, ",")) { + let t = i.charCodeAt(0); + if (t >= 48 && t <= 57) return !1; + i.startsWith("var(") || (r += 1); + } + return r > 0; + } + function ko(e) { + return ( + e === "xx-small" || + e === "x-small" || + e === "small" || + e === "medium" || + e === "large" || + e === "x-large" || + e === "xx-large" || + e === "xxx-large" + ); + } + function vo(e) { + return e === "larger" || e === "smaller"; + } + var me = /[+-]?\d*\.?\d+(?:[eE][+-]?\d+)?/, + wo = new RegExp(`^${me.source}$`); + function Er(e) { + return wo.test(e) || je(e); + } + var bo = new RegExp(`^${me.source}%$`); + function Dt(e) { + return bo.test(e) || je(e); + } + var yo = new RegExp(`^${me.source}s*/s*${me.source}$`); + function xo(e) { + return yo.test(e) || je(e); + } + var Ao = [ + "cm", + "mm", + "Q", + "in", + "pc", + "pt", + "px", + "em", + "ex", + "ch", + "rem", + "lh", + "rlh", + "vw", + "vh", + "vmin", + "vmax", + "vb", + "vi", + "svw", + "svh", + "lvw", + "lvh", + "dvw", + "dvh", + "cqw", + "cqh", + "cqi", + "cqb", + "cqmin", + "cqmax", + ], + Co = new RegExp(`^${me.source}(${Ao.join("|")})$`); + function nt(e) { + return Co.test(e) || je(e); + } + function To(e) { + let r = 0; + for (let i of z(e, " ")) { + if (i === "center" || i === "top" || i === "right" || i === "bottom" || i === "left") { + r += 1; + continue; + } + if (!i.startsWith("var(")) { + if (nt(i) || Dt(i)) { + r += 1; + continue; + } + return !1; + } + } + return r > 0; + } + function $o(e) { + let r = 0; + for (let i of z(e, ",")) { + if (i === "cover" || i === "contain") { + r += 1; + continue; + } + let t = z(i, " "); + if (t.length !== 1 && t.length !== 2) return !1; + if (t.every((n) => n === "auto" || nt(n) || Dt(n))) { + r += 1; + continue; + } + } + return r > 0; + } + var No = ["deg", "rad", "grad", "turn"], + So = new RegExp(`^${me.source}(${No.join("|")})$`); + function Eo(e) { + return So.test(e); + } + var Vo = new RegExp(`^${me.source} +${me.source} +${me.source}$`); + function Ro(e) { + return Vo.test(e); + } + function E(e) { + let r = Number(e); + return Number.isInteger(r) && r >= 0 && String(r) === String(e); + } + function zt(e) { + let r = Number(e); + return Number.isInteger(r) && r > 0 && String(r) === String(e); + } + function Te(e) { + return Vr(e, 0.25); + } + function lt(e) { + return Vr(e, 0.25); + } + function Vr(e, r) { + let i = Number(e); + return i >= 0 && i % r === 0 && String(i) === String(e); + } + var Oo = new Set(["inset", "inherit", "initial", "revert", "unset"]), + Rr = /^-?(\d+|\.\d+)(.*?)$/g; + function Fe(e, r) { + return z(e, ",") + .map((t) => { + t = t.trim(); + let n = z(t, " ").filter((u) => u.trim() !== ""), + s = null, + a = null, + m = null; + for (let u of n) + Oo.has(u) || + (Rr.test(u) + ? (a === null ? (a = u) : m === null && (m = u), (Rr.lastIndex = 0)) + : s === null && (s = u)); + if (a === null || m === null) return t; + let c = r(s ?? "currentcolor"); + return s !== null ? t.replace(s, c) : `${t} ${c}`; + }) + .join(", "); + } + var _o = /^-?[a-z][a-zA-Z0-9/%._-]*$/, + Uo = /^-?[a-z][a-zA-Z0-9/%._-]*-\*$/, + st = [ + "0", + "0.5", + "1", + "1.5", + "2", + "2.5", + "3", + "3.5", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "14", + "16", + "20", + "24", + "28", + "32", + "36", + "40", + "44", + "48", + "52", + "56", + "60", + "64", + "72", + "80", + "96", + ], + Kt = class { + utilities = new H(() => []); + completions = new Map(); + static(r, i) { + this.utilities.get(r).push({ kind: "static", compileFn: i }); + } + functional(r, i, t) { + this.utilities.get(r).push({ kind: "functional", compileFn: i, options: t }); + } + has(r, i) { + return this.utilities.has(r) && this.utilities.get(r).some((t) => t.kind === i); + } + get(r) { + return this.utilities.has(r) ? this.utilities.get(r) : []; + } + getCompletions(r) { + return this.has(r, "static") + ? (this.completions.get(r)?.() ?? [{ supportsNegative: !1, values: [], modifiers: [] }]) + : (this.completions.get(r)?.() ?? []); + } + suggest(r, i) { + let t = this.completions.get(r); + t ? this.completions.set(r, () => [...t?.(), ...i?.()]) : this.completions.set(r, i); + } + keys(r) { + let i = []; + for (let [t, n] of this.utilities.entries()) + for (let s of n) + if (s.kind === r) { + i.push(t); + break; + } + return i; + } + }; + function T(e, r, i) { + return M("@property", e, [ + o("syntax", i ? `"${i}"` : '"*"'), + o("inherits", "false"), + ...(r ? [o("initial-value", r)] : []), + ]); + } + function Q(e, r) { + if (r === null) return e; + let i = Number(r); + return ( + Number.isNaN(i) || (r = `${i * 100}%`), + r === "100%" ? e : `color-mix(in oklab, ${e} ${r}, transparent)` + ); + } + function Pr(e, r) { + let i = Number(r); + return (Number.isNaN(i) || (r = `${i * 100}%`), `oklab(from ${e} l a b / ${r})`); + } + function X(e, r, i) { + if (!r) return e; + if (r.kind === "arbitrary") return Q(e, r.value); + let t = i.resolve(r.value, ["--opacity"]); + return t ? Q(e, t) : lt(r.value) ? Q(e, `${r.value}%`) : null; + } + function ee(e, r, i) { + let t = null; + switch (e.value.value) { + case "inherit": { + t = "inherit"; + break; + } + case "transparent": { + t = "transparent"; + break; + } + case "current": { + t = "currentcolor"; + break; + } + default: { + t = r.resolve(e.value.value, i); + break; + } + } + return t ? X(t, e.modifier, r) : null; + } + var _r = /(\d+)_(\d+)/g; + function Ur(e) { + let r = new Kt(); + function i(l, p) { + function* g(b) { + for (let $ of e.keysInNamespaces(b)) yield $.replace(_r, (_, N, S) => `${N}.${S}`); + } + let A = [ + "1/2", + "1/3", + "2/3", + "1/4", + "2/4", + "3/4", + "1/5", + "2/5", + "3/5", + "4/5", + "1/6", + "2/6", + "3/6", + "4/6", + "5/6", + "1/12", + "2/12", + "3/12", + "4/12", + "5/12", + "6/12", + "7/12", + "8/12", + "9/12", + "10/12", + "11/12", + ]; + r.suggest(l, () => { + let b = []; + for (let $ of p()) { + if (typeof $ == "string") { + b.push({ values: [$], modifiers: [] }); + continue; + } + let _ = [...($.values ?? []), ...g($.valueThemeKeys ?? [])], + N = [...($.modifiers ?? []), ...g($.modifierThemeKeys ?? [])]; + ($.supportsFractions && _.push(...A), + $.hasDefaultValue && _.unshift(null), + b.push({ supportsNegative: $.supportsNegative, values: _, modifiers: N })); + } + return b; + }); + } + function t(l, p) { + r.static(l, () => p.map((g) => (typeof g == "function" ? g() : o(g[0], g[1])))); + } + function n(l, p) { + function g({ negative: A }) { + return (b) => { + let $ = null, + _ = null; + if (b.value) + if (b.value.kind === "arbitrary") { + if (b.modifier) return; + (($ = b.value.value), (_ = b.value.dataType)); + } else { + if ( + (($ = e.resolve(b.value.fraction ?? b.value.value, p.themeKeys ?? [])), + $ === null && p.supportsFractions && b.value.fraction) + ) { + let [N, S] = z(b.value.fraction, "/"); + if (!E(N) || !E(S)) return; + $ = `calc(${b.value.fraction} * 100%)`; + } + if ($ === null && A && p.handleNegativeBareValue) { + if ((($ = p.handleNegativeBareValue(b.value)), !$?.includes("/") && b.modifier)) + return; + if ($ !== null) return p.handle($, null); + } + if ( + $ === null && + p.handleBareValue && + (($ = p.handleBareValue(b.value)), !$?.includes("/") && b.modifier) + ) + return; + if ($ === null && !A && p.staticValues && !b.modifier) { + let N = p.staticValues[b.value.value]; + if (N) return N.map(re); + } + } + else { + if (b.modifier) return; + $ = p.defaultValue !== void 0 ? p.defaultValue : e.resolve(null, p.themeKeys ?? []); + } + if ($ !== null) return p.handle(A ? `calc(${$} * -1)` : $, _); + }; + } + if ( + (p.supportsNegative && r.functional(`-${l}`, g({ negative: !0 })), + r.functional(l, g({ negative: !1 })), + i(l, () => [ + { + supportsNegative: p.supportsNegative, + valueThemeKeys: p.themeKeys ?? [], + hasDefaultValue: p.defaultValue !== void 0 && p.defaultValue !== null, + supportsFractions: p.supportsFractions, + }, + ]), + p.staticValues && Object.keys(p.staticValues).length > 0) + ) { + let A = Object.keys(p.staticValues); + i(l, () => [{ values: A }]); + } + } + function s(l, p) { + (r.functional(l, (g) => { + if (!g.value) return; + let A = null; + if ( + (g.value.kind === "arbitrary" + ? ((A = g.value.value), (A = X(A, g.modifier, e))) + : (A = ee(g, e, p.themeKeys)), + A !== null) + ) + return p.handle(A); + }), + i(l, () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: p.themeKeys, + modifiers: Array.from({ length: 21 }, (g, A) => `${A * 5}`), + }, + ])); + } + function a( + l, + p, + g, + { supportsNegative: A = !1, supportsFractions: b = !1, staticValues: $ } = {}, + ) { + (A && r.static(`-${l}-px`, () => g("-1px")), + r.static(`${l}-px`, () => g("1px")), + n(l, { + themeKeys: p, + supportsFractions: b, + supportsNegative: A, + defaultValue: null, + handleBareValue: ({ value: _ }) => { + let N = e.resolve(null, ["--spacing"]); + return !N || !Te(_) ? null : `calc(${N} * ${_})`; + }, + handleNegativeBareValue: ({ value: _ }) => { + let N = e.resolve(null, ["--spacing"]); + return !N || !Te(_) ? null : `calc(${N} * -${_})`; + }, + handle: g, + staticValues: $, + }), + i(l, () => [ + { + values: e.get(["--spacing"]) ? st : [], + supportsNegative: A, + supportsFractions: b, + valueThemeKeys: p, + }, + ])); + } + (t("sr-only", [ + ["position", "absolute"], + ["width", "1px"], + ["height", "1px"], + ["padding", "0"], + ["margin", "-1px"], + ["overflow", "hidden"], + ["clip-path", "inset(50%)"], + ["white-space", "nowrap"], + ["border-width", "0"], + ]), + t("not-sr-only", [ + ["position", "static"], + ["width", "auto"], + ["height", "auto"], + ["padding", "0"], + ["margin", "0"], + ["overflow", "visible"], + ["clip-path", "none"], + ["white-space", "normal"], + ]), + t("pointer-events-none", [["pointer-events", "none"]]), + t("pointer-events-auto", [["pointer-events", "auto"]]), + t("visible", [["visibility", "visible"]]), + t("invisible", [["visibility", "hidden"]]), + t("collapse", [["visibility", "collapse"]]), + t("static", [["position", "static"]]), + t("fixed", [["position", "fixed"]]), + t("absolute", [["position", "absolute"]]), + t("relative", [["position", "relative"]]), + t("sticky", [["position", "sticky"]])); + for (let [l, p] of [ + ["inset", "inset"], + ["inset-x", "inset-inline"], + ["inset-y", "inset-block"], + ["start", "inset-inline-start"], + ["end", "inset-inline-end"], + ["top", "top"], + ["right", "right"], + ["bottom", "bottom"], + ["left", "left"], + ]) + (t(`${l}-auto`, [[p, "auto"]]), + t(`${l}-full`, [[p, "100%"]]), + t(`-${l}-full`, [[p, "-100%"]]), + a(l, ["--inset", "--spacing"], (g) => [o(p, g)], { + supportsNegative: !0, + supportsFractions: !0, + })); + (t("isolate", [["isolation", "isolate"]]), + t("isolation-auto", [["isolation", "auto"]]), + n("z", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--z-index"], + handle: (l) => [o("z-index", l)], + staticValues: { auto: [o("z-index", "auto")] }, + }), + i("z", () => [ + { + supportsNegative: !0, + values: ["0", "10", "20", "30", "40", "50"], + valueThemeKeys: ["--z-index"], + }, + ]), + n("order", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--order"], + handle: (l) => [o("order", l)], + staticValues: { first: [o("order", "-9999")], last: [o("order", "9999")] }, + }), + i("order", () => [ + { + supportsNegative: !0, + values: Array.from({ length: 12 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--order"], + }, + ]), + n("col", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--grid-column"], + handle: (l) => [o("grid-column", l)], + staticValues: { auto: [o("grid-column", "auto")] }, + }), + n("col-span", { + handleBareValue: ({ value: l }) => (E(l) ? l : null), + handle: (l) => [o("grid-column", `span ${l} / span ${l}`)], + staticValues: { full: [o("grid-column", "1 / -1")] }, + }), + n("col-start", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--grid-column-start"], + handle: (l) => [o("grid-column-start", l)], + staticValues: { auto: [o("grid-column-start", "auto")] }, + }), + n("col-end", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--grid-column-end"], + handle: (l) => [o("grid-column-end", l)], + staticValues: { auto: [o("grid-column-end", "auto")] }, + }), + i("col-span", () => [ + { values: Array.from({ length: 12 }, (l, p) => `${p + 1}`), valueThemeKeys: [] }, + ]), + i("col-start", () => [ + { + supportsNegative: !0, + values: Array.from({ length: 13 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--grid-column-start"], + }, + ]), + i("col-end", () => [ + { + supportsNegative: !0, + values: Array.from({ length: 13 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--grid-column-end"], + }, + ]), + n("row", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--grid-row"], + handle: (l) => [o("grid-row", l)], + staticValues: { auto: [o("grid-row", "auto")] }, + }), + n("row-span", { + themeKeys: [], + handleBareValue: ({ value: l }) => (E(l) ? l : null), + handle: (l) => [o("grid-row", `span ${l} / span ${l}`)], + staticValues: { full: [o("grid-row", "1 / -1")] }, + }), + n("row-start", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--grid-row-start"], + handle: (l) => [o("grid-row-start", l)], + staticValues: { auto: [o("grid-row-start", "auto")] }, + }), + n("row-end", { + supportsNegative: !0, + handleBareValue: ({ value: l }) => (E(l) ? l : null), + themeKeys: ["--grid-row-end"], + handle: (l) => [o("grid-row-end", l)], + staticValues: { auto: [o("grid-row-end", "auto")] }, + }), + i("row-span", () => [ + { values: Array.from({ length: 12 }, (l, p) => `${p + 1}`), valueThemeKeys: [] }, + ]), + i("row-start", () => [ + { + supportsNegative: !0, + values: Array.from({ length: 13 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--grid-row-start"], + }, + ]), + i("row-end", () => [ + { + supportsNegative: !0, + values: Array.from({ length: 13 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--grid-row-end"], + }, + ]), + t("float-start", [["float", "inline-start"]]), + t("float-end", [["float", "inline-end"]]), + t("float-right", [["float", "right"]]), + t("float-left", [["float", "left"]]), + t("float-none", [["float", "none"]]), + t("clear-start", [["clear", "inline-start"]]), + t("clear-end", [["clear", "inline-end"]]), + t("clear-right", [["clear", "right"]]), + t("clear-left", [["clear", "left"]]), + t("clear-both", [["clear", "both"]]), + t("clear-none", [["clear", "none"]])); + for (let [l, p] of [ + ["m", "margin"], + ["mx", "margin-inline"], + ["my", "margin-block"], + ["ms", "margin-inline-start"], + ["me", "margin-inline-end"], + ["mt", "margin-top"], + ["mr", "margin-right"], + ["mb", "margin-bottom"], + ["ml", "margin-left"], + ]) + (t(`${l}-auto`, [[p, "auto"]]), + a(l, ["--margin", "--spacing"], (g) => [o(p, g)], { supportsNegative: !0 })); + (t("box-border", [["box-sizing", "border-box"]]), + t("box-content", [["box-sizing", "content-box"]]), + n("line-clamp", { + themeKeys: ["--line-clamp"], + handleBareValue: ({ value: l }) => (E(l) ? l : null), + handle: (l) => [ + o("overflow", "hidden"), + o("display", "-webkit-box"), + o("-webkit-box-orient", "vertical"), + o("-webkit-line-clamp", l), + ], + staticValues: { + none: [ + o("overflow", "visible"), + o("display", "block"), + o("-webkit-box-orient", "horizontal"), + o("-webkit-line-clamp", "unset"), + ], + }, + }), + i("line-clamp", () => [ + { values: ["1", "2", "3", "4", "5", "6"], valueThemeKeys: ["--line-clamp"] }, + ]), + t("block", [["display", "block"]]), + t("inline-block", [["display", "inline-block"]]), + t("inline", [["display", "inline"]]), + t("hidden", [["display", "none"]]), + t("inline-flex", [["display", "inline-flex"]]), + t("table", [["display", "table"]]), + t("inline-table", [["display", "inline-table"]]), + t("table-caption", [["display", "table-caption"]]), + t("table-cell", [["display", "table-cell"]]), + t("table-column", [["display", "table-column"]]), + t("table-column-group", [["display", "table-column-group"]]), + t("table-footer-group", [["display", "table-footer-group"]]), + t("table-header-group", [["display", "table-header-group"]]), + t("table-row-group", [["display", "table-row-group"]]), + t("table-row", [["display", "table-row"]]), + t("flow-root", [["display", "flow-root"]]), + t("flex", [["display", "flex"]]), + t("grid", [["display", "grid"]]), + t("inline-grid", [["display", "inline-grid"]]), + t("contents", [["display", "contents"]]), + t("list-item", [["display", "list-item"]]), + t("field-sizing-content", [["field-sizing", "content"]]), + t("field-sizing-fixed", [["field-sizing", "fixed"]]), + n("aspect", { + themeKeys: ["--aspect"], + handleBareValue: ({ fraction: l }) => { + if (l === null) return null; + let [p, g] = z(l, "/"); + return !E(p) || !E(g) ? null : l; + }, + handle: (l) => [o("aspect-ratio", l)], + staticValues: { auto: [o("aspect-ratio", "auto")], square: [o("aspect-ratio", "1 / 1")] }, + })); + for (let [l, p] of [ + ["full", "100%"], + ["svw", "100svw"], + ["lvw", "100lvw"], + ["dvw", "100dvw"], + ["svh", "100svh"], + ["lvh", "100lvh"], + ["dvh", "100dvh"], + ["min", "min-content"], + ["max", "max-content"], + ["fit", "fit-content"], + ]) + (t(`size-${l}`, [ + ["--tw-sort", "size"], + ["width", p], + ["height", p], + ]), + t(`w-${l}`, [["width", p]]), + t(`h-${l}`, [["height", p]]), + t(`min-w-${l}`, [["min-width", p]]), + t(`min-h-${l}`, [["min-height", p]]), + t(`max-w-${l}`, [["max-width", p]]), + t(`max-h-${l}`, [["max-height", p]])); + (t("size-auto", [ + ["--tw-sort", "size"], + ["width", "auto"], + ["height", "auto"], + ]), + t("w-auto", [["width", "auto"]]), + t("h-auto", [["height", "auto"]]), + t("min-w-auto", [["min-width", "auto"]]), + t("min-h-auto", [["min-height", "auto"]]), + t("h-lh", [["height", "1lh"]]), + t("min-h-lh", [["min-height", "1lh"]]), + t("max-h-lh", [["max-height", "1lh"]]), + t("w-screen", [["width", "100vw"]]), + t("min-w-screen", [["min-width", "100vw"]]), + t("max-w-screen", [["max-width", "100vw"]]), + t("h-screen", [["height", "100vh"]]), + t("min-h-screen", [["min-height", "100vh"]]), + t("max-h-screen", [["max-height", "100vh"]]), + t("max-w-none", [["max-width", "none"]]), + t("max-h-none", [["max-height", "none"]]), + a( + "size", + ["--size", "--spacing"], + (l) => [o("--tw-sort", "size"), o("width", l), o("height", l)], + { supportsFractions: !0 }, + )); + for (let [l, p, g] of [ + ["w", ["--width", "--spacing", "--container"], "width"], + ["min-w", ["--min-width", "--spacing", "--container"], "min-width"], + ["max-w", ["--max-width", "--spacing", "--container"], "max-width"], + ["h", ["--height", "--spacing"], "height"], + ["min-h", ["--min-height", "--height", "--spacing"], "min-height"], + ["max-h", ["--max-height", "--height", "--spacing"], "max-height"], + ]) + a(l, p, (A) => [o(g, A)], { supportsFractions: !0 }); + (r.static("container", () => { + let l = [...e.namespace("--breakpoint").values()]; + l.sort((g, A) => Ce(g, A, "asc")); + let p = [o("--tw-sort", "--tw-container-component"), o("width", "100%")]; + for (let g of l) p.push(M("@media", `(width >= ${g})`, [o("max-width", g)])); + return p; + }), + t("flex-auto", [["flex", "auto"]]), + t("flex-initial", [["flex", "0 auto"]]), + t("flex-none", [["flex", "none"]]), + r.functional("flex", (l) => { + if (l.value) { + if (l.value.kind === "arbitrary") return l.modifier ? void 0 : [o("flex", l.value.value)]; + if (l.value.fraction) { + let [p, g] = z(l.value.fraction, "/"); + return !E(p) || !E(g) ? void 0 : [o("flex", `calc(${l.value.fraction} * 100%)`)]; + } + if (E(l.value.value)) return l.modifier ? void 0 : [o("flex", l.value.value)]; + } + }), + i("flex", () => [ + { supportsFractions: !0 }, + { values: Array.from({ length: 12 }, (l, p) => `${p + 1}`) }, + ]), + n("shrink", { + defaultValue: "1", + handleBareValue: ({ value: l }) => (E(l) ? l : null), + handle: (l) => [o("flex-shrink", l)], + }), + n("grow", { + defaultValue: "1", + handleBareValue: ({ value: l }) => (E(l) ? l : null), + handle: (l) => [o("flex-grow", l)], + }), + i("shrink", () => [{ values: ["0"], valueThemeKeys: [], hasDefaultValue: !0 }]), + i("grow", () => [{ values: ["0"], valueThemeKeys: [], hasDefaultValue: !0 }]), + t("basis-auto", [["flex-basis", "auto"]]), + t("basis-full", [["flex-basis", "100%"]]), + a("basis", ["--flex-basis", "--spacing", "--container"], (l) => [o("flex-basis", l)], { + supportsFractions: !0, + }), + t("table-auto", [["table-layout", "auto"]]), + t("table-fixed", [["table-layout", "fixed"]]), + t("caption-top", [["caption-side", "top"]]), + t("caption-bottom", [["caption-side", "bottom"]]), + t("border-collapse", [["border-collapse", "collapse"]]), + t("border-separate", [["border-collapse", "separate"]])); + let m = () => + F([T("--tw-border-spacing-x", "0", ""), T("--tw-border-spacing-y", "0", "")]); + (a("border-spacing", ["--border-spacing", "--spacing"], (l) => [ + m(), + o("--tw-border-spacing-x", l), + o("--tw-border-spacing-y", l), + o("border-spacing", "var(--tw-border-spacing-x) var(--tw-border-spacing-y)"), + ]), + a("border-spacing-x", ["--border-spacing", "--spacing"], (l) => [ + m(), + o("--tw-border-spacing-x", l), + o("border-spacing", "var(--tw-border-spacing-x) var(--tw-border-spacing-y)"), + ]), + a("border-spacing-y", ["--border-spacing", "--spacing"], (l) => [ + m(), + o("--tw-border-spacing-y", l), + o("border-spacing", "var(--tw-border-spacing-x) var(--tw-border-spacing-y)"), + ]), + n("origin", { + themeKeys: ["--transform-origin"], + handle: (l) => [o("transform-origin", l)], + staticValues: { + center: [o("transform-origin", "center")], + top: [o("transform-origin", "top")], + "top-right": [o("transform-origin", "100% 0")], + right: [o("transform-origin", "100%")], + "bottom-right": [o("transform-origin", "100% 100%")], + bottom: [o("transform-origin", "bottom")], + "bottom-left": [o("transform-origin", "0 100%")], + left: [o("transform-origin", "0")], + "top-left": [o("transform-origin", "0 0")], + }, + }), + n("perspective-origin", { + themeKeys: ["--perspective-origin"], + handle: (l) => [o("perspective-origin", l)], + staticValues: { + center: [o("perspective-origin", "center")], + top: [o("perspective-origin", "top")], + "top-right": [o("perspective-origin", "100% 0")], + right: [o("perspective-origin", "100%")], + "bottom-right": [o("perspective-origin", "100% 100%")], + bottom: [o("perspective-origin", "bottom")], + "bottom-left": [o("perspective-origin", "0 100%")], + left: [o("perspective-origin", "0")], + "top-left": [o("perspective-origin", "0 0")], + }, + }), + n("perspective", { + themeKeys: ["--perspective"], + handle: (l) => [o("perspective", l)], + staticValues: { none: [o("perspective", "none")] }, + })); + let c = () => + F([T("--tw-translate-x", "0"), T("--tw-translate-y", "0"), T("--tw-translate-z", "0")]); + (t("translate-none", [["translate", "none"]]), + t("-translate-full", [ + c, + ["--tw-translate-x", "-100%"], + ["--tw-translate-y", "-100%"], + ["translate", "var(--tw-translate-x) var(--tw-translate-y)"], + ]), + t("translate-full", [ + c, + ["--tw-translate-x", "100%"], + ["--tw-translate-y", "100%"], + ["translate", "var(--tw-translate-x) var(--tw-translate-y)"], + ]), + a( + "translate", + ["--translate", "--spacing"], + (l) => [ + c(), + o("--tw-translate-x", l), + o("--tw-translate-y", l), + o("translate", "var(--tw-translate-x) var(--tw-translate-y)"), + ], + { supportsNegative: !0, supportsFractions: !0 }, + )); + for (let l of ["x", "y"]) + (t(`-translate-${l}-full`, [ + c, + [`--tw-translate-${l}`, "-100%"], + ["translate", "var(--tw-translate-x) var(--tw-translate-y)"], + ]), + t(`translate-${l}-full`, [ + c, + [`--tw-translate-${l}`, "100%"], + ["translate", "var(--tw-translate-x) var(--tw-translate-y)"], + ]), + a( + `translate-${l}`, + ["--translate", "--spacing"], + (p) => [ + c(), + o(`--tw-translate-${l}`, p), + o("translate", "var(--tw-translate-x) var(--tw-translate-y)"), + ], + { supportsNegative: !0, supportsFractions: !0 }, + )); + (a( + "translate-z", + ["--translate", "--spacing"], + (l) => [ + c(), + o("--tw-translate-z", l), + o("translate", "var(--tw-translate-x) var(--tw-translate-y) var(--tw-translate-z)"), + ], + { supportsNegative: !0 }, + ), + t("translate-3d", [ + c, + ["translate", "var(--tw-translate-x) var(--tw-translate-y) var(--tw-translate-z)"], + ])); + let u = () => F([T("--tw-scale-x", "1"), T("--tw-scale-y", "1"), T("--tw-scale-z", "1")]); + t("scale-none", [["scale", "none"]]); + function h({ negative: l }) { + return (p) => { + if (!p.value || p.modifier) return; + let g; + return p.value.kind === "arbitrary" + ? ((g = p.value.value), (g = l ? `calc(${g} * -1)` : g), [o("scale", g)]) + : ((g = e.resolve(p.value.value, ["--scale"])), + !g && E(p.value.value) && (g = `${p.value.value}%`), + g + ? ((g = l ? `calc(${g} * -1)` : g), + [ + u(), + o("--tw-scale-x", g), + o("--tw-scale-y", g), + o("--tw-scale-z", g), + o("scale", "var(--tw-scale-x) var(--tw-scale-y)"), + ]) + : void 0); + }; + } + (r.functional("-scale", h({ negative: !0 })), + r.functional("scale", h({ negative: !1 })), + i("scale", () => [ + { + supportsNegative: !0, + values: ["0", "50", "75", "90", "95", "100", "105", "110", "125", "150", "200"], + valueThemeKeys: ["--scale"], + }, + ])); + for (let l of ["x", "y", "z"]) + (n(`scale-${l}`, { + supportsNegative: !0, + themeKeys: ["--scale"], + handleBareValue: ({ value: p }) => (E(p) ? `${p}%` : null), + handle: (p) => [ + u(), + o(`--tw-scale-${l}`, p), + o("scale", `var(--tw-scale-x) var(--tw-scale-y)${l === "z" ? " var(--tw-scale-z)" : ""}`), + ], + }), + i(`scale-${l}`, () => [ + { + supportsNegative: !0, + values: ["0", "50", "75", "90", "95", "100", "105", "110", "125", "150", "200"], + valueThemeKeys: ["--scale"], + }, + ])); + (t("scale-3d", [u, ["scale", "var(--tw-scale-x) var(--tw-scale-y) var(--tw-scale-z)"]]), + t("rotate-none", [["rotate", "none"]])); + function d({ negative: l }) { + return (p) => { + if (!p.value || p.modifier) return; + let g; + if (p.value.kind === "arbitrary") { + g = p.value.value; + let A = p.value.dataType ?? Z(g, ["angle", "vector"]); + if (A === "vector") return [o("rotate", `${g} var(--tw-rotate)`)]; + if (A !== "angle") return [o("rotate", l ? `calc(${g} * -1)` : g)]; + } else if ( + ((g = e.resolve(p.value.value, ["--rotate"])), + !g && E(p.value.value) && (g = `${p.value.value}deg`), + !g) + ) + return; + return [o("rotate", l ? `calc(${g} * -1)` : g)]; + }; + } + (r.functional("-rotate", d({ negative: !0 })), + r.functional("rotate", d({ negative: !1 })), + i("rotate", () => [ + { + supportsNegative: !0, + values: ["0", "1", "2", "3", "6", "12", "45", "90", "180"], + valueThemeKeys: ["--rotate"], + }, + ])); + { + let l = [ + "var(--tw-rotate-x,)", + "var(--tw-rotate-y,)", + "var(--tw-rotate-z,)", + "var(--tw-skew-x,)", + "var(--tw-skew-y,)", + ].join(" "), + p = () => + F([ + T("--tw-rotate-x"), + T("--tw-rotate-y"), + T("--tw-rotate-z"), + T("--tw-skew-x"), + T("--tw-skew-y"), + ]); + for (let g of ["x", "y", "z"]) + (n(`rotate-${g}`, { + supportsNegative: !0, + themeKeys: ["--rotate"], + handleBareValue: ({ value: A }) => (E(A) ? `${A}deg` : null), + handle: (A) => [ + p(), + o(`--tw-rotate-${g}`, `rotate${g.toUpperCase()}(${A})`), + o("transform", l), + ], + }), + i(`rotate-${g}`, () => [ + { + supportsNegative: !0, + values: ["0", "1", "2", "3", "6", "12", "45", "90", "180"], + valueThemeKeys: ["--rotate"], + }, + ])); + (n("skew", { + supportsNegative: !0, + themeKeys: ["--skew"], + handleBareValue: ({ value: g }) => (E(g) ? `${g}deg` : null), + handle: (g) => [ + p(), + o("--tw-skew-x", `skewX(${g})`), + o("--tw-skew-y", `skewY(${g})`), + o("transform", l), + ], + }), + n("skew-x", { + supportsNegative: !0, + themeKeys: ["--skew"], + handleBareValue: ({ value: g }) => (E(g) ? `${g}deg` : null), + handle: (g) => [p(), o("--tw-skew-x", `skewX(${g})`), o("transform", l)], + }), + n("skew-y", { + supportsNegative: !0, + themeKeys: ["--skew"], + handleBareValue: ({ value: g }) => (E(g) ? `${g}deg` : null), + handle: (g) => [p(), o("--tw-skew-y", `skewY(${g})`), o("transform", l)], + }), + i("skew", () => [ + { + supportsNegative: !0, + values: ["0", "1", "2", "3", "6", "12"], + valueThemeKeys: ["--skew"], + }, + ]), + i("skew-x", () => [ + { + supportsNegative: !0, + values: ["0", "1", "2", "3", "6", "12"], + valueThemeKeys: ["--skew"], + }, + ]), + i("skew-y", () => [ + { + supportsNegative: !0, + values: ["0", "1", "2", "3", "6", "12"], + valueThemeKeys: ["--skew"], + }, + ]), + r.functional("transform", (g) => { + if (g.modifier) return; + let A = null; + if ((g.value ? g.value.kind === "arbitrary" && (A = g.value.value) : (A = l), A !== null)) + return [p(), o("transform", A)]; + }), + i("transform", () => [{ hasDefaultValue: !0 }]), + t("transform-cpu", [["transform", l]]), + t("transform-gpu", [["transform", `translateZ(0) ${l}`]]), + t("transform-none", [["transform", "none"]])); + } + (t("transform-flat", [["transform-style", "flat"]]), + t("transform-3d", [["transform-style", "preserve-3d"]]), + t("transform-content", [["transform-box", "content-box"]]), + t("transform-border", [["transform-box", "border-box"]]), + t("transform-fill", [["transform-box", "fill-box"]]), + t("transform-stroke", [["transform-box", "stroke-box"]]), + t("transform-view", [["transform-box", "view-box"]]), + t("backface-visible", [["backface-visibility", "visible"]]), + t("backface-hidden", [["backface-visibility", "hidden"]])); + for (let l of [ + "auto", + "default", + "pointer", + "wait", + "text", + "move", + "help", + "not-allowed", + "none", + "context-menu", + "progress", + "cell", + "crosshair", + "vertical-text", + "alias", + "copy", + "no-drop", + "grab", + "grabbing", + "all-scroll", + "col-resize", + "row-resize", + "n-resize", + "e-resize", + "s-resize", + "w-resize", + "ne-resize", + "nw-resize", + "se-resize", + "sw-resize", + "ew-resize", + "ns-resize", + "nesw-resize", + "nwse-resize", + "zoom-in", + "zoom-out", + ]) + t(`cursor-${l}`, [["cursor", l]]); + n("cursor", { themeKeys: ["--cursor"], handle: (l) => [o("cursor", l)] }); + for (let l of ["auto", "none", "manipulation"]) t(`touch-${l}`, [["touch-action", l]]); + let f = () => F([T("--tw-pan-x"), T("--tw-pan-y"), T("--tw-pinch-zoom")]); + for (let l of ["x", "left", "right"]) + t(`touch-pan-${l}`, [ + f, + ["--tw-pan-x", `pan-${l}`], + ["touch-action", "var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)"], + ]); + for (let l of ["y", "up", "down"]) + t(`touch-pan-${l}`, [ + f, + ["--tw-pan-y", `pan-${l}`], + ["touch-action", "var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)"], + ]); + t("touch-pinch-zoom", [ + f, + ["--tw-pinch-zoom", "pinch-zoom"], + ["touch-action", "var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)"], + ]); + for (let l of ["none", "text", "all", "auto"]) + t(`select-${l}`, [ + ["-webkit-user-select", l], + ["user-select", l], + ]); + (t("resize-none", [["resize", "none"]]), + t("resize-x", [["resize", "horizontal"]]), + t("resize-y", [["resize", "vertical"]]), + t("resize", [["resize", "both"]]), + t("snap-none", [["scroll-snap-type", "none"]])); + let v = () => F([T("--tw-scroll-snap-strictness", "proximity", "*")]); + for (let l of ["x", "y", "both"]) + t(`snap-${l}`, [v, ["scroll-snap-type", `${l} var(--tw-scroll-snap-strictness)`]]); + (t("snap-mandatory", [v, ["--tw-scroll-snap-strictness", "mandatory"]]), + t("snap-proximity", [v, ["--tw-scroll-snap-strictness", "proximity"]]), + t("snap-align-none", [["scroll-snap-align", "none"]]), + t("snap-start", [["scroll-snap-align", "start"]]), + t("snap-end", [["scroll-snap-align", "end"]]), + t("snap-center", [["scroll-snap-align", "center"]]), + t("snap-normal", [["scroll-snap-stop", "normal"]]), + t("snap-always", [["scroll-snap-stop", "always"]])); + for (let [l, p] of [ + ["scroll-m", "scroll-margin"], + ["scroll-mx", "scroll-margin-inline"], + ["scroll-my", "scroll-margin-block"], + ["scroll-ms", "scroll-margin-inline-start"], + ["scroll-me", "scroll-margin-inline-end"], + ["scroll-mt", "scroll-margin-top"], + ["scroll-mr", "scroll-margin-right"], + ["scroll-mb", "scroll-margin-bottom"], + ["scroll-ml", "scroll-margin-left"], + ]) + a(l, ["--scroll-margin", "--spacing"], (g) => [o(p, g)], { supportsNegative: !0 }); + for (let [l, p] of [ + ["scroll-p", "scroll-padding"], + ["scroll-px", "scroll-padding-inline"], + ["scroll-py", "scroll-padding-block"], + ["scroll-ps", "scroll-padding-inline-start"], + ["scroll-pe", "scroll-padding-inline-end"], + ["scroll-pt", "scroll-padding-top"], + ["scroll-pr", "scroll-padding-right"], + ["scroll-pb", "scroll-padding-bottom"], + ["scroll-pl", "scroll-padding-left"], + ]) + a(l, ["--scroll-padding", "--spacing"], (g) => [o(p, g)]); + (t("list-inside", [["list-style-position", "inside"]]), + t("list-outside", [["list-style-position", "outside"]]), + n("list", { + themeKeys: ["--list-style-type"], + handle: (l) => [o("list-style-type", l)], + staticValues: { + none: [o("list-style-type", "none")], + disc: [o("list-style-type", "disc")], + decimal: [o("list-style-type", "decimal")], + }, + }), + n("list-image", { + themeKeys: ["--list-style-image"], + handle: (l) => [o("list-style-image", l)], + staticValues: { none: [o("list-style-image", "none")] }, + }), + t("appearance-none", [["appearance", "none"]]), + t("appearance-auto", [["appearance", "auto"]]), + t("scheme-normal", [["color-scheme", "normal"]]), + t("scheme-dark", [["color-scheme", "dark"]]), + t("scheme-light", [["color-scheme", "light"]]), + t("scheme-light-dark", [["color-scheme", "light dark"]]), + t("scheme-only-dark", [["color-scheme", "only dark"]]), + t("scheme-only-light", [["color-scheme", "only light"]]), + n("columns", { + themeKeys: ["--columns", "--container"], + handleBareValue: ({ value: l }) => (E(l) ? l : null), + handle: (l) => [o("columns", l)], + staticValues: { auto: [o("columns", "auto")] }, + }), + i("columns", () => [ + { + values: Array.from({ length: 12 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--columns", "--container"], + }, + ])); + for (let l of ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"]) + t(`break-before-${l}`, [["break-before", l]]); + for (let l of ["auto", "avoid", "avoid-page", "avoid-column"]) + t(`break-inside-${l}`, [["break-inside", l]]); + for (let l of ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"]) + t(`break-after-${l}`, [["break-after", l]]); + (t("grid-flow-row", [["grid-auto-flow", "row"]]), + t("grid-flow-col", [["grid-auto-flow", "column"]]), + t("grid-flow-dense", [["grid-auto-flow", "dense"]]), + t("grid-flow-row-dense", [["grid-auto-flow", "row dense"]]), + t("grid-flow-col-dense", [["grid-auto-flow", "column dense"]]), + n("auto-cols", { + themeKeys: ["--grid-auto-columns"], + handle: (l) => [o("grid-auto-columns", l)], + staticValues: { + auto: [o("grid-auto-columns", "auto")], + min: [o("grid-auto-columns", "min-content")], + max: [o("grid-auto-columns", "max-content")], + fr: [o("grid-auto-columns", "minmax(0, 1fr)")], + }, + }), + n("auto-rows", { + themeKeys: ["--grid-auto-rows"], + handle: (l) => [o("grid-auto-rows", l)], + staticValues: { + auto: [o("grid-auto-rows", "auto")], + min: [o("grid-auto-rows", "min-content")], + max: [o("grid-auto-rows", "max-content")], + fr: [o("grid-auto-rows", "minmax(0, 1fr)")], + }, + }), + n("grid-cols", { + themeKeys: ["--grid-template-columns"], + handleBareValue: ({ value: l }) => (zt(l) ? `repeat(${l}, minmax(0, 1fr))` : null), + handle: (l) => [o("grid-template-columns", l)], + staticValues: { + none: [o("grid-template-columns", "none")], + subgrid: [o("grid-template-columns", "subgrid")], + }, + }), + n("grid-rows", { + themeKeys: ["--grid-template-rows"], + handleBareValue: ({ value: l }) => (zt(l) ? `repeat(${l}, minmax(0, 1fr))` : null), + handle: (l) => [o("grid-template-rows", l)], + staticValues: { + none: [o("grid-template-rows", "none")], + subgrid: [o("grid-template-rows", "subgrid")], + }, + }), + i("grid-cols", () => [ + { + values: Array.from({ length: 12 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--grid-template-columns"], + }, + ]), + i("grid-rows", () => [ + { + values: Array.from({ length: 12 }, (l, p) => `${p + 1}`), + valueThemeKeys: ["--grid-template-rows"], + }, + ]), + t("flex-row", [["flex-direction", "row"]]), + t("flex-row-reverse", [["flex-direction", "row-reverse"]]), + t("flex-col", [["flex-direction", "column"]]), + t("flex-col-reverse", [["flex-direction", "column-reverse"]]), + t("flex-wrap", [["flex-wrap", "wrap"]]), + t("flex-nowrap", [["flex-wrap", "nowrap"]]), + t("flex-wrap-reverse", [["flex-wrap", "wrap-reverse"]]), + t("place-content-center", [["place-content", "center"]]), + t("place-content-start", [["place-content", "start"]]), + t("place-content-end", [["place-content", "end"]]), + t("place-content-center-safe", [["place-content", "safe center"]]), + t("place-content-end-safe", [["place-content", "safe end"]]), + t("place-content-between", [["place-content", "space-between"]]), + t("place-content-around", [["place-content", "space-around"]]), + t("place-content-evenly", [["place-content", "space-evenly"]]), + t("place-content-baseline", [["place-content", "baseline"]]), + t("place-content-stretch", [["place-content", "stretch"]]), + t("place-items-center", [["place-items", "center"]]), + t("place-items-start", [["place-items", "start"]]), + t("place-items-end", [["place-items", "end"]]), + t("place-items-center-safe", [["place-items", "safe center"]]), + t("place-items-end-safe", [["place-items", "safe end"]]), + t("place-items-baseline", [["place-items", "baseline"]]), + t("place-items-stretch", [["place-items", "stretch"]]), + t("content-normal", [["align-content", "normal"]]), + t("content-center", [["align-content", "center"]]), + t("content-start", [["align-content", "flex-start"]]), + t("content-end", [["align-content", "flex-end"]]), + t("content-center-safe", [["align-content", "safe center"]]), + t("content-end-safe", [["align-content", "safe flex-end"]]), + t("content-between", [["align-content", "space-between"]]), + t("content-around", [["align-content", "space-around"]]), + t("content-evenly", [["align-content", "space-evenly"]]), + t("content-baseline", [["align-content", "baseline"]]), + t("content-stretch", [["align-content", "stretch"]]), + t("items-center", [["align-items", "center"]]), + t("items-start", [["align-items", "flex-start"]]), + t("items-end", [["align-items", "flex-end"]]), + t("items-center-safe", [["align-items", "safe center"]]), + t("items-end-safe", [["align-items", "safe flex-end"]]), + t("items-baseline", [["align-items", "baseline"]]), + t("items-baseline-last", [["align-items", "last baseline"]]), + t("items-stretch", [["align-items", "stretch"]]), + t("justify-normal", [["justify-content", "normal"]]), + t("justify-center", [["justify-content", "center"]]), + t("justify-start", [["justify-content", "flex-start"]]), + t("justify-end", [["justify-content", "flex-end"]]), + t("justify-center-safe", [["justify-content", "safe center"]]), + t("justify-end-safe", [["justify-content", "safe flex-end"]]), + t("justify-between", [["justify-content", "space-between"]]), + t("justify-around", [["justify-content", "space-around"]]), + t("justify-evenly", [["justify-content", "space-evenly"]]), + t("justify-baseline", [["justify-content", "baseline"]]), + t("justify-stretch", [["justify-content", "stretch"]]), + t("justify-items-normal", [["justify-items", "normal"]]), + t("justify-items-center", [["justify-items", "center"]]), + t("justify-items-start", [["justify-items", "start"]]), + t("justify-items-end", [["justify-items", "end"]]), + t("justify-items-center-safe", [["justify-items", "safe center"]]), + t("justify-items-end-safe", [["justify-items", "safe end"]]), + t("justify-items-stretch", [["justify-items", "stretch"]]), + a("gap", ["--gap", "--spacing"], (l) => [o("gap", l)]), + a("gap-x", ["--gap", "--spacing"], (l) => [o("column-gap", l)]), + a("gap-y", ["--gap", "--spacing"], (l) => [o("row-gap", l)]), + a( + "space-x", + ["--space", "--spacing"], + (l) => [ + F([T("--tw-space-x-reverse", "0")]), + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "row-gap"), + o("--tw-space-x-reverse", "0"), + o("margin-inline-start", `calc(${l} * var(--tw-space-x-reverse))`), + o("margin-inline-end", `calc(${l} * calc(1 - var(--tw-space-x-reverse)))`), + ]), + ], + { supportsNegative: !0 }, + ), + a( + "space-y", + ["--space", "--spacing"], + (l) => [ + F([T("--tw-space-y-reverse", "0")]), + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "column-gap"), + o("--tw-space-y-reverse", "0"), + o("margin-block-start", `calc(${l} * var(--tw-space-y-reverse))`), + o("margin-block-end", `calc(${l} * calc(1 - var(--tw-space-y-reverse)))`), + ]), + ], + { supportsNegative: !0 }, + ), + t("space-x-reverse", [ + () => F([T("--tw-space-x-reverse", "0")]), + () => + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "row-gap"), + o("--tw-space-x-reverse", "1"), + ]), + ]), + t("space-y-reverse", [ + () => F([T("--tw-space-y-reverse", "0")]), + () => + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "column-gap"), + o("--tw-space-y-reverse", "1"), + ]), + ]), + t("accent-auto", [["accent-color", "auto"]]), + s("accent", { + themeKeys: ["--accent-color", "--color"], + handle: (l) => [o("accent-color", l)], + }), + s("caret", { themeKeys: ["--caret-color", "--color"], handle: (l) => [o("caret-color", l)] }), + s("divide", { + themeKeys: ["--divide-color", "--border-color", "--color"], + handle: (l) => [ + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "divide-color"), + o("border-color", l), + ]), + ], + }), + t("place-self-auto", [["place-self", "auto"]]), + t("place-self-start", [["place-self", "start"]]), + t("place-self-end", [["place-self", "end"]]), + t("place-self-center", [["place-self", "center"]]), + t("place-self-end-safe", [["place-self", "safe end"]]), + t("place-self-center-safe", [["place-self", "safe center"]]), + t("place-self-stretch", [["place-self", "stretch"]]), + t("self-auto", [["align-self", "auto"]]), + t("self-start", [["align-self", "flex-start"]]), + t("self-end", [["align-self", "flex-end"]]), + t("self-center", [["align-self", "center"]]), + t("self-end-safe", [["align-self", "safe flex-end"]]), + t("self-center-safe", [["align-self", "safe center"]]), + t("self-stretch", [["align-self", "stretch"]]), + t("self-baseline", [["align-self", "baseline"]]), + t("self-baseline-last", [["align-self", "last baseline"]]), + t("justify-self-auto", [["justify-self", "auto"]]), + t("justify-self-start", [["justify-self", "flex-start"]]), + t("justify-self-end", [["justify-self", "flex-end"]]), + t("justify-self-center", [["justify-self", "center"]]), + t("justify-self-end-safe", [["justify-self", "safe flex-end"]]), + t("justify-self-center-safe", [["justify-self", "safe center"]]), + t("justify-self-stretch", [["justify-self", "stretch"]])); + for (let l of ["auto", "hidden", "clip", "visible", "scroll"]) + (t(`overflow-${l}`, [["overflow", l]]), + t(`overflow-x-${l}`, [["overflow-x", l]]), + t(`overflow-y-${l}`, [["overflow-y", l]])); + for (let l of ["auto", "contain", "none"]) + (t(`overscroll-${l}`, [["overscroll-behavior", l]]), + t(`overscroll-x-${l}`, [["overscroll-behavior-x", l]]), + t(`overscroll-y-${l}`, [["overscroll-behavior-y", l]])); + (t("scroll-auto", [["scroll-behavior", "auto"]]), + t("scroll-smooth", [["scroll-behavior", "smooth"]]), + t("truncate", [ + ["overflow", "hidden"], + ["text-overflow", "ellipsis"], + ["white-space", "nowrap"], + ]), + t("text-ellipsis", [["text-overflow", "ellipsis"]]), + t("text-clip", [["text-overflow", "clip"]]), + t("hyphens-none", [ + ["-webkit-hyphens", "none"], + ["hyphens", "none"], + ]), + t("hyphens-manual", [ + ["-webkit-hyphens", "manual"], + ["hyphens", "manual"], + ]), + t("hyphens-auto", [ + ["-webkit-hyphens", "auto"], + ["hyphens", "auto"], + ]), + t("whitespace-normal", [["white-space", "normal"]]), + t("whitespace-nowrap", [["white-space", "nowrap"]]), + t("whitespace-pre", [["white-space", "pre"]]), + t("whitespace-pre-line", [["white-space", "pre-line"]]), + t("whitespace-pre-wrap", [["white-space", "pre-wrap"]]), + t("whitespace-break-spaces", [["white-space", "break-spaces"]]), + t("text-wrap", [["text-wrap", "wrap"]]), + t("text-nowrap", [["text-wrap", "nowrap"]]), + t("text-balance", [["text-wrap", "balance"]]), + t("text-pretty", [["text-wrap", "pretty"]]), + t("break-normal", [ + ["overflow-wrap", "normal"], + ["word-break", "normal"], + ]), + t("break-all", [["word-break", "break-all"]]), + t("break-keep", [["word-break", "keep-all"]]), + t("wrap-anywhere", [["overflow-wrap", "anywhere"]]), + t("wrap-break-word", [["overflow-wrap", "break-word"]]), + t("wrap-normal", [["overflow-wrap", "normal"]])); + for (let [l, p] of [ + ["rounded", ["border-radius"]], + ["rounded-s", ["border-start-start-radius", "border-end-start-radius"]], + ["rounded-e", ["border-start-end-radius", "border-end-end-radius"]], + ["rounded-t", ["border-top-left-radius", "border-top-right-radius"]], + ["rounded-r", ["border-top-right-radius", "border-bottom-right-radius"]], + ["rounded-b", ["border-bottom-right-radius", "border-bottom-left-radius"]], + ["rounded-l", ["border-top-left-radius", "border-bottom-left-radius"]], + ["rounded-ss", ["border-start-start-radius"]], + ["rounded-se", ["border-start-end-radius"]], + ["rounded-ee", ["border-end-end-radius"]], + ["rounded-es", ["border-end-start-radius"]], + ["rounded-tl", ["border-top-left-radius"]], + ["rounded-tr", ["border-top-right-radius"]], + ["rounded-br", ["border-bottom-right-radius"]], + ["rounded-bl", ["border-bottom-left-radius"]], + ]) + n(l, { + themeKeys: ["--radius"], + handle: (g) => p.map((A) => o(A, g)), + staticValues: { + none: p.map((g) => o(g, "0")), + full: p.map((g) => o(g, "calc(infinity * 1px)")), + }, + }); + (t("border-solid", [ + ["--tw-border-style", "solid"], + ["border-style", "solid"], + ]), + t("border-dashed", [ + ["--tw-border-style", "dashed"], + ["border-style", "dashed"], + ]), + t("border-dotted", [ + ["--tw-border-style", "dotted"], + ["border-style", "dotted"], + ]), + t("border-double", [ + ["--tw-border-style", "double"], + ["border-style", "double"], + ]), + t("border-hidden", [ + ["--tw-border-style", "hidden"], + ["border-style", "hidden"], + ]), + t("border-none", [ + ["--tw-border-style", "none"], + ["border-style", "none"], + ])); + { + let p = function (g, A) { + (r.functional(g, (b) => { + if (!b.value) { + if (b.modifier) return; + let $ = e.get(["--default-border-width"]) ?? "1px", + _ = A.width($); + return _ ? [l(), ..._] : void 0; + } + if (b.value.kind === "arbitrary") { + let $ = b.value.value; + switch (b.value.dataType ?? Z($, ["color", "line-width", "length"])) { + case "line-width": + case "length": { + if (b.modifier) return; + let N = A.width($); + return N ? [l(), ...N] : void 0; + } + default: + return (($ = X($, b.modifier, e)), $ === null ? void 0 : A.color($)); + } + } + { + let $ = ee(b, e, ["--border-color", "--color"]); + if ($) return A.color($); + } + { + if (b.modifier) return; + let $ = e.resolve(b.value.value, ["--border-width"]); + if ($) { + let _ = A.width($); + return _ ? [l(), ..._] : void 0; + } + if (E(b.value.value)) { + let _ = A.width(`${b.value.value}px`); + return _ ? [l(), ..._] : void 0; + } + } + }), + i(g, () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--border-color", "--color"], + modifiers: Array.from({ length: 21 }, (b, $) => `${$ * 5}`), + hasDefaultValue: !0, + }, + { values: ["0", "2", "4", "8"], valueThemeKeys: ["--border-width"] }, + ])); + }; + var U = p; + let l = () => F([T("--tw-border-style", "solid")]); + (p("border", { + width: (g) => [o("border-style", "var(--tw-border-style)"), o("border-width", g)], + color: (g) => [o("border-color", g)], + }), + p("border-x", { + width: (g) => [ + o("border-inline-style", "var(--tw-border-style)"), + o("border-inline-width", g), + ], + color: (g) => [o("border-inline-color", g)], + }), + p("border-y", { + width: (g) => [ + o("border-block-style", "var(--tw-border-style)"), + o("border-block-width", g), + ], + color: (g) => [o("border-block-color", g)], + }), + p("border-s", { + width: (g) => [ + o("border-inline-start-style", "var(--tw-border-style)"), + o("border-inline-start-width", g), + ], + color: (g) => [o("border-inline-start-color", g)], + }), + p("border-e", { + width: (g) => [ + o("border-inline-end-style", "var(--tw-border-style)"), + o("border-inline-end-width", g), + ], + color: (g) => [o("border-inline-end-color", g)], + }), + p("border-t", { + width: (g) => [o("border-top-style", "var(--tw-border-style)"), o("border-top-width", g)], + color: (g) => [o("border-top-color", g)], + }), + p("border-r", { + width: (g) => [ + o("border-right-style", "var(--tw-border-style)"), + o("border-right-width", g), + ], + color: (g) => [o("border-right-color", g)], + }), + p("border-b", { + width: (g) => [ + o("border-bottom-style", "var(--tw-border-style)"), + o("border-bottom-width", g), + ], + color: (g) => [o("border-bottom-color", g)], + }), + p("border-l", { + width: (g) => [ + o("border-left-style", "var(--tw-border-style)"), + o("border-left-width", g), + ], + color: (g) => [o("border-left-color", g)], + }), + n("divide-x", { + defaultValue: e.get(["--default-border-width"]) ?? "1px", + themeKeys: ["--divide-width", "--border-width"], + handleBareValue: ({ value: g }) => (E(g) ? `${g}px` : null), + handle: (g) => [ + F([T("--tw-divide-x-reverse", "0")]), + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "divide-x-width"), + l(), + o("--tw-divide-x-reverse", "0"), + o("border-inline-style", "var(--tw-border-style)"), + o("border-inline-start-width", `calc(${g} * var(--tw-divide-x-reverse))`), + o("border-inline-end-width", `calc(${g} * calc(1 - var(--tw-divide-x-reverse)))`), + ]), + ], + }), + n("divide-y", { + defaultValue: e.get(["--default-border-width"]) ?? "1px", + themeKeys: ["--divide-width", "--border-width"], + handleBareValue: ({ value: g }) => (E(g) ? `${g}px` : null), + handle: (g) => [ + F([T("--tw-divide-y-reverse", "0")]), + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "divide-y-width"), + l(), + o("--tw-divide-y-reverse", "0"), + o("border-bottom-style", "var(--tw-border-style)"), + o("border-top-style", "var(--tw-border-style)"), + o("border-top-width", `calc(${g} * var(--tw-divide-y-reverse))`), + o("border-bottom-width", `calc(${g} * calc(1 - var(--tw-divide-y-reverse)))`), + ]), + ], + }), + i("divide-x", () => [ + { + values: ["0", "2", "4", "8"], + valueThemeKeys: ["--divide-width", "--border-width"], + hasDefaultValue: !0, + }, + ]), + i("divide-y", () => [ + { + values: ["0", "2", "4", "8"], + valueThemeKeys: ["--divide-width", "--border-width"], + hasDefaultValue: !0, + }, + ]), + t("divide-x-reverse", [ + () => F([T("--tw-divide-x-reverse", "0")]), + () => q(":where(& > :not(:last-child))", [o("--tw-divide-x-reverse", "1")]), + ]), + t("divide-y-reverse", [ + () => F([T("--tw-divide-y-reverse", "0")]), + () => q(":where(& > :not(:last-child))", [o("--tw-divide-y-reverse", "1")]), + ])); + for (let g of ["solid", "dashed", "dotted", "double", "none"]) + t(`divide-${g}`, [ + () => + q(":where(& > :not(:last-child))", [ + o("--tw-sort", "divide-style"), + o("--tw-border-style", g), + o("border-style", g), + ]), + ]); + } + (t("bg-auto", [["background-size", "auto"]]), + t("bg-cover", [["background-size", "cover"]]), + t("bg-contain", [["background-size", "contain"]]), + n("bg-size", { + handle(l) { + if (l) return [o("background-size", l)]; + }, + }), + t("bg-fixed", [["background-attachment", "fixed"]]), + t("bg-local", [["background-attachment", "local"]]), + t("bg-scroll", [["background-attachment", "scroll"]]), + t("bg-top", [["background-position", "top"]]), + t("bg-top-left", [["background-position", "left top"]]), + t("bg-top-right", [["background-position", "right top"]]), + t("bg-bottom", [["background-position", "bottom"]]), + t("bg-bottom-left", [["background-position", "left bottom"]]), + t("bg-bottom-right", [["background-position", "right bottom"]]), + t("bg-left", [["background-position", "left"]]), + t("bg-right", [["background-position", "right"]]), + t("bg-center", [["background-position", "center"]]), + n("bg-position", { + handle(l) { + if (l) return [o("background-position", l)]; + }, + }), + t("bg-repeat", [["background-repeat", "repeat"]]), + t("bg-no-repeat", [["background-repeat", "no-repeat"]]), + t("bg-repeat-x", [["background-repeat", "repeat-x"]]), + t("bg-repeat-y", [["background-repeat", "repeat-y"]]), + t("bg-repeat-round", [["background-repeat", "round"]]), + t("bg-repeat-space", [["background-repeat", "space"]]), + t("bg-none", [["background-image", "none"]])); + { + let g = function ($) { + let _ = "in oklab"; + if ($?.kind === "named") + switch ($.value) { + case "longer": + case "shorter": + case "increasing": + case "decreasing": + _ = `in oklch ${$.value} hue`; + break; + default: + _ = `in ${$.value}`; + } + else $?.kind === "arbitrary" && (_ = $.value); + return _; + }, + A = function ({ negative: $ }) { + return (_) => { + if (!_.value) return; + if (_.value.kind === "arbitrary") { + if (_.modifier) return; + let I = _.value.value; + switch (_.value.dataType ?? Z(I, ["angle"])) { + case "angle": + return ( + (I = $ ? `calc(${I} * -1)` : `${I}`), + [ + o("--tw-gradient-position", I), + o("background-image", `linear-gradient(var(--tw-gradient-stops,${I}))`), + ] + ); + default: + return $ + ? void 0 + : [ + o("--tw-gradient-position", I), + o("background-image", `linear-gradient(var(--tw-gradient-stops,${I}))`), + ]; + } + } + let N = _.value.value; + if (!$ && p.has(N)) N = p.get(N); + else if (E(N)) N = $ ? `calc(${N}deg * -1)` : `${N}deg`; + else return; + let S = g(_.modifier); + return [ + o("--tw-gradient-position", `${N}`), + Y("@supports (background-image: linear-gradient(in lab, red, red))", [ + o("--tw-gradient-position", `${N} ${S}`), + ]), + o("background-image", "linear-gradient(var(--tw-gradient-stops))"), + ]; + }; + }, + b = function ({ negative: $ }) { + return (_) => { + if (_.value?.kind === "arbitrary") { + if (_.modifier) return; + let I = _.value.value; + return [ + o("--tw-gradient-position", I), + o("background-image", `conic-gradient(var(--tw-gradient-stops,${I}))`), + ]; + } + let N = g(_.modifier); + if (!_.value) + return [ + o("--tw-gradient-position", N), + o("background-image", "conic-gradient(var(--tw-gradient-stops))"), + ]; + let S = _.value.value; + if (E(S)) + return ( + (S = $ ? `calc(${S}deg * -1)` : `${S}deg`), + [ + o("--tw-gradient-position", `from ${S} ${N}`), + o("background-image", "conic-gradient(var(--tw-gradient-stops))"), + ] + ); + }; + }; + var j = g, + W = A, + B = b; + let l = ["oklab", "oklch", "srgb", "hsl", "longer", "shorter", "increasing", "decreasing"], + p = new Map([ + ["to-t", "to top"], + ["to-tr", "to top right"], + ["to-r", "to right"], + ["to-br", "to bottom right"], + ["to-b", "to bottom"], + ["to-bl", "to bottom left"], + ["to-l", "to left"], + ["to-tl", "to top left"], + ]); + (r.functional("-bg-linear", A({ negative: !0 })), + r.functional("bg-linear", A({ negative: !1 })), + i("bg-linear", () => [ + { values: [...p.keys()], modifiers: l }, + { + values: ["0", "30", "60", "90", "120", "150", "180", "210", "240", "270", "300", "330"], + supportsNegative: !0, + modifiers: l, + }, + ]), + r.functional("-bg-conic", b({ negative: !0 })), + r.functional("bg-conic", b({ negative: !1 })), + i("bg-conic", () => [ + { hasDefaultValue: !0, modifiers: l }, + { + values: ["0", "30", "60", "90", "120", "150", "180", "210", "240", "270", "300", "330"], + supportsNegative: !0, + modifiers: l, + }, + ]), + r.functional("bg-radial", ($) => { + if (!$.value) { + let _ = g($.modifier); + return [ + o("--tw-gradient-position", _), + o("background-image", "radial-gradient(var(--tw-gradient-stops))"), + ]; + } + if ($.value.kind === "arbitrary") { + if ($.modifier) return; + let _ = $.value.value; + return [ + o("--tw-gradient-position", _), + o("background-image", `radial-gradient(var(--tw-gradient-stops,${_}))`), + ]; + } + }), + i("bg-radial", () => [{ hasDefaultValue: !0, modifiers: l }])); + } + (r.functional("bg", (l) => { + if (l.value) { + if (l.value.kind === "arbitrary") { + let p = l.value.value; + switch ( + l.value.dataType ?? + Z(p, ["image", "color", "percentage", "position", "bg-size", "length", "url"]) + ) { + case "percentage": + case "position": + return l.modifier ? void 0 : [o("background-position", p)]; + case "bg-size": + case "length": + case "size": + return l.modifier ? void 0 : [o("background-size", p)]; + case "image": + case "url": + return l.modifier ? void 0 : [o("background-image", p)]; + default: + return ((p = X(p, l.modifier, e)), p === null ? void 0 : [o("background-color", p)]); + } + } + { + let p = ee(l, e, ["--background-color", "--color"]); + if (p) return [o("background-color", p)]; + } + { + if (l.modifier) return; + let p = e.resolve(l.value.value, ["--background-image"]); + if (p) return [o("background-image", p)]; + } + } + }), + i("bg", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--background-color", "--color"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + }, + { values: [], valueThemeKeys: ["--background-image"] }, + ])); + let k = () => + F([ + T("--tw-gradient-position"), + T("--tw-gradient-from", "#0000", ""), + T("--tw-gradient-via", "#0000", ""), + T("--tw-gradient-to", "#0000", ""), + T("--tw-gradient-stops"), + T("--tw-gradient-via-stops"), + T("--tw-gradient-from-position", "0%", ""), + T("--tw-gradient-via-position", "50%", ""), + T("--tw-gradient-to-position", "100%", ""), + ]); + function w(l, p) { + (r.functional(l, (g) => { + if (g.value) { + if (g.value.kind === "arbitrary") { + let A = g.value.value; + switch (g.value.dataType ?? Z(A, ["color", "length", "percentage"])) { + case "length": + case "percentage": + return g.modifier ? void 0 : p.position(A); + default: + return ((A = X(A, g.modifier, e)), A === null ? void 0 : p.color(A)); + } + } + { + let A = ee(g, e, ["--background-color", "--color"]); + if (A) return p.color(A); + } + { + if (g.modifier) return; + let A = e.resolve(g.value.value, ["--gradient-color-stop-positions"]); + if (A) return p.position(A); + if (g.value.value[g.value.value.length - 1] === "%" && E(g.value.value.slice(0, -1))) + return p.position(g.value.value); + } + } + }), + i(l, () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--background-color", "--color"], + modifiers: Array.from({ length: 21 }, (g, A) => `${A * 5}`), + }, + { + values: Array.from({ length: 21 }, (g, A) => `${A * 5}%`), + valueThemeKeys: ["--gradient-color-stop-positions"], + }, + ])); + } + (w("from", { + color: (l) => [ + k(), + o("--tw-sort", "--tw-gradient-from"), + o("--tw-gradient-from", l), + o( + "--tw-gradient-stops", + "var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))", + ), + ], + position: (l) => [k(), o("--tw-gradient-from-position", l)], + }), + t("via-none", [["--tw-gradient-via-stops", "initial"]]), + w("via", { + color: (l) => [ + k(), + o("--tw-sort", "--tw-gradient-via"), + o("--tw-gradient-via", l), + o( + "--tw-gradient-via-stops", + "var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position)", + ), + o("--tw-gradient-stops", "var(--tw-gradient-via-stops)"), + ], + position: (l) => [k(), o("--tw-gradient-via-position", l)], + }), + w("to", { + color: (l) => [ + k(), + o("--tw-sort", "--tw-gradient-to"), + o("--tw-gradient-to", l), + o( + "--tw-gradient-stops", + "var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))", + ), + ], + position: (l) => [k(), o("--tw-gradient-to-position", l)], + }), + t("mask-none", [["mask-image", "none"]]), + r.functional("mask", (l) => { + if (!l.value || l.modifier || l.value.kind !== "arbitrary") return; + let p = l.value.value; + switch ( + l.value.dataType ?? + Z(p, ["image", "percentage", "position", "bg-size", "length", "url"]) + ) { + case "percentage": + case "position": + return l.modifier ? void 0 : [o("mask-position", p)]; + case "bg-size": + case "length": + case "size": + return [o("mask-size", p)]; + case "image": + case "url": + default: + return [o("mask-image", p)]; + } + }), + t("mask-add", [["mask-composite", "add"]]), + t("mask-subtract", [["mask-composite", "subtract"]]), + t("mask-intersect", [["mask-composite", "intersect"]]), + t("mask-exclude", [["mask-composite", "exclude"]]), + t("mask-alpha", [["mask-mode", "alpha"]]), + t("mask-luminance", [["mask-mode", "luminance"]]), + t("mask-match", [["mask-mode", "match-source"]]), + t("mask-type-alpha", [["mask-type", "alpha"]]), + t("mask-type-luminance", [["mask-type", "luminance"]]), + t("mask-auto", [["mask-size", "auto"]]), + t("mask-cover", [["mask-size", "cover"]]), + t("mask-contain", [["mask-size", "contain"]]), + n("mask-size", { + handle(l) { + if (l) return [o("mask-size", l)]; + }, + }), + t("mask-top", [["mask-position", "top"]]), + t("mask-top-left", [["mask-position", "left top"]]), + t("mask-top-right", [["mask-position", "right top"]]), + t("mask-bottom", [["mask-position", "bottom"]]), + t("mask-bottom-left", [["mask-position", "left bottom"]]), + t("mask-bottom-right", [["mask-position", "right bottom"]]), + t("mask-left", [["mask-position", "left"]]), + t("mask-right", [["mask-position", "right"]]), + t("mask-center", [["mask-position", "center"]]), + n("mask-position", { + handle(l) { + if (l) return [o("mask-position", l)]; + }, + }), + t("mask-repeat", [["mask-repeat", "repeat"]]), + t("mask-no-repeat", [["mask-repeat", "no-repeat"]]), + t("mask-repeat-x", [["mask-repeat", "repeat-x"]]), + t("mask-repeat-y", [["mask-repeat", "repeat-y"]]), + t("mask-repeat-round", [["mask-repeat", "round"]]), + t("mask-repeat-space", [["mask-repeat", "space"]]), + t("mask-clip-border", [["mask-clip", "border-box"]]), + t("mask-clip-padding", [["mask-clip", "padding-box"]]), + t("mask-clip-content", [["mask-clip", "content-box"]]), + t("mask-clip-fill", [["mask-clip", "fill-box"]]), + t("mask-clip-stroke", [["mask-clip", "stroke-box"]]), + t("mask-clip-view", [["mask-clip", "view-box"]]), + t("mask-no-clip", [["mask-clip", "no-clip"]]), + t("mask-origin-border", [["mask-origin", "border-box"]]), + t("mask-origin-padding", [["mask-origin", "padding-box"]]), + t("mask-origin-content", [["mask-origin", "content-box"]]), + t("mask-origin-fill", [["mask-origin", "fill-box"]]), + t("mask-origin-stroke", [["mask-origin", "stroke-box"]]), + t("mask-origin-view", [["mask-origin", "view-box"]])); + let x = () => + F([ + T("--tw-mask-linear", "linear-gradient(#fff, #fff)"), + T("--tw-mask-radial", "linear-gradient(#fff, #fff)"), + T("--tw-mask-conic", "linear-gradient(#fff, #fff)"), + ]); + function V(l, p) { + (r.functional(l, (g) => { + if (g.value) { + if (g.value.kind === "arbitrary") { + let A = g.value.value; + switch (g.value.dataType ?? Z(A, ["length", "percentage", "color"])) { + case "color": + return ((A = X(A, g.modifier, e)), A === null ? void 0 : p.color(A)); + case "percentage": + return g.modifier || !E(A.slice(0, -1)) ? void 0 : p.position(A); + default: + return g.modifier ? void 0 : p.position(A); + } + } + { + let A = ee(g, e, ["--background-color", "--color"]); + if (A) return p.color(A); + } + { + if (g.modifier) return; + let A = Z(g.value.value, ["number", "percentage"]); + if (!A) return; + switch (A) { + case "number": { + let b = e.resolve(null, ["--spacing"]); + return !b || !Te(g.value.value) + ? void 0 + : p.position(`calc(${b} * ${g.value.value})`); + } + case "percentage": + return E(g.value.value.slice(0, -1)) ? p.position(g.value.value) : void 0; + default: + return; + } + } + } + }), + i(l, () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--background-color", "--color"], + modifiers: Array.from({ length: 21 }, (g, A) => `${A * 5}`), + }, + { + values: Array.from({ length: 21 }, (g, A) => `${A * 5}%`), + valueThemeKeys: ["--gradient-color-stop-positions"], + }, + ]), + i(l, () => [ + { values: Array.from({ length: 21 }, (g, A) => `${A * 5}%`) }, + { values: e.get(["--spacing"]) ? st : [] }, + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--background-color", "--color"], + modifiers: Array.from({ length: 21 }, (g, A) => `${A * 5}`), + }, + ])); + } + let C = () => + F([ + T("--tw-mask-left", "linear-gradient(#fff, #fff)"), + T("--tw-mask-right", "linear-gradient(#fff, #fff)"), + T("--tw-mask-bottom", "linear-gradient(#fff, #fff)"), + T("--tw-mask-top", "linear-gradient(#fff, #fff)"), + ]); + function y(l, p, g) { + V(l, { + color(A) { + let b = [ + x(), + C(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-linear", + "var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top)", + ), + ]; + for (let $ of ["top", "right", "bottom", "left"]) + g[$] && + (b.push( + o( + `--tw-mask-${$}`, + `linear-gradient(to ${$}, var(--tw-mask-${$}-from-color) var(--tw-mask-${$}-from-position), var(--tw-mask-${$}-to-color) var(--tw-mask-${$}-to-position))`, + ), + ), + b.push( + F([ + T(`--tw-mask-${$}-from-position`, "0%"), + T(`--tw-mask-${$}-to-position`, "100%"), + T(`--tw-mask-${$}-from-color`, "black"), + T(`--tw-mask-${$}-to-color`, "transparent"), + ]), + ), + b.push(o(`--tw-mask-${$}-${p}-color`, A))); + return b; + }, + position(A) { + let b = [ + x(), + C(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-linear", + "var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top)", + ), + ]; + for (let $ of ["top", "right", "bottom", "left"]) + g[$] && + (b.push( + o( + `--tw-mask-${$}`, + `linear-gradient(to ${$}, var(--tw-mask-${$}-from-color) var(--tw-mask-${$}-from-position), var(--tw-mask-${$}-to-color) var(--tw-mask-${$}-to-position))`, + ), + ), + b.push( + F([ + T(`--tw-mask-${$}-from-position`, "0%"), + T(`--tw-mask-${$}-to-position`, "100%"), + T(`--tw-mask-${$}-from-color`, "black"), + T(`--tw-mask-${$}-to-color`, "transparent"), + ]), + ), + b.push(o(`--tw-mask-${$}-${p}-position`, A))); + return b; + }, + }); + } + (y("mask-x-from", "from", { top: !1, right: !0, bottom: !1, left: !0 }), + y("mask-x-to", "to", { top: !1, right: !0, bottom: !1, left: !0 }), + y("mask-y-from", "from", { top: !0, right: !1, bottom: !0, left: !1 }), + y("mask-y-to", "to", { top: !0, right: !1, bottom: !0, left: !1 }), + y("mask-t-from", "from", { top: !0, right: !1, bottom: !1, left: !1 }), + y("mask-t-to", "to", { top: !0, right: !1, bottom: !1, left: !1 }), + y("mask-r-from", "from", { top: !1, right: !0, bottom: !1, left: !1 }), + y("mask-r-to", "to", { top: !1, right: !0, bottom: !1, left: !1 }), + y("mask-b-from", "from", { top: !1, right: !1, bottom: !0, left: !1 }), + y("mask-b-to", "to", { top: !1, right: !1, bottom: !0, left: !1 }), + y("mask-l-from", "from", { top: !1, right: !1, bottom: !1, left: !0 }), + y("mask-l-to", "to", { top: !1, right: !1, bottom: !1, left: !0 })); + let K = () => + F([ + T("--tw-mask-linear-position", "0deg"), + T("--tw-mask-linear-from-position", "0%"), + T("--tw-mask-linear-to-position", "100%"), + T("--tw-mask-linear-from-color", "black"), + T("--tw-mask-linear-to-color", "transparent"), + ]); + (n("mask-linear", { + defaultValue: null, + supportsNegative: !0, + supportsFractions: !1, + handleBareValue(l) { + return E(l.value) ? `calc(1deg * ${l.value})` : null; + }, + handleNegativeBareValue(l) { + return E(l.value) ? `calc(1deg * -${l.value})` : null; + }, + handle: (l) => [ + x(), + K(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-linear", + "linear-gradient(var(--tw-mask-linear-stops, var(--tw-mask-linear-position)))", + ), + o("--tw-mask-linear-position", l), + ], + }), + i("mask-linear", () => [ + { supportsNegative: !0, values: ["0", "1", "2", "3", "6", "12", "45", "90", "180"] }, + ]), + V("mask-linear-from", { + color: (l) => [ + x(), + K(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-linear-stops", + "var(--tw-mask-linear-position), var(--tw-mask-linear-from-color) var(--tw-mask-linear-from-position), var(--tw-mask-linear-to-color) var(--tw-mask-linear-to-position)", + ), + o("--tw-mask-linear", "linear-gradient(var(--tw-mask-linear-stops))"), + o("--tw-mask-linear-from-color", l), + ], + position: (l) => [ + x(), + K(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-linear-stops", + "var(--tw-mask-linear-position), var(--tw-mask-linear-from-color) var(--tw-mask-linear-from-position), var(--tw-mask-linear-to-color) var(--tw-mask-linear-to-position)", + ), + o("--tw-mask-linear", "linear-gradient(var(--tw-mask-linear-stops))"), + o("--tw-mask-linear-from-position", l), + ], + }), + V("mask-linear-to", { + color: (l) => [ + x(), + K(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-linear-stops", + "var(--tw-mask-linear-position), var(--tw-mask-linear-from-color) var(--tw-mask-linear-from-position), var(--tw-mask-linear-to-color) var(--tw-mask-linear-to-position)", + ), + o("--tw-mask-linear", "linear-gradient(var(--tw-mask-linear-stops))"), + o("--tw-mask-linear-to-color", l), + ], + position: (l) => [ + x(), + K(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-linear-stops", + "var(--tw-mask-linear-position), var(--tw-mask-linear-from-color) var(--tw-mask-linear-from-position), var(--tw-mask-linear-to-color) var(--tw-mask-linear-to-position)", + ), + o("--tw-mask-linear", "linear-gradient(var(--tw-mask-linear-stops))"), + o("--tw-mask-linear-to-position", l), + ], + })); + let R = () => + F([ + T("--tw-mask-radial-from-position", "0%"), + T("--tw-mask-radial-to-position", "100%"), + T("--tw-mask-radial-from-color", "black"), + T("--tw-mask-radial-to-color", "transparent"), + T("--tw-mask-radial-shape", "ellipse"), + T("--tw-mask-radial-size", "farthest-corner"), + T("--tw-mask-radial-position", "center"), + ]); + (t("mask-circle", [["--tw-mask-radial-shape", "circle"]]), + t("mask-ellipse", [["--tw-mask-radial-shape", "ellipse"]]), + t("mask-radial-closest-side", [["--tw-mask-radial-size", "closest-side"]]), + t("mask-radial-farthest-side", [["--tw-mask-radial-size", "farthest-side"]]), + t("mask-radial-closest-corner", [["--tw-mask-radial-size", "closest-corner"]]), + t("mask-radial-farthest-corner", [["--tw-mask-radial-size", "farthest-corner"]]), + t("mask-radial-at-top", [["--tw-mask-radial-position", "top"]]), + t("mask-radial-at-top-left", [["--tw-mask-radial-position", "top left"]]), + t("mask-radial-at-top-right", [["--tw-mask-radial-position", "top right"]]), + t("mask-radial-at-bottom", [["--tw-mask-radial-position", "bottom"]]), + t("mask-radial-at-bottom-left", [["--tw-mask-radial-position", "bottom left"]]), + t("mask-radial-at-bottom-right", [["--tw-mask-radial-position", "bottom right"]]), + t("mask-radial-at-left", [["--tw-mask-radial-position", "left"]]), + t("mask-radial-at-right", [["--tw-mask-radial-position", "right"]]), + t("mask-radial-at-center", [["--tw-mask-radial-position", "center"]]), + n("mask-radial-at", { + defaultValue: null, + supportsNegative: !1, + supportsFractions: !1, + handle: (l) => [o("--tw-mask-radial-position", l)], + }), + n("mask-radial", { + defaultValue: null, + supportsNegative: !1, + supportsFractions: !1, + handle: (l) => [ + x(), + R(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-radial", + "radial-gradient(var(--tw-mask-radial-stops, var(--tw-mask-radial-size)))", + ), + o("--tw-mask-radial-size", l), + ], + }), + V("mask-radial-from", { + color: (l) => [ + x(), + R(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-radial-stops", + "var(--tw-mask-radial-shape) var(--tw-mask-radial-size) at var(--tw-mask-radial-position), var(--tw-mask-radial-from-color) var(--tw-mask-radial-from-position), var(--tw-mask-radial-to-color) var(--tw-mask-radial-to-position)", + ), + o("--tw-mask-radial", "radial-gradient(var(--tw-mask-radial-stops))"), + o("--tw-mask-radial-from-color", l), + ], + position: (l) => [ + x(), + R(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-radial-stops", + "var(--tw-mask-radial-shape) var(--tw-mask-radial-size) at var(--tw-mask-radial-position), var(--tw-mask-radial-from-color) var(--tw-mask-radial-from-position), var(--tw-mask-radial-to-color) var(--tw-mask-radial-to-position)", + ), + o("--tw-mask-radial", "radial-gradient(var(--tw-mask-radial-stops))"), + o("--tw-mask-radial-from-position", l), + ], + }), + V("mask-radial-to", { + color: (l) => [ + x(), + R(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-radial-stops", + "var(--tw-mask-radial-shape) var(--tw-mask-radial-size) at var(--tw-mask-radial-position), var(--tw-mask-radial-from-color) var(--tw-mask-radial-from-position), var(--tw-mask-radial-to-color) var(--tw-mask-radial-to-position)", + ), + o("--tw-mask-radial", "radial-gradient(var(--tw-mask-radial-stops))"), + o("--tw-mask-radial-to-color", l), + ], + position: (l) => [ + x(), + R(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-radial-stops", + "var(--tw-mask-radial-shape) var(--tw-mask-radial-size) at var(--tw-mask-radial-position), var(--tw-mask-radial-from-color) var(--tw-mask-radial-from-position), var(--tw-mask-radial-to-color) var(--tw-mask-radial-to-position)", + ), + o("--tw-mask-radial", "radial-gradient(var(--tw-mask-radial-stops))"), + o("--tw-mask-radial-to-position", l), + ], + })); + let P = () => + F([ + T("--tw-mask-conic-position", "0deg"), + T("--tw-mask-conic-from-position", "0%"), + T("--tw-mask-conic-to-position", "100%"), + T("--tw-mask-conic-from-color", "black"), + T("--tw-mask-conic-to-color", "transparent"), + ]); + (n("mask-conic", { + defaultValue: null, + supportsNegative: !0, + supportsFractions: !1, + handleBareValue(l) { + return E(l.value) ? `calc(1deg * ${l.value})` : null; + }, + handleNegativeBareValue(l) { + return E(l.value) ? `calc(1deg * -${l.value})` : null; + }, + handle: (l) => [ + x(), + P(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-conic", + "conic-gradient(var(--tw-mask-conic-stops, var(--tw-mask-conic-position)))", + ), + o("--tw-mask-conic-position", l), + ], + }), + i("mask-conic", () => [ + { supportsNegative: !0, values: ["0", "1", "2", "3", "6", "12", "45", "90", "180"] }, + ]), + V("mask-conic-from", { + color: (l) => [ + x(), + P(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-conic-stops", + "from var(--tw-mask-conic-position), var(--tw-mask-conic-from-color) var(--tw-mask-conic-from-position), var(--tw-mask-conic-to-color) var(--tw-mask-conic-to-position)", + ), + o("--tw-mask-conic", "conic-gradient(var(--tw-mask-conic-stops))"), + o("--tw-mask-conic-from-color", l), + ], + position: (l) => [ + x(), + P(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-conic-stops", + "from var(--tw-mask-conic-position), var(--tw-mask-conic-from-color) var(--tw-mask-conic-from-position), var(--tw-mask-conic-to-color) var(--tw-mask-conic-to-position)", + ), + o("--tw-mask-conic", "conic-gradient(var(--tw-mask-conic-stops))"), + o("--tw-mask-conic-from-position", l), + ], + }), + V("mask-conic-to", { + color: (l) => [ + x(), + P(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-conic-stops", + "from var(--tw-mask-conic-position), var(--tw-mask-conic-from-color) var(--tw-mask-conic-from-position), var(--tw-mask-conic-to-color) var(--tw-mask-conic-to-position)", + ), + o("--tw-mask-conic", "conic-gradient(var(--tw-mask-conic-stops))"), + o("--tw-mask-conic-to-color", l), + ], + position: (l) => [ + x(), + P(), + o("mask-image", "var(--tw-mask-linear), var(--tw-mask-radial), var(--tw-mask-conic)"), + o("mask-composite", "intersect"), + o( + "--tw-mask-conic-stops", + "from var(--tw-mask-conic-position), var(--tw-mask-conic-from-color) var(--tw-mask-conic-from-position), var(--tw-mask-conic-to-color) var(--tw-mask-conic-to-position)", + ), + o("--tw-mask-conic", "conic-gradient(var(--tw-mask-conic-stops))"), + o("--tw-mask-conic-to-position", l), + ], + }), + t("box-decoration-slice", [ + ["-webkit-box-decoration-break", "slice"], + ["box-decoration-break", "slice"], + ]), + t("box-decoration-clone", [ + ["-webkit-box-decoration-break", "clone"], + ["box-decoration-break", "clone"], + ]), + t("bg-clip-text", [["background-clip", "text"]]), + t("bg-clip-border", [["background-clip", "border-box"]]), + t("bg-clip-padding", [["background-clip", "padding-box"]]), + t("bg-clip-content", [["background-clip", "content-box"]]), + t("bg-origin-border", [["background-origin", "border-box"]]), + t("bg-origin-padding", [["background-origin", "padding-box"]]), + t("bg-origin-content", [["background-origin", "content-box"]])); + for (let l of [ + "normal", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "hue", + "saturation", + "color", + "luminosity", + ]) + (t(`bg-blend-${l}`, [["background-blend-mode", l]]), + t(`mix-blend-${l}`, [["mix-blend-mode", l]])); + (t("mix-blend-plus-darker", [["mix-blend-mode", "plus-darker"]]), + t("mix-blend-plus-lighter", [["mix-blend-mode", "plus-lighter"]]), + t("fill-none", [["fill", "none"]]), + r.functional("fill", (l) => { + if (!l.value) return; + if (l.value.kind === "arbitrary") { + let g = X(l.value.value, l.modifier, e); + return g === null ? void 0 : [o("fill", g)]; + } + let p = ee(l, e, ["--fill", "--color"]); + if (p) return [o("fill", p)]; + }), + i("fill", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--fill", "--color"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + }, + ]), + t("stroke-none", [["stroke", "none"]]), + r.functional("stroke", (l) => { + if (l.value) { + if (l.value.kind === "arbitrary") { + let p = l.value.value; + switch (l.value.dataType ?? Z(p, ["color", "number", "length", "percentage"])) { + case "number": + case "length": + case "percentage": + return l.modifier ? void 0 : [o("stroke-width", p)]; + default: + return ( + (p = X(l.value.value, l.modifier, e)), p === null ? void 0 : [o("stroke", p)] + ); + } + } + { + let p = ee(l, e, ["--stroke", "--color"]); + if (p) return [o("stroke", p)]; + } + { + let p = e.resolve(l.value.value, ["--stroke-width"]); + if (p) return [o("stroke-width", p)]; + if (E(l.value.value)) return [o("stroke-width", l.value.value)]; + } + } + }), + i("stroke", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--stroke", "--color"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + }, + { values: ["0", "1", "2", "3"], valueThemeKeys: ["--stroke-width"] }, + ]), + t("object-contain", [["object-fit", "contain"]]), + t("object-cover", [["object-fit", "cover"]]), + t("object-fill", [["object-fit", "fill"]]), + t("object-none", [["object-fit", "none"]]), + t("object-scale-down", [["object-fit", "scale-down"]]), + n("object", { + themeKeys: ["--object-position"], + handle: (l) => [o("object-position", l)], + staticValues: { + top: [o("object-position", "top")], + "top-left": [o("object-position", "left top")], + "top-right": [o("object-position", "right top")], + bottom: [o("object-position", "bottom")], + "bottom-left": [o("object-position", "left bottom")], + "bottom-right": [o("object-position", "right bottom")], + left: [o("object-position", "left")], + right: [o("object-position", "right")], + center: [o("object-position", "center")], + }, + })); + for (let [l, p] of [ + ["p", "padding"], + ["px", "padding-inline"], + ["py", "padding-block"], + ["ps", "padding-inline-start"], + ["pe", "padding-inline-end"], + ["pt", "padding-top"], + ["pr", "padding-right"], + ["pb", "padding-bottom"], + ["pl", "padding-left"], + ]) + a(l, ["--padding", "--spacing"], (g) => [o(p, g)]); + (t("text-left", [["text-align", "left"]]), + t("text-center", [["text-align", "center"]]), + t("text-right", [["text-align", "right"]]), + t("text-justify", [["text-align", "justify"]]), + t("text-start", [["text-align", "start"]]), + t("text-end", [["text-align", "end"]]), + a("indent", ["--text-indent", "--spacing"], (l) => [o("text-indent", l)], { + supportsNegative: !0, + }), + t("align-baseline", [["vertical-align", "baseline"]]), + t("align-top", [["vertical-align", "top"]]), + t("align-middle", [["vertical-align", "middle"]]), + t("align-bottom", [["vertical-align", "bottom"]]), + t("align-text-top", [["vertical-align", "text-top"]]), + t("align-text-bottom", [["vertical-align", "text-bottom"]]), + t("align-sub", [["vertical-align", "sub"]]), + t("align-super", [["vertical-align", "super"]]), + n("align", { themeKeys: [], handle: (l) => [o("vertical-align", l)] }), + r.functional("font", (l) => { + if (!(!l.value || l.modifier)) { + if (l.value.kind === "arbitrary") { + let p = l.value.value; + switch (l.value.dataType ?? Z(p, ["number", "generic-name", "family-name"])) { + case "generic-name": + case "family-name": + return [o("font-family", p)]; + default: + return [F([T("--tw-font-weight")]), o("--tw-font-weight", p), o("font-weight", p)]; + } + } + { + let p = e.resolveWith( + l.value.value, + ["--font"], + ["--font-feature-settings", "--font-variation-settings"], + ); + if (p) { + let [g, A = {}] = p; + return [ + o("font-family", g), + o("font-feature-settings", A["--font-feature-settings"]), + o("font-variation-settings", A["--font-variation-settings"]), + ]; + } + } + { + let p = e.resolve(l.value.value, ["--font-weight"]); + if (p) + return [F([T("--tw-font-weight")]), o("--tw-font-weight", p), o("font-weight", p)]; + } + } + }), + i("font", () => [ + { values: [], valueThemeKeys: ["--font"] }, + { values: [], valueThemeKeys: ["--font-weight"] }, + ]), + t("uppercase", [["text-transform", "uppercase"]]), + t("lowercase", [["text-transform", "lowercase"]]), + t("capitalize", [["text-transform", "capitalize"]]), + t("normal-case", [["text-transform", "none"]]), + t("italic", [["font-style", "italic"]]), + t("not-italic", [["font-style", "normal"]]), + t("underline", [["text-decoration-line", "underline"]]), + t("overline", [["text-decoration-line", "overline"]]), + t("line-through", [["text-decoration-line", "line-through"]]), + t("no-underline", [["text-decoration-line", "none"]]), + t("font-stretch-normal", [["font-stretch", "normal"]]), + t("font-stretch-ultra-condensed", [["font-stretch", "ultra-condensed"]]), + t("font-stretch-extra-condensed", [["font-stretch", "extra-condensed"]]), + t("font-stretch-condensed", [["font-stretch", "condensed"]]), + t("font-stretch-semi-condensed", [["font-stretch", "semi-condensed"]]), + t("font-stretch-semi-expanded", [["font-stretch", "semi-expanded"]]), + t("font-stretch-expanded", [["font-stretch", "expanded"]]), + t("font-stretch-extra-expanded", [["font-stretch", "extra-expanded"]]), + t("font-stretch-ultra-expanded", [["font-stretch", "ultra-expanded"]]), + n("font-stretch", { + handleBareValue: ({ value: l }) => { + if (!l.endsWith("%")) return null; + let p = Number(l.slice(0, -1)); + return !E(p) || Number.isNaN(p) || p < 50 || p > 200 ? null : l; + }, + handle: (l) => [o("font-stretch", l)], + }), + i("font-stretch", () => [ + { values: ["50%", "75%", "90%", "95%", "100%", "105%", "110%", "125%", "150%", "200%"] }, + ]), + s("placeholder", { + themeKeys: ["--background-color", "--color"], + handle: (l) => [q("&::placeholder", [o("--tw-sort", "placeholder-color"), o("color", l)])], + }), + t("decoration-solid", [["text-decoration-style", "solid"]]), + t("decoration-double", [["text-decoration-style", "double"]]), + t("decoration-dotted", [["text-decoration-style", "dotted"]]), + t("decoration-dashed", [["text-decoration-style", "dashed"]]), + t("decoration-wavy", [["text-decoration-style", "wavy"]]), + t("decoration-auto", [["text-decoration-thickness", "auto"]]), + t("decoration-from-font", [["text-decoration-thickness", "from-font"]]), + r.functional("decoration", (l) => { + if (l.value) { + if (l.value.kind === "arbitrary") { + let p = l.value.value; + switch (l.value.dataType ?? Z(p, ["color", "length", "percentage"])) { + case "length": + case "percentage": + return l.modifier ? void 0 : [o("text-decoration-thickness", p)]; + default: + return ( + (p = X(p, l.modifier, e)), p === null ? void 0 : [o("text-decoration-color", p)] + ); + } + } + { + let p = e.resolve(l.value.value, ["--text-decoration-thickness"]); + if (p) return l.modifier ? void 0 : [o("text-decoration-thickness", p)]; + if (E(l.value.value)) + return l.modifier ? void 0 : [o("text-decoration-thickness", `${l.value.value}px`)]; + } + { + let p = ee(l, e, ["--text-decoration-color", "--color"]); + if (p) return [o("text-decoration-color", p)]; + } + } + }), + i("decoration", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--text-decoration-color", "--color"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + }, + { values: ["0", "1", "2"], valueThemeKeys: ["--text-decoration-thickness"] }, + ]), + n("animate", { + themeKeys: ["--animate"], + handle: (l) => [o("animation", l)], + staticValues: { none: [o("animation", "none")] }, + })); + { + let l = [ + "var(--tw-blur,)", + "var(--tw-brightness,)", + "var(--tw-contrast,)", + "var(--tw-grayscale,)", + "var(--tw-hue-rotate,)", + "var(--tw-invert,)", + "var(--tw-saturate,)", + "var(--tw-sepia,)", + "var(--tw-drop-shadow,)", + ].join(" "), + p = [ + "var(--tw-backdrop-blur,)", + "var(--tw-backdrop-brightness,)", + "var(--tw-backdrop-contrast,)", + "var(--tw-backdrop-grayscale,)", + "var(--tw-backdrop-hue-rotate,)", + "var(--tw-backdrop-invert,)", + "var(--tw-backdrop-opacity,)", + "var(--tw-backdrop-saturate,)", + "var(--tw-backdrop-sepia,)", + ].join(" "), + g = () => + F([ + T("--tw-blur"), + T("--tw-brightness"), + T("--tw-contrast"), + T("--tw-grayscale"), + T("--tw-hue-rotate"), + T("--tw-invert"), + T("--tw-opacity"), + T("--tw-saturate"), + T("--tw-sepia"), + T("--tw-drop-shadow"), + T("--tw-drop-shadow-color"), + T("--tw-drop-shadow-alpha", "100%", ""), + T("--tw-drop-shadow-size"), + ]), + A = () => + F([ + T("--tw-backdrop-blur"), + T("--tw-backdrop-brightness"), + T("--tw-backdrop-contrast"), + T("--tw-backdrop-grayscale"), + T("--tw-backdrop-hue-rotate"), + T("--tw-backdrop-invert"), + T("--tw-backdrop-opacity"), + T("--tw-backdrop-saturate"), + T("--tw-backdrop-sepia"), + ]); + (r.functional("filter", (b) => { + if (!b.modifier) { + if (b.value === null) return [g(), o("filter", l)]; + if (b.value.kind === "arbitrary") return [o("filter", b.value.value)]; + switch (b.value.value) { + case "none": + return [o("filter", "none")]; + } + } + }), + r.functional("backdrop-filter", (b) => { + if (!b.modifier) { + if (b.value === null) + return [A(), o("-webkit-backdrop-filter", p), o("backdrop-filter", p)]; + if (b.value.kind === "arbitrary") + return [ + o("-webkit-backdrop-filter", b.value.value), + o("backdrop-filter", b.value.value), + ]; + switch (b.value.value) { + case "none": + return [o("-webkit-backdrop-filter", "none"), o("backdrop-filter", "none")]; + } + } + }), + n("blur", { + themeKeys: ["--blur"], + handle: (b) => [g(), o("--tw-blur", `blur(${b})`), o("filter", l)], + staticValues: { none: [g(), o("--tw-blur", " "), o("filter", l)] }, + }), + n("backdrop-blur", { + themeKeys: ["--backdrop-blur", "--blur"], + handle: (b) => [ + A(), + o("--tw-backdrop-blur", `blur(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + staticValues: { + none: [ + A(), + o("--tw-backdrop-blur", " "), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }, + }), + n("brightness", { + themeKeys: ["--brightness"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + handle: (b) => [g(), o("--tw-brightness", `brightness(${b})`), o("filter", l)], + }), + n("backdrop-brightness", { + themeKeys: ["--backdrop-brightness", "--brightness"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + handle: (b) => [ + A(), + o("--tw-backdrop-brightness", `brightness(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("brightness", () => [ + { + values: ["0", "50", "75", "90", "95", "100", "105", "110", "125", "150", "200"], + valueThemeKeys: ["--brightness"], + }, + ]), + i("backdrop-brightness", () => [ + { + values: ["0", "50", "75", "90", "95", "100", "105", "110", "125", "150", "200"], + valueThemeKeys: ["--backdrop-brightness", "--brightness"], + }, + ]), + n("contrast", { + themeKeys: ["--contrast"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + handle: (b) => [g(), o("--tw-contrast", `contrast(${b})`), o("filter", l)], + }), + n("backdrop-contrast", { + themeKeys: ["--backdrop-contrast", "--contrast"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + handle: (b) => [ + A(), + o("--tw-backdrop-contrast", `contrast(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("contrast", () => [ + { values: ["0", "50", "75", "100", "125", "150", "200"], valueThemeKeys: ["--contrast"] }, + ]), + i("backdrop-contrast", () => [ + { + values: ["0", "50", "75", "100", "125", "150", "200"], + valueThemeKeys: ["--backdrop-contrast", "--contrast"], + }, + ]), + n("grayscale", { + themeKeys: ["--grayscale"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + defaultValue: "100%", + handle: (b) => [g(), o("--tw-grayscale", `grayscale(${b})`), o("filter", l)], + }), + n("backdrop-grayscale", { + themeKeys: ["--backdrop-grayscale", "--grayscale"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + defaultValue: "100%", + handle: (b) => [ + A(), + o("--tw-backdrop-grayscale", `grayscale(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("grayscale", () => [ + { + values: ["0", "25", "50", "75", "100"], + valueThemeKeys: ["--grayscale"], + hasDefaultValue: !0, + }, + ]), + i("backdrop-grayscale", () => [ + { + values: ["0", "25", "50", "75", "100"], + valueThemeKeys: ["--backdrop-grayscale", "--grayscale"], + hasDefaultValue: !0, + }, + ]), + n("hue-rotate", { + supportsNegative: !0, + themeKeys: ["--hue-rotate"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}deg` : null), + handle: (b) => [g(), o("--tw-hue-rotate", `hue-rotate(${b})`), o("filter", l)], + }), + n("backdrop-hue-rotate", { + supportsNegative: !0, + themeKeys: ["--backdrop-hue-rotate", "--hue-rotate"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}deg` : null), + handle: (b) => [ + A(), + o("--tw-backdrop-hue-rotate", `hue-rotate(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("hue-rotate", () => [ + { values: ["0", "15", "30", "60", "90", "180"], valueThemeKeys: ["--hue-rotate"] }, + ]), + i("backdrop-hue-rotate", () => [ + { + values: ["0", "15", "30", "60", "90", "180"], + valueThemeKeys: ["--backdrop-hue-rotate", "--hue-rotate"], + }, + ]), + n("invert", { + themeKeys: ["--invert"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + defaultValue: "100%", + handle: (b) => [g(), o("--tw-invert", `invert(${b})`), o("filter", l)], + }), + n("backdrop-invert", { + themeKeys: ["--backdrop-invert", "--invert"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + defaultValue: "100%", + handle: (b) => [ + A(), + o("--tw-backdrop-invert", `invert(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("invert", () => [ + { + values: ["0", "25", "50", "75", "100"], + valueThemeKeys: ["--invert"], + hasDefaultValue: !0, + }, + ]), + i("backdrop-invert", () => [ + { + values: ["0", "25", "50", "75", "100"], + valueThemeKeys: ["--backdrop-invert", "--invert"], + hasDefaultValue: !0, + }, + ]), + n("saturate", { + themeKeys: ["--saturate"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + handle: (b) => [g(), o("--tw-saturate", `saturate(${b})`), o("filter", l)], + }), + n("backdrop-saturate", { + themeKeys: ["--backdrop-saturate", "--saturate"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + handle: (b) => [ + A(), + o("--tw-backdrop-saturate", `saturate(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("saturate", () => [ + { values: ["0", "50", "100", "150", "200"], valueThemeKeys: ["--saturate"] }, + ]), + i("backdrop-saturate", () => [ + { + values: ["0", "50", "100", "150", "200"], + valueThemeKeys: ["--backdrop-saturate", "--saturate"], + }, + ]), + n("sepia", { + themeKeys: ["--sepia"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + defaultValue: "100%", + handle: (b) => [g(), o("--tw-sepia", `sepia(${b})`), o("filter", l)], + }), + n("backdrop-sepia", { + themeKeys: ["--backdrop-sepia", "--sepia"], + handleBareValue: ({ value: b }) => (E(b) ? `${b}%` : null), + defaultValue: "100%", + handle: (b) => [ + A(), + o("--tw-backdrop-sepia", `sepia(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("sepia", () => [ + { values: ["0", "50", "100"], valueThemeKeys: ["--sepia"], hasDefaultValue: !0 }, + ]), + i("backdrop-sepia", () => [ + { + values: ["0", "50", "100"], + valueThemeKeys: ["--backdrop-sepia", "--sepia"], + hasDefaultValue: !0, + }, + ]), + t("drop-shadow-none", [g, ["--tw-drop-shadow", " "], ["filter", l]]), + r.functional("drop-shadow", (b) => { + let $; + if ( + (b.modifier && + (b.modifier.kind === "arbitrary" + ? ($ = b.modifier.value) + : E(b.modifier.value) && ($ = `${b.modifier.value}%`)), + !b.value) + ) { + let _ = e.get(["--drop-shadow"]), + N = e.resolve(null, ["--drop-shadow"]); + return _ === null || N === null + ? void 0 + : [ + g(), + o("--tw-drop-shadow-alpha", $), + ...at("--tw-drop-shadow-size", _, $, (S) => `var(--tw-drop-shadow-color, ${S})`), + o( + "--tw-drop-shadow", + z(N, ",") + .map((S) => `drop-shadow(${S})`) + .join(" "), + ), + o("filter", l), + ]; + } + if (b.value.kind === "arbitrary") { + let _ = b.value.value; + switch (b.value.dataType ?? Z(_, ["color"])) { + case "color": + return ( + (_ = X(_, b.modifier, e)), + _ === null + ? void 0 + : [ + g(), + o("--tw-drop-shadow-color", Q(_, "var(--tw-drop-shadow-alpha)")), + o("--tw-drop-shadow", "var(--tw-drop-shadow-size)"), + ] + ); + default: + return b.modifier && !$ + ? void 0 + : [ + g(), + o("--tw-drop-shadow-alpha", $), + ...at( + "--tw-drop-shadow-size", + _, + $, + (S) => `var(--tw-drop-shadow-color, ${S})`, + ), + o("--tw-drop-shadow", "var(--tw-drop-shadow-size)"), + o("filter", l), + ]; + } + } + { + let _ = e.get([`--drop-shadow-${b.value.value}`]), + N = e.resolve(b.value.value, ["--drop-shadow"]); + if (_ && N) + return b.modifier && !$ + ? void 0 + : $ + ? [ + g(), + o("--tw-drop-shadow-alpha", $), + ...at( + "--tw-drop-shadow-size", + _, + $, + (S) => `var(--tw-drop-shadow-color, ${S})`, + ), + o("--tw-drop-shadow", "var(--tw-drop-shadow-size)"), + o("filter", l), + ] + : [ + g(), + o("--tw-drop-shadow-alpha", $), + ...at( + "--tw-drop-shadow-size", + _, + $, + (S) => `var(--tw-drop-shadow-color, ${S})`, + ), + o( + "--tw-drop-shadow", + z(N, ",") + .map((S) => `drop-shadow(${S})`) + .join(" "), + ), + o("filter", l), + ]; + } + { + let _ = ee(b, e, ["--drop-shadow-color", "--color"]); + if (_) + return _ === "inherit" + ? [ + g(), + o("--tw-drop-shadow-color", "inherit"), + o("--tw-drop-shadow", "var(--tw-drop-shadow-size)"), + ] + : [ + g(), + o("--tw-drop-shadow-color", Q(_, "var(--tw-drop-shadow-alpha)")), + o("--tw-drop-shadow", "var(--tw-drop-shadow-size)"), + ]; + } + }), + i("drop-shadow", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--drop-shadow-color", "--color"], + modifiers: Array.from({ length: 21 }, (b, $) => `${$ * 5}`), + }, + { valueThemeKeys: ["--drop-shadow"] }, + ]), + n("backdrop-opacity", { + themeKeys: ["--backdrop-opacity", "--opacity"], + handleBareValue: ({ value: b }) => (lt(b) ? `${b}%` : null), + handle: (b) => [ + A(), + o("--tw-backdrop-opacity", `opacity(${b})`), + o("-webkit-backdrop-filter", p), + o("backdrop-filter", p), + ], + }), + i("backdrop-opacity", () => [ + { + values: Array.from({ length: 21 }, (b, $) => `${$ * 5}`), + valueThemeKeys: ["--backdrop-opacity", "--opacity"], + }, + ])); + } + { + let l = `var(--tw-ease, ${e.resolve(null, ["--default-transition-timing-function"]) ?? "ease"})`, + p = `var(--tw-duration, ${e.resolve(null, ["--default-transition-duration"]) ?? "0s"})`; + (n("transition", { + defaultValue: + "color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events", + themeKeys: ["--transition-property"], + handle: (g) => [ + o("transition-property", g), + o("transition-timing-function", l), + o("transition-duration", p), + ], + staticValues: { + none: [o("transition-property", "none")], + all: [ + o("transition-property", "all"), + o("transition-timing-function", l), + o("transition-duration", p), + ], + colors: [ + o( + "transition-property", + "color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to", + ), + o("transition-timing-function", l), + o("transition-duration", p), + ], + opacity: [ + o("transition-property", "opacity"), + o("transition-timing-function", l), + o("transition-duration", p), + ], + shadow: [ + o("transition-property", "box-shadow"), + o("transition-timing-function", l), + o("transition-duration", p), + ], + transform: [ + o("transition-property", "transform, translate, scale, rotate"), + o("transition-timing-function", l), + o("transition-duration", p), + ], + }, + }), + t("transition-discrete", [["transition-behavior", "allow-discrete"]]), + t("transition-normal", [["transition-behavior", "normal"]]), + n("delay", { + handleBareValue: ({ value: g }) => (E(g) ? `${g}ms` : null), + themeKeys: ["--transition-delay"], + handle: (g) => [o("transition-delay", g)], + })); + { + let g = () => F([T("--tw-duration")]); + (t("duration-initial", [g, ["--tw-duration", "initial"]]), + r.functional("duration", (A) => { + if (A.modifier || !A.value) return; + let b = null; + if ( + (A.value.kind === "arbitrary" + ? (b = A.value.value) + : ((b = e.resolve(A.value.fraction ?? A.value.value, ["--transition-duration"])), + b === null && E(A.value.value) && (b = `${A.value.value}ms`)), + b !== null) + ) + return [g(), o("--tw-duration", b), o("transition-duration", b)]; + })); + } + (i("delay", () => [ + { + values: ["75", "100", "150", "200", "300", "500", "700", "1000"], + valueThemeKeys: ["--transition-delay"], + }, + ]), + i("duration", () => [ + { + values: ["75", "100", "150", "200", "300", "500", "700", "1000"], + valueThemeKeys: ["--transition-duration"], + }, + ])); + } + { + let l = () => F([T("--tw-ease")]); + n("ease", { + themeKeys: ["--ease"], + handle: (p) => [l(), o("--tw-ease", p), o("transition-timing-function", p)], + staticValues: { + initial: [l(), o("--tw-ease", "initial")], + linear: [l(), o("--tw-ease", "linear"), o("transition-timing-function", "linear")], + }, + }); + } + (t("will-change-auto", [["will-change", "auto"]]), + t("will-change-scroll", [["will-change", "scroll-position"]]), + t("will-change-contents", [["will-change", "contents"]]), + t("will-change-transform", [["will-change", "transform"]]), + n("will-change", { themeKeys: [], handle: (l) => [o("will-change", l)] }), + t("content-none", [ + ["--tw-content", "none"], + ["content", "none"], + ]), + n("content", { + themeKeys: ["--content"], + handle: (l) => [ + F([T("--tw-content", '""')]), + o("--tw-content", l), + o("content", "var(--tw-content)"), + ], + })); + { + let l = + "var(--tw-contain-size,) var(--tw-contain-layout,) var(--tw-contain-paint,) var(--tw-contain-style,)", + p = () => + F([ + T("--tw-contain-size"), + T("--tw-contain-layout"), + T("--tw-contain-paint"), + T("--tw-contain-style"), + ]); + (t("contain-none", [["contain", "none"]]), + t("contain-content", [["contain", "content"]]), + t("contain-strict", [["contain", "strict"]]), + t("contain-size", [p, ["--tw-contain-size", "size"], ["contain", l]]), + t("contain-inline-size", [p, ["--tw-contain-size", "inline-size"], ["contain", l]]), + t("contain-layout", [p, ["--tw-contain-layout", "layout"], ["contain", l]]), + t("contain-paint", [p, ["--tw-contain-paint", "paint"], ["contain", l]]), + t("contain-style", [p, ["--tw-contain-style", "style"], ["contain", l]]), + n("contain", { themeKeys: [], handle: (g) => [o("contain", g)] })); + } + (t("forced-color-adjust-none", [["forced-color-adjust", "none"]]), + t("forced-color-adjust-auto", [["forced-color-adjust", "auto"]]), + a( + "leading", + ["--leading", "--spacing"], + (l) => [F([T("--tw-leading")]), o("--tw-leading", l), o("line-height", l)], + { + staticValues: { + none: [F([T("--tw-leading")]), o("--tw-leading", "1"), o("line-height", "1")], + }, + }, + ), + n("tracking", { + supportsNegative: !0, + themeKeys: ["--tracking"], + handle: (l) => [F([T("--tw-tracking")]), o("--tw-tracking", l), o("letter-spacing", l)], + }), + t("antialiased", [ + ["-webkit-font-smoothing", "antialiased"], + ["-moz-osx-font-smoothing", "grayscale"], + ]), + t("subpixel-antialiased", [ + ["-webkit-font-smoothing", "auto"], + ["-moz-osx-font-smoothing", "auto"], + ])); + { + let l = + "var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)", + p = () => + F([ + T("--tw-ordinal"), + T("--tw-slashed-zero"), + T("--tw-numeric-figure"), + T("--tw-numeric-spacing"), + T("--tw-numeric-fraction"), + ]); + (t("normal-nums", [["font-variant-numeric", "normal"]]), + t("ordinal", [p, ["--tw-ordinal", "ordinal"], ["font-variant-numeric", l]]), + t("slashed-zero", [p, ["--tw-slashed-zero", "slashed-zero"], ["font-variant-numeric", l]]), + t("lining-nums", [p, ["--tw-numeric-figure", "lining-nums"], ["font-variant-numeric", l]]), + t("oldstyle-nums", [ + p, + ["--tw-numeric-figure", "oldstyle-nums"], + ["font-variant-numeric", l], + ]), + t("proportional-nums", [ + p, + ["--tw-numeric-spacing", "proportional-nums"], + ["font-variant-numeric", l], + ]), + t("tabular-nums", [ + p, + ["--tw-numeric-spacing", "tabular-nums"], + ["font-variant-numeric", l], + ]), + t("diagonal-fractions", [ + p, + ["--tw-numeric-fraction", "diagonal-fractions"], + ["font-variant-numeric", l], + ]), + t("stacked-fractions", [ + p, + ["--tw-numeric-fraction", "stacked-fractions"], + ["font-variant-numeric", l], + ])); + } + { + let l = () => F([T("--tw-outline-style", "solid")]); + (r.static("outline-hidden", () => [ + o("--tw-outline-style", "none"), + o("outline-style", "none"), + M("@media", "(forced-colors: active)", [ + o("outline", "2px solid transparent"), + o("outline-offset", "2px"), + ]), + ]), + t("outline-none", [ + ["--tw-outline-style", "none"], + ["outline-style", "none"], + ]), + t("outline-solid", [ + ["--tw-outline-style", "solid"], + ["outline-style", "solid"], + ]), + t("outline-dashed", [ + ["--tw-outline-style", "dashed"], + ["outline-style", "dashed"], + ]), + t("outline-dotted", [ + ["--tw-outline-style", "dotted"], + ["outline-style", "dotted"], + ]), + t("outline-double", [ + ["--tw-outline-style", "double"], + ["outline-style", "double"], + ]), + r.functional("outline", (p) => { + if (p.value === null) { + if (p.modifier) return; + let g = e.get(["--default-outline-width"]) ?? "1px"; + return [l(), o("outline-style", "var(--tw-outline-style)"), o("outline-width", g)]; + } + if (p.value.kind === "arbitrary") { + let g = p.value.value; + switch (p.value.dataType ?? Z(g, ["color", "length", "number", "percentage"])) { + case "length": + case "number": + case "percentage": + return p.modifier + ? void 0 + : [l(), o("outline-style", "var(--tw-outline-style)"), o("outline-width", g)]; + default: + return ((g = X(g, p.modifier, e)), g === null ? void 0 : [o("outline-color", g)]); + } + } + { + let g = ee(p, e, ["--outline-color", "--color"]); + if (g) return [o("outline-color", g)]; + } + { + if (p.modifier) return; + let g = e.resolve(p.value.value, ["--outline-width"]); + if (g) + return [l(), o("outline-style", "var(--tw-outline-style)"), o("outline-width", g)]; + if (E(p.value.value)) + return [ + l(), + o("outline-style", "var(--tw-outline-style)"), + o("outline-width", `${p.value.value}px`), + ]; + } + }), + i("outline", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--outline-color", "--color"], + modifiers: Array.from({ length: 21 }, (p, g) => `${g * 5}`), + hasDefaultValue: !0, + }, + { values: ["0", "1", "2", "4", "8"], valueThemeKeys: ["--outline-width"] }, + ]), + n("outline-offset", { + supportsNegative: !0, + themeKeys: ["--outline-offset"], + handleBareValue: ({ value: p }) => (E(p) ? `${p}px` : null), + handle: (p) => [o("outline-offset", p)], + }), + i("outline-offset", () => [ + { + supportsNegative: !0, + values: ["0", "1", "2", "4", "8"], + valueThemeKeys: ["--outline-offset"], + }, + ])); + } + (n("opacity", { + themeKeys: ["--opacity"], + handleBareValue: ({ value: l }) => (lt(l) ? `${l}%` : null), + handle: (l) => [o("opacity", l)], + }), + i("opacity", () => [ + { values: Array.from({ length: 21 }, (l, p) => `${p * 5}`), valueThemeKeys: ["--opacity"] }, + ]), + n("underline-offset", { + supportsNegative: !0, + themeKeys: ["--text-underline-offset"], + handleBareValue: ({ value: l }) => (E(l) ? `${l}px` : null), + handle: (l) => [o("text-underline-offset", l)], + staticValues: { auto: [o("text-underline-offset", "auto")] }, + }), + i("underline-offset", () => [ + { + supportsNegative: !0, + values: ["0", "1", "2", "4", "8"], + valueThemeKeys: ["--text-underline-offset"], + }, + ]), + r.functional("text", (l) => { + if (l.value) { + if (l.value.kind === "arbitrary") { + let p = l.value.value; + switch ( + l.value.dataType ?? + Z(p, ["color", "length", "percentage", "absolute-size", "relative-size"]) + ) { + case "size": + case "length": + case "percentage": + case "absolute-size": + case "relative-size": { + if (l.modifier) { + let A = + l.modifier.kind === "arbitrary" + ? l.modifier.value + : e.resolve(l.modifier.value, ["--leading"]); + if (!A && Te(l.modifier.value)) { + let b = e.resolve(null, ["--spacing"]); + if (!b) return null; + A = `calc(${b} * ${l.modifier.value})`; + } + return ( + !A && l.modifier.value === "none" && (A = "1"), + A ? [o("font-size", p), o("line-height", A)] : null + ); + } + return [o("font-size", p)]; + } + default: + return ((p = X(p, l.modifier, e)), p === null ? void 0 : [o("color", p)]); + } + } + { + let p = ee(l, e, ["--text-color", "--color"]); + if (p) return [o("color", p)]; + } + { + let p = e.resolveWith( + l.value.value, + ["--text"], + ["--line-height", "--letter-spacing", "--font-weight"], + ); + if (p) { + let [g, A = {}] = Array.isArray(p) ? p : [p]; + if (l.modifier) { + let b = + l.modifier.kind === "arbitrary" + ? l.modifier.value + : e.resolve(l.modifier.value, ["--leading"]); + if (!b && Te(l.modifier.value)) { + let _ = e.resolve(null, ["--spacing"]); + if (!_) return null; + b = `calc(${_} * ${l.modifier.value})`; + } + if ((!b && l.modifier.value === "none" && (b = "1"), !b)) return null; + let $ = [o("font-size", g)]; + return (b && $.push(o("line-height", b)), $); + } + return typeof A == "string" + ? [o("font-size", g), o("line-height", A)] + : [ + o("font-size", g), + o( + "line-height", + A["--line-height"] ? `var(--tw-leading, ${A["--line-height"]})` : void 0, + ), + o( + "letter-spacing", + A["--letter-spacing"] + ? `var(--tw-tracking, ${A["--letter-spacing"]})` + : void 0, + ), + o( + "font-weight", + A["--font-weight"] ? `var(--tw-font-weight, ${A["--font-weight"]})` : void 0, + ), + ]; + } + } + } + }), + i("text", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--text-color", "--color"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + }, + { values: [], valueThemeKeys: ["--text"], modifiers: [], modifierThemeKeys: ["--leading"] }, + ])); + let L = () => + F([T("--tw-text-shadow-color"), T("--tw-text-shadow-alpha", "100%", "")]); + (t("text-shadow-initial", [L, ["--tw-text-shadow-color", "initial"]]), + r.functional("text-shadow", (l) => { + let p; + if ( + (l.modifier && + (l.modifier.kind === "arbitrary" + ? (p = l.modifier.value) + : E(l.modifier.value) && (p = `${l.modifier.value}%`)), + !l.value) + ) { + let g = e.get(["--text-shadow"]); + return g === null + ? void 0 + : [ + L(), + o("--tw-text-shadow-alpha", p), + ...he("text-shadow", g, p, (A) => `var(--tw-text-shadow-color, ${A})`), + ]; + } + if (l.value.kind === "arbitrary") { + let g = l.value.value; + switch (l.value.dataType ?? Z(g, ["color"])) { + case "color": + return ( + (g = X(g, l.modifier, e)), + g === null + ? void 0 + : [L(), o("--tw-text-shadow-color", Q(g, "var(--tw-text-shadow-alpha)"))] + ); + default: + return [ + L(), + o("--tw-text-shadow-alpha", p), + ...he("text-shadow", g, p, (b) => `var(--tw-text-shadow-color, ${b})`), + ]; + } + } + switch (l.value.value) { + case "none": + return l.modifier ? void 0 : [L(), o("text-shadow", "none")]; + case "inherit": + return l.modifier ? void 0 : [L(), o("--tw-text-shadow-color", "inherit")]; + } + { + let g = e.get([`--text-shadow-${l.value.value}`]); + if (g) + return [ + L(), + o("--tw-text-shadow-alpha", p), + ...he("text-shadow", g, p, (A) => `var(--tw-text-shadow-color, ${A})`), + ]; + } + { + let g = ee(l, e, ["--text-shadow-color", "--color"]); + if (g) return [L(), o("--tw-text-shadow-color", Q(g, "var(--tw-text-shadow-alpha)"))]; + } + }), + i("text-shadow", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--text-shadow-color", "--color"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + }, + { values: ["none"] }, + { + valueThemeKeys: ["--text-shadow"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + hasDefaultValue: e.get(["--text-shadow"]) !== null, + }, + ])); + { + let b = function (N) { + return `var(--tw-ring-inset,) 0 0 0 calc(${N} + var(--tw-ring-offset-width)) var(--tw-ring-color, ${A})`; + }, + $ = function (N) { + return `inset 0 0 0 ${N} var(--tw-inset-ring-color, currentcolor)`; + }; + var ne = b, + le = $; + let l = [ + "var(--tw-inset-shadow)", + "var(--tw-inset-ring-shadow)", + "var(--tw-ring-offset-shadow)", + "var(--tw-ring-shadow)", + "var(--tw-shadow)", + ].join(", "), + p = "0 0 #0000", + g = () => + F([ + T("--tw-shadow", p), + T("--tw-shadow-color"), + T("--tw-shadow-alpha", "100%", ""), + T("--tw-inset-shadow", p), + T("--tw-inset-shadow-color"), + T("--tw-inset-shadow-alpha", "100%", ""), + T("--tw-ring-color"), + T("--tw-ring-shadow", p), + T("--tw-inset-ring-color"), + T("--tw-inset-ring-shadow", p), + T("--tw-ring-inset"), + T("--tw-ring-offset-width", "0px", ""), + T("--tw-ring-offset-color", "#fff"), + T("--tw-ring-offset-shadow", p), + ]); + (t("shadow-initial", [g, ["--tw-shadow-color", "initial"]]), + r.functional("shadow", (N) => { + let S; + if ( + (N.modifier && + (N.modifier.kind === "arbitrary" + ? (S = N.modifier.value) + : E(N.modifier.value) && (S = `${N.modifier.value}%`)), + !N.value) + ) { + let I = e.get(["--shadow"]); + return I === null + ? void 0 + : [ + g(), + o("--tw-shadow-alpha", S), + ...he("--tw-shadow", I, S, (ce) => `var(--tw-shadow-color, ${ce})`), + o("box-shadow", l), + ]; + } + if (N.value.kind === "arbitrary") { + let I = N.value.value; + switch (N.value.dataType ?? Z(I, ["color"])) { + case "color": + return ( + (I = X(I, N.modifier, e)), + I === null + ? void 0 + : [g(), o("--tw-shadow-color", Q(I, "var(--tw-shadow-alpha)"))] + ); + default: + return [ + g(), + o("--tw-shadow-alpha", S), + ...he("--tw-shadow", I, S, (xt) => `var(--tw-shadow-color, ${xt})`), + o("box-shadow", l), + ]; + } + } + switch (N.value.value) { + case "none": + return N.modifier ? void 0 : [g(), o("--tw-shadow", p), o("box-shadow", l)]; + case "inherit": + return N.modifier ? void 0 : [g(), o("--tw-shadow-color", "inherit")]; + } + { + let I = e.get([`--shadow-${N.value.value}`]); + if (I) + return [ + g(), + o("--tw-shadow-alpha", S), + ...he("--tw-shadow", I, S, (ce) => `var(--tw-shadow-color, ${ce})`), + o("box-shadow", l), + ]; + } + { + let I = ee(N, e, ["--box-shadow-color", "--color"]); + if (I) return [g(), o("--tw-shadow-color", Q(I, "var(--tw-shadow-alpha)"))]; + } + }), + i("shadow", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--box-shadow-color", "--color"], + modifiers: Array.from({ length: 21 }, (N, S) => `${S * 5}`), + }, + { values: ["none"] }, + { + valueThemeKeys: ["--shadow"], + modifiers: Array.from({ length: 21 }, (N, S) => `${S * 5}`), + hasDefaultValue: e.get(["--shadow"]) !== null, + }, + ]), + t("inset-shadow-initial", [g, ["--tw-inset-shadow-color", "initial"]]), + r.functional("inset-shadow", (N) => { + let S; + if ( + (N.modifier && + (N.modifier.kind === "arbitrary" + ? (S = N.modifier.value) + : E(N.modifier.value) && (S = `${N.modifier.value}%`)), + !N.value) + ) { + let I = e.get(["--inset-shadow"]); + return I === null + ? void 0 + : [ + g(), + o("--tw-inset-shadow-alpha", S), + ...he("--tw-inset-shadow", I, S, (ce) => `var(--tw-inset-shadow-color, ${ce})`), + o("box-shadow", l), + ]; + } + if (N.value.kind === "arbitrary") { + let I = N.value.value; + switch (N.value.dataType ?? Z(I, ["color"])) { + case "color": + return ( + (I = X(I, N.modifier, e)), + I === null + ? void 0 + : [g(), o("--tw-inset-shadow-color", Q(I, "var(--tw-inset-shadow-alpha)"))] + ); + default: + return [ + g(), + o("--tw-inset-shadow-alpha", S), + ...he( + "--tw-inset-shadow", + I, + S, + (xt) => `var(--tw-inset-shadow-color, ${xt})`, + "inset ", + ), + o("box-shadow", l), + ]; + } + } + switch (N.value.value) { + case "none": + return N.modifier ? void 0 : [g(), o("--tw-inset-shadow", p), o("box-shadow", l)]; + case "inherit": + return N.modifier ? void 0 : [g(), o("--tw-inset-shadow-color", "inherit")]; + } + { + let I = e.get([`--inset-shadow-${N.value.value}`]); + if (I) + return [ + g(), + o("--tw-inset-shadow-alpha", S), + ...he("--tw-inset-shadow", I, S, (ce) => `var(--tw-inset-shadow-color, ${ce})`), + o("box-shadow", l), + ]; + } + { + let I = ee(N, e, ["--box-shadow-color", "--color"]); + if (I) return [g(), o("--tw-inset-shadow-color", Q(I, "var(--tw-inset-shadow-alpha)"))]; + } + }), + i("inset-shadow", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--box-shadow-color", "--color"], + modifiers: Array.from({ length: 21 }, (N, S) => `${S * 5}`), + }, + { values: ["none"] }, + { + valueThemeKeys: ["--inset-shadow"], + modifiers: Array.from({ length: 21 }, (N, S) => `${S * 5}`), + hasDefaultValue: e.get(["--inset-shadow"]) !== null, + }, + ]), + t("ring-inset", [g, ["--tw-ring-inset", "inset"]])); + let A = e.get(["--default-ring-color"]) ?? "currentcolor"; + (r.functional("ring", (N) => { + if (!N.value) { + if (N.modifier) return; + let S = e.get(["--default-ring-width"]) ?? "1px"; + return [g(), o("--tw-ring-shadow", b(S)), o("box-shadow", l)]; + } + if (N.value.kind === "arbitrary") { + let S = N.value.value; + switch (N.value.dataType ?? Z(S, ["color", "length"])) { + case "length": + return N.modifier ? void 0 : [g(), o("--tw-ring-shadow", b(S)), o("box-shadow", l)]; + default: + return ((S = X(S, N.modifier, e)), S === null ? void 0 : [o("--tw-ring-color", S)]); + } + } + { + let S = ee(N, e, ["--ring-color", "--color"]); + if (S) return [o("--tw-ring-color", S)]; + } + { + if (N.modifier) return; + let S = e.resolve(N.value.value, ["--ring-width"]); + if ((S === null && E(N.value.value) && (S = `${N.value.value}px`), S)) + return [g(), o("--tw-ring-shadow", b(S)), o("box-shadow", l)]; + } + }), + i("ring", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--ring-color", "--color"], + modifiers: Array.from({ length: 21 }, (N, S) => `${S * 5}`), + }, + { + values: ["0", "1", "2", "4", "8"], + valueThemeKeys: ["--ring-width"], + hasDefaultValue: !0, + }, + ]), + r.functional("inset-ring", (N) => { + if (!N.value) + return N.modifier + ? void 0 + : [g(), o("--tw-inset-ring-shadow", $("1px")), o("box-shadow", l)]; + if (N.value.kind === "arbitrary") { + let S = N.value.value; + switch (N.value.dataType ?? Z(S, ["color", "length"])) { + case "length": + return N.modifier + ? void 0 + : [g(), o("--tw-inset-ring-shadow", $(S)), o("box-shadow", l)]; + default: + return ( + (S = X(S, N.modifier, e)), S === null ? void 0 : [o("--tw-inset-ring-color", S)] + ); + } + } + { + let S = ee(N, e, ["--ring-color", "--color"]); + if (S) return [o("--tw-inset-ring-color", S)]; + } + { + if (N.modifier) return; + let S = e.resolve(N.value.value, ["--ring-width"]); + if ((S === null && E(N.value.value) && (S = `${N.value.value}px`), S)) + return [g(), o("--tw-inset-ring-shadow", $(S)), o("box-shadow", l)]; + } + }), + i("inset-ring", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--ring-color", "--color"], + modifiers: Array.from({ length: 21 }, (N, S) => `${S * 5}`), + }, + { + values: ["0", "1", "2", "4", "8"], + valueThemeKeys: ["--ring-width"], + hasDefaultValue: !0, + }, + ])); + let _ = "var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)"; + r.functional("ring-offset", (N) => { + if (N.value) { + if (N.value.kind === "arbitrary") { + let S = N.value.value; + switch (N.value.dataType ?? Z(S, ["color", "length"])) { + case "length": + return N.modifier + ? void 0 + : [o("--tw-ring-offset-width", S), o("--tw-ring-offset-shadow", _)]; + default: + return ( + (S = X(S, N.modifier, e)), S === null ? void 0 : [o("--tw-ring-offset-color", S)] + ); + } + } + { + let S = e.resolve(N.value.value, ["--ring-offset-width"]); + if (S) + return N.modifier + ? void 0 + : [o("--tw-ring-offset-width", S), o("--tw-ring-offset-shadow", _)]; + if (E(N.value.value)) + return N.modifier + ? void 0 + : [ + o("--tw-ring-offset-width", `${N.value.value}px`), + o("--tw-ring-offset-shadow", _), + ]; + } + { + let S = ee(N, e, ["--ring-offset-color", "--color"]); + if (S) return [o("--tw-ring-offset-color", S)]; + } + } + }); + } + return ( + i("ring-offset", () => [ + { + values: ["current", "inherit", "transparent"], + valueThemeKeys: ["--ring-offset-color", "--color"], + modifiers: Array.from({ length: 21 }, (l, p) => `${p * 5}`), + }, + { values: ["0", "1", "2", "4", "8"], valueThemeKeys: ["--ring-offset-width"] }, + ]), + r.functional("@container", (l) => { + let p = null; + if ( + (l.value === null + ? (p = "inline-size") + : l.value.kind === "arbitrary" + ? (p = l.value.value) + : l.value.kind === "named" && l.value.value === "normal" + ? (p = "normal") + : !1, + p !== null) + ) + return l.modifier + ? [o("container-type", p), o("container-name", l.modifier.value)] + : [o("container-type", p)]; + }), + i("@container", () => [{ values: ["normal"], valueThemeKeys: [], hasDefaultValue: !0 }]), + r + ); + } + var Lt = ["number", "integer", "ratio", "percentage"]; + function Dr(e) { + let r = e.params; + return Uo.test(r) + ? (i) => { + let t = { + "--value": { + usedSpacingInteger: !1, + usedSpacingNumber: !1, + themeKeys: new Set(), + literals: new Set(), + }, + "--modifier": { + usedSpacingInteger: !1, + usedSpacingNumber: !1, + themeKeys: new Set(), + literals: new Set(), + }, + }; + (D(e.nodes, (n) => { + if ( + n.kind !== "declaration" || + !n.value || + (!n.value.includes("--value(") && !n.value.includes("--modifier(")) + ) + return; + let s = G(n.value); + (D(s, (a) => { + if (a.kind !== "function") return; + if ( + a.value === "--spacing" && + !(t["--modifier"].usedSpacingNumber && t["--value"].usedSpacingNumber) + ) + return ( + D(a.nodes, (c) => { + if ( + c.kind !== "function" || + (c.value !== "--value" && c.value !== "--modifier") + ) + return; + let u = c.value; + for (let h of c.nodes) + if (h.kind === "word") { + if (h.value === "integer") t[u].usedSpacingInteger ||= !0; + else if ( + h.value === "number" && + ((t[u].usedSpacingNumber ||= !0), + t["--modifier"].usedSpacingNumber && t["--value"].usedSpacingNumber) + ) + return O.Stop; + } + }), + O.Continue + ); + if (a.value !== "--value" && a.value !== "--modifier") return; + let m = z(J(a.nodes), ","); + for (let [c, u] of m.entries()) + ((u = u.replace(/\\\*/g, "*")), + (u = u.replace(/--(.*?)\s--(.*?)/g, "--$1-*--$2")), + (u = u.replace(/\s+/g, "")), + (u = u.replace(/(-\*){2,}/g, "-*")), + u[0] === "-" && u[1] === "-" && !u.includes("-*") && (u += "-*"), + (m[c] = u)); + a.nodes = G(m.join(",")); + for (let c of a.nodes) + if ( + c.kind === "word" && + (c.value[0] === '"' || c.value[0] === "'") && + c.value[0] === c.value[c.value.length - 1] + ) { + let u = c.value.slice(1, -1); + t[a.value].literals.add(u); + } else if (c.kind === "word" && c.value[0] === "-" && c.value[1] === "-") { + let u = c.value.replace(/-\*.*$/g, ""); + t[a.value].themeKeys.add(u); + } else if ( + c.kind === "word" && + !(c.value[0] === "[" && c.value[c.value.length - 1] === "]") && + !Lt.includes(c.value) + ) { + console.warn(`Unsupported bare value data type: "${c.value}". +Only valid data types are: ${Lt.map((w) => `"${w}"`).join(", ")}. +`); + let u = c.value, + h = structuredClone(a), + d = "\xB6"; + D(h.nodes, (w) => { + if (w.kind === "word" && w.value === u) + return O.ReplaceSkip({ kind: "word", value: d }); + }); + let f = "^".repeat(J([c]).length), + v = J([h]).indexOf(d), + k = ["```css", J([a]), " ".repeat(v) + f, "```"].join(` +`); + console.warn(k); + } + }), + (n.value = J(s))); + }), + i.utilities.functional(r.slice(0, -2), (n) => { + let s = re(e), + a = n.value, + m = n.modifier; + if (a === null) return; + let c = !1, + u = !1, + h = !1, + d = !1, + f = new Map(), + v = !1; + if ( + (D([s], (k, w) => { + let x = w.parent; + if ( + (x?.kind !== "rule" && x?.kind !== "at-rule") || + k.kind !== "declaration" || + !k.value + ) + return; + let V = !1, + C = G(k.value); + if ( + (D(C, (y) => { + if (y.kind === "function") { + if (y.value === "--value") { + c = !0; + let K = Or(a, y, i); + return K + ? ((u = !0), K.ratio ? (v = !0) : f.set(k, x), O.ReplaceSkip(K.nodes)) + : ((c ||= !1), (V = !0), O.Stop); + } else if (y.value === "--modifier") { + if (m === null) return ((V = !0), O.Stop); + h = !0; + let K = Or(m, y, i); + return K + ? ((d = !0), O.ReplaceSkip(K.nodes)) + : ((h ||= !1), (V = !0), O.Stop); + } + } + }), + V) + ) + return O.ReplaceSkip([]); + k.value = J(C); + }), + (c && !u) || (h && !d) || (v && d) || (m && !v && !d)) + ) + return null; + if (v) + for (let [k, w] of f) { + let x = w.nodes.indexOf(k); + x !== -1 && w.nodes.splice(x, 1); + } + return s.nodes; + }), + i.utilities.suggest(r.slice(0, -2), () => { + let n = [], + s = []; + for (let [ + a, + { literals: m, usedSpacingNumber: c, usedSpacingInteger: u, themeKeys: h }, + ] of [ + [n, t["--value"]], + [s, t["--modifier"]], + ]) { + for (let d of m) a.push(d); + if (c) a.push(...st); + else if (u) for (let d of st) E(d) && a.push(d); + for (let d of i.theme.keysInNamespaces(h)) + a.push(d.replace(_r, (f, v, k) => `${v}.${k}`)); + } + return [{ values: n, modifiers: s }]; + })); + } + : _o.test(r) + ? (i) => { + i.utilities.static(r, () => e.nodes.map(re)); + } + : null; + } + function Or(e, r, i) { + for (let t of r.nodes) { + if ( + e.kind === "named" && + t.kind === "word" && + (t.value[0] === "'" || t.value[0] === '"') && + t.value[t.value.length - 1] === t.value[0] && + t.value.slice(1, -1) === e.value + ) + return { nodes: G(e.value) }; + if (e.kind === "named" && t.kind === "word" && t.value[0] === "-" && t.value[1] === "-") { + let n = t.value; + if (n.endsWith("-*")) { + n = n.slice(0, -2); + let s = i.theme.resolve(e.value, [n]); + if (s) return { nodes: G(s) }; + } else { + let s = n.split("-*"); + if (s.length <= 1) continue; + let a = [s.shift()], + m = i.theme.resolveWith(e.value, a, s); + if (m) { + let [, c = {}] = m; + { + let u = c[s.pop()]; + if (u) return { nodes: G(u) }; + } + } + } + } else if (e.kind === "named" && t.kind === "word") { + if (!Lt.includes(t.value)) continue; + let n = t.value === "ratio" && "fraction" in e ? e.fraction : e.value; + if (!n) continue; + let s = Z(n, [t.value]); + if (s === null) continue; + if (s === "ratio") { + let [a, m] = z(n, "/"); + if (!E(a) || !E(m)) continue; + } else { + if (s === "number" && !Te(n)) continue; + if (s === "percentage" && !E(n.slice(0, -1))) continue; + } + return { nodes: G(n), ratio: s === "ratio" }; + } else if ( + e.kind === "arbitrary" && + t.kind === "word" && + t.value[0] === "[" && + t.value[t.value.length - 1] === "]" + ) { + let n = t.value.slice(1, -1); + if (n === "*") return { nodes: G(e.value) }; + if ("dataType" in e && e.dataType && e.dataType !== n) continue; + if ("dataType" in e && e.dataType) return { nodes: G(e.value) }; + if (Z(e.value, [n]) !== null) return { nodes: G(e.value) }; + } + } + } + function he(e, r, i, t, n = "") { + let s = !1, + a = Fe(r, (c) => + i == null + ? t(c) + : c.startsWith("current") + ? t(Q(c, i)) + : ((c.startsWith("var(") || i.startsWith("var(")) && (s = !0), t(Pr(c, i))), + ); + function m(c) { + return n + ? z(c, ",") + .map((u) => n + u) + .join(",") + : c; + } + return s + ? [o(e, m(Fe(r, t))), Y("@supports (color: lab(from red l a b))", [o(e, m(a))])] + : [o(e, m(a))]; + } + function at(e, r, i, t, n = "") { + let s = !1, + a = z(r, ",") + .map((m) => + Fe(m, (c) => + i == null + ? t(c) + : c.startsWith("current") + ? t(Q(c, i)) + : ((c.startsWith("var(") || i.startsWith("var(")) && (s = !0), t(Pr(c, i))), + ), + ) + .map((m) => `drop-shadow(${m})`) + .join(" "); + return s + ? [ + o( + e, + n + + z(r, ",") + .map((m) => `drop-shadow(${Fe(m, t)})`) + .join(" "), + ), + Y("@supports (color: lab(from red l a b))", [o(e, n + a)]), + ] + : [o(e, n + a)]; + } + var jt = { "--alpha": Do, "--spacing": zo, "--theme": Ko, theme: Lo }; + function Do(e, r, i, ...t) { + let [n, s] = z(i, "/").map((a) => a.trim()); + if (!n || !s) + throw new Error( + `The --alpha(\u2026) function requires a color and an alpha value, e.g.: \`--alpha(${n || "var(--my-color)"} / ${s || "50%"})\``, + ); + if (t.length > 0) + throw new Error( + `The --alpha(\u2026) function only accepts one argument, e.g.: \`--alpha(${n || "var(--my-color)"} / ${s || "50%"})\``, + ); + return Q(n, s); + } + function zo(e, r, i, ...t) { + if (!i) + throw new Error("The --spacing(\u2026) function requires an argument, but received none."); + if (t.length > 0) + throw new Error( + `The --spacing(\u2026) function only accepts a single argument, but received ${t.length + 1}.`, + ); + let n = e.theme.resolve(null, ["--spacing"]); + if (!n) + throw new Error( + "The --spacing(\u2026) function requires that the `--spacing` theme variable exists, but it was not found.", + ); + return `calc(${n} * ${i})`; + } + function Ko(e, r, i, ...t) { + if (!i.startsWith("--")) + throw new Error( + "The --theme(\u2026) function can only be used with CSS variables from your theme.", + ); + let n = !1; + (i.endsWith(" inline") && ((n = !0), (i = i.slice(0, -7))), r.kind === "at-rule" && (n = !0)); + let s = e.resolveThemeValue(i, n); + if (!s) { + if (t.length > 0) return t.join(", "); + throw new Error( + `Could not resolve value for theme function: \`theme(${i})\`. Consider checking if the variable name is correct or provide a fallback value to silence this error.`, + ); + } + if (t.length === 0) return s; + let a = t.join(", "); + if (a === "initial") return s; + if (s === "initial") return a; + if (s.startsWith("var(") || s.startsWith("theme(") || s.startsWith("--theme(")) { + let m = G(s); + return (Io(m, a), J(m)); + } + return s; + } + function Lo(e, r, i, ...t) { + i = jo(i); + let n = e.resolveThemeValue(i); + if (!n && t.length > 0) return t.join(", "); + if (!n) + throw new Error( + `Could not resolve value for theme function: \`theme(${i})\`. Consider checking if the path is correct or provide a fallback value to silence this error.`, + ); + return n; + } + var zr = new RegExp( + Object.keys(jt) + .map((e) => `${e}\\(`) + .join("|"), + ); + function Re(e, r) { + let i = 0; + return ( + D(e, (t) => { + if (t.kind === "declaration" && t.value && zr.test(t.value)) { + ((i |= 8), (t.value = Kr(t.value, t, r))); + return; + } + t.kind === "at-rule" && + (t.name === "@media" || + t.name === "@custom-media" || + t.name === "@container" || + t.name === "@supports") && + zr.test(t.params) && + ((i |= 8), (t.params = Kr(t.params, t, r))); + }), + i + ); + } + function Kr(e, r, i) { + let t = G(e); + return ( + D(t, (n) => { + if (n.kind === "function" && n.value in jt) { + let s = z(J(n.nodes).trim(), ",").map((m) => m.trim()), + a = jt[n.value](i, r, ...s); + return O.Replace(G(a)); + } + }), + J(t) + ); + } + function jo(e) { + if (e[0] !== "'" && e[0] !== '"') return e; + let r = "", + i = e[0]; + for (let t = 1; t < e.length - 1; t++) { + let n = e[t], + s = e[t + 1]; + n === "\\" && (s === i || s === "\\") ? ((r += s), t++) : (r += n); + } + return r; + } + function Io(e, r) { + D(e, (i) => { + if ( + i.kind === "function" && + !(i.value !== "var" && i.value !== "theme" && i.value !== "--theme") + ) + if (i.nodes.length === 1) i.nodes.push({ kind: "word", value: `, ${r}` }); + else { + let t = i.nodes[i.nodes.length - 1]; + t.kind === "word" && t.value === "initial" && (t.value = r); + } + }); + } + function Lr() { + return []; + } + function jr() { + return []; + } + function Ir() { + return []; + } + function Fr(e, r) { + let { astNodes: i, nodeSorting: t } = ve(Array.from(r), e), + n = new Map(r.map((a) => [a, null])), + s = 0n; + for (let a of i) { + let m = t.get(a)?.candidate; + m && n.set(m, n.get(m) ?? s++); + } + return r.map((a) => [a, n.get(a) ?? null]); + } + var ct = /^@?[a-z0-9][a-zA-Z0-9_-]*(? { + a.kind === "rule" + ? n.push(a.selector) + : a.kind === "at-rule" && a.name === "@variant" + ? (s = !0) + : a.kind === "at-rule" && a.name !== "@slot" && n.push(`${a.name} ${a.params}`); + }), + this.static( + r, + (a) => { + let m = i.map(re); + (s && Me(m, t), Ft(m, a.nodes), (a.nodes = m)); + }, + { compounds: $e(n) }, + )); + } + functional(r, i, { compounds: t, order: n } = {}) { + this.set(r, { + kind: "functional", + applyFn: i, + compoundsWith: 0, + compounds: t ?? 2, + order: n, + }); + } + compound(r, i, t, { compounds: n, order: s } = {}) { + this.set(r, { kind: "compound", applyFn: t, compoundsWith: i, compounds: n ?? 2, order: s }); + } + group(r, i) { + ((this.groupOrder = this.nextOrder()), + i && this.compareFns.set(this.groupOrder, i), + r(), + (this.groupOrder = null)); + } + has(r) { + return this.variants.has(r); + } + get(r) { + return this.variants.get(r); + } + kind(r) { + return this.variants.get(r)?.kind; + } + compoundsWith(r, i) { + let t = this.variants.get(r), + n = + typeof i == "string" + ? this.variants.get(i) + : i.kind === "arbitrary" + ? { compounds: $e([i.selector]) } + : this.variants.get(i.root); + return !( + !t || + !n || + t.kind !== "compound" || + n.compounds === 0 || + t.compoundsWith === 0 || + (t.compoundsWith & n.compounds) === 0 + ); + } + suggest(r, i) { + this.completions.set(r, i); + } + getCompletions(r) { + return this.completions.get(r)?.() ?? []; + } + compare(r, i) { + if (r === i) return 0; + if (r === null) return -1; + if (i === null) return 1; + if (r.kind === "arbitrary" && i.kind === "arbitrary") return r.selector < i.selector ? -1 : 1; + if (r.kind === "arbitrary") return 1; + if (i.kind === "arbitrary") return -1; + let t = this.variants.get(r.root).order, + n = this.variants.get(i.root).order, + s = t - n; + if (s !== 0) return s; + if (r.kind === "compound" && i.kind === "compound") { + let u = this.compare(r.variant, i.variant); + return u !== 0 + ? u + : r.modifier && i.modifier + ? r.modifier.value < i.modifier.value + ? -1 + : 1 + : r.modifier + ? 1 + : i.modifier + ? -1 + : 0; + } + let a = this.compareFns.get(t); + if (a !== void 0) return a(r, i); + if (r.root !== i.root) return r.root < i.root ? -1 : 1; + let m = r.value, + c = i.value; + return m === null + ? -1 + : c === null || (m.kind === "arbitrary" && c.kind !== "arbitrary") + ? 1 + : (m.kind !== "arbitrary" && c.kind === "arbitrary") || m.value < c.value + ? -1 + : 1; + } + keys() { + return this.variants.keys(); + } + entries() { + return this.variants.entries(); + } + set(r, { kind: i, applyFn: t, compounds: n, compoundsWith: s, order: a }) { + let m = this.variants.get(r); + m + ? Object.assign(m, { kind: i, applyFn: t, compounds: n }) + : (a === void 0 && ((this.lastOrder = this.nextOrder()), (a = this.lastOrder)), + this.variants.set(r, { kind: i, applyFn: t, order: a, compoundsWith: s, compounds: n })); + } + nextOrder() { + return this.groupOrder ?? this.lastOrder + 1; + } + }; + function $e(e) { + let r = 0; + for (let i of e) { + if (i[0] === "@") { + if (!i.startsWith("@media") && !i.startsWith("@supports") && !i.startsWith("@container")) + return 0; + r |= 1; + continue; + } + if (i.includes("::")) return 0; + r |= 2; + } + return r; + } + function Wr(e) { + let r = new It(); + function i(u, h, { compounds: d } = {}) { + ((d = d ?? $e(h)), + r.static( + u, + (f) => { + f.nodes = h.map((v) => Y(v, f.nodes)); + }, + { compounds: d }, + )); + } + (i("*", [":is(& > *)"], { compounds: 0 }), i("**", [":is(& *)"], { compounds: 0 })); + function t(u, h) { + return h.map((d) => { + d = d.trim(); + let f = z(d, " "); + return f[0] === "not" + ? f.slice(1).join(" ") + : u === "@container" + ? f[0][0] === "(" + ? `not ${d}` + : f[1] === "not" + ? `${f[0]} ${f.slice(2).join(" ")}` + : `${f[0]} not ${f.slice(1).join(" ")}` + : `not ${d}`; + }); + } + let n = ["@media", "@supports", "@container"]; + function s(u) { + for (let h of n) { + if (h !== u.name) continue; + let d = z(u.params, ","); + return d.length > 1 ? null : ((d = t(u.name, d)), M(u.name, d.join(", "))); + } + return null; + } + function a(u) { + return u.includes("::") + ? null + : `&:not(${z(u, ",") + .map((d) => ((d = d.replaceAll("&", "*")), d)) + .join(", ")})`; + } + (r.compound("not", 3, (u, h) => { + if ((h.variant.kind === "arbitrary" && h.variant.relative) || h.modifier) return null; + let d = !1; + if ( + (D([u], (f, v) => { + if (f.kind !== "rule" && f.kind !== "at-rule") return O.Continue; + if (f.nodes.length > 0) return O.Continue; + let k = [], + w = [], + x = v.path(); + x.push(f); + for (let C of x) C.kind === "at-rule" ? k.push(C) : C.kind === "rule" && w.push(C); + if (k.length > 1) return O.Stop; + if (w.length > 1) return O.Stop; + let V = []; + for (let C of w) { + let y = a(C.selector); + if (!y) return ((d = !1), O.Stop); + V.push(q(y, [])); + } + for (let C of k) { + let y = s(C); + if (!y) return ((d = !1), O.Stop); + V.push(y); + } + return (Object.assign(u, q("&", V)), (d = !0), O.Skip); + }), + u.kind === "rule" && + u.selector === "&" && + u.nodes.length === 1 && + Object.assign(u, u.nodes[0]), + !d) + ) + return null; + }), + r.suggest("not", () => Array.from(r.keys()).filter((u) => r.compoundsWith("not", u))), + r.compound("group", 2, (u, h) => { + if (h.variant.kind === "arbitrary" && h.variant.relative) return null; + let d = h.modifier + ? `:where(.${e.prefix ? `${e.prefix}\\:` : ""}group\\/${h.modifier.value})` + : `:where(.${e.prefix ? `${e.prefix}\\:` : ""}group)`, + f = !1; + if ( + (D([u], (v, k) => { + if (v.kind !== "rule") return O.Continue; + for (let x of k.path()) if (x.kind === "rule") return ((f = !1), O.Stop); + let w = v.selector.replaceAll("&", d); + (z(w, ",").length > 1 && (w = `:is(${w})`), (v.selector = `&:is(${w} *)`), (f = !0)); + }), + !f) + ) + return null; + }), + r.suggest("group", () => Array.from(r.keys()).filter((u) => r.compoundsWith("group", u))), + r.compound("peer", 2, (u, h) => { + if (h.variant.kind === "arbitrary" && h.variant.relative) return null; + let d = h.modifier + ? `:where(.${e.prefix ? `${e.prefix}\\:` : ""}peer\\/${h.modifier.value})` + : `:where(.${e.prefix ? `${e.prefix}\\:` : ""}peer)`, + f = !1; + if ( + (D([u], (v, k) => { + if (v.kind !== "rule") return O.Continue; + for (let x of k.path()) if (x.kind === "rule") return ((f = !1), O.Stop); + let w = v.selector.replaceAll("&", d); + (z(w, ",").length > 1 && (w = `:is(${w})`), (v.selector = `&:is(${w} ~ *)`), (f = !0)); + }), + !f) + ) + return null; + }), + r.suggest("peer", () => Array.from(r.keys()).filter((u) => r.compoundsWith("peer", u))), + i("first-letter", ["&::first-letter"]), + i("first-line", ["&::first-line"]), + i("marker", [ + "& *::marker", + "&::marker", + "& *::-webkit-details-marker", + "&::-webkit-details-marker", + ]), + i("selection", ["& *::selection", "&::selection"]), + i("file", ["&::file-selector-button"]), + i("placeholder", ["&::placeholder"]), + i("backdrop", ["&::backdrop"]), + i("details-content", ["&::details-content"])); + { + let u = function () { + return F([ + M("@property", "--tw-content", [ + o("syntax", '"*"'), + o("initial-value", '""'), + o("inherits", "false"), + ]), + ]); + }; + var m = u; + (r.static( + "before", + (h) => { + h.nodes = [q("&::before", [u(), o("content", "var(--tw-content)"), ...h.nodes])]; + }, + { compounds: 0 }, + ), + r.static( + "after", + (h) => { + h.nodes = [q("&::after", [u(), o("content", "var(--tw-content)"), ...h.nodes])]; + }, + { compounds: 0 }, + )); + } + (i("first", ["&:first-child"]), + i("last", ["&:last-child"]), + i("only", ["&:only-child"]), + i("odd", ["&:nth-child(odd)"]), + i("even", ["&:nth-child(even)"]), + i("first-of-type", ["&:first-of-type"]), + i("last-of-type", ["&:last-of-type"]), + i("only-of-type", ["&:only-of-type"]), + i("visited", ["&:visited"]), + i("target", ["&:target"]), + i("open", ["&:is([open], :popover-open, :open)"]), + i("default", ["&:default"]), + i("checked", ["&:checked"]), + i("indeterminate", ["&:indeterminate"]), + i("placeholder-shown", ["&:placeholder-shown"]), + i("autofill", ["&:autofill"]), + i("optional", ["&:optional"]), + i("required", ["&:required"]), + i("valid", ["&:valid"]), + i("invalid", ["&:invalid"]), + i("user-valid", ["&:user-valid"]), + i("user-invalid", ["&:user-invalid"]), + i("in-range", ["&:in-range"]), + i("out-of-range", ["&:out-of-range"]), + i("read-only", ["&:read-only"]), + i("empty", ["&:empty"]), + i("focus-within", ["&:focus-within"]), + r.static("hover", (u) => { + u.nodes = [q("&:hover", [M("@media", "(hover: hover)", u.nodes)])]; + }), + i("focus", ["&:focus"]), + i("focus-visible", ["&:focus-visible"]), + i("active", ["&:active"]), + i("enabled", ["&:enabled"]), + i("disabled", ["&:disabled"]), + i("inert", ["&:is([inert], [inert] *)"]), + r.compound("in", 2, (u, h) => { + if (h.modifier) return null; + let d = !1; + if ( + (D([u], (f, v) => { + if (f.kind !== "rule") return O.Continue; + for (let k of v.path()) if (k.kind === "rule") return ((d = !1), O.Stop); + ((f.selector = `:where(${f.selector.replaceAll("&", "*")}) &`), (d = !0)); + }), + !d) + ) + return null; + }), + r.suggest("in", () => Array.from(r.keys()).filter((u) => r.compoundsWith("in", u))), + r.compound("has", 2, (u, h) => { + if (h.modifier) return null; + let d = !1; + if ( + (D([u], (f, v) => { + if (f.kind !== "rule") return O.Continue; + for (let k of v.path()) if (k.kind === "rule") return ((d = !1), O.Stop); + ((f.selector = `&:has(${f.selector.replaceAll("&", "*")})`), (d = !0)); + }), + !d) + ) + return null; + }), + r.suggest("has", () => Array.from(r.keys()).filter((u) => r.compoundsWith("has", u))), + r.functional("aria", (u, h) => { + if (!h.value || h.modifier) return null; + h.value.kind === "arbitrary" + ? (u.nodes = [q(`&[aria-${Mr(h.value.value)}]`, u.nodes)]) + : (u.nodes = [q(`&[aria-${h.value.value}="true"]`, u.nodes)]); + }), + r.suggest("aria", () => [ + "busy", + "checked", + "disabled", + "expanded", + "hidden", + "pressed", + "readonly", + "required", + "selected", + ]), + r.functional("data", (u, h) => { + if (!h.value || h.modifier) return null; + u.nodes = [q(`&[data-${Mr(h.value.value)}]`, u.nodes)]; + }), + r.functional("nth", (u, h) => { + if (!h.value || h.modifier || (h.value.kind === "named" && !E(h.value.value))) return null; + u.nodes = [q(`&:nth-child(${h.value.value})`, u.nodes)]; + }), + r.functional("nth-last", (u, h) => { + if (!h.value || h.modifier || (h.value.kind === "named" && !E(h.value.value))) return null; + u.nodes = [q(`&:nth-last-child(${h.value.value})`, u.nodes)]; + }), + r.functional("nth-of-type", (u, h) => { + if (!h.value || h.modifier || (h.value.kind === "named" && !E(h.value.value))) return null; + u.nodes = [q(`&:nth-of-type(${h.value.value})`, u.nodes)]; + }), + r.functional("nth-last-of-type", (u, h) => { + if (!h.value || h.modifier || (h.value.kind === "named" && !E(h.value.value))) return null; + u.nodes = [q(`&:nth-last-of-type(${h.value.value})`, u.nodes)]; + }), + r.functional( + "supports", + (u, h) => { + if (!h.value || h.modifier) return null; + let d = h.value.value; + if (d === null) return null; + if (/^[\w-]*\s*\(/.test(d)) { + let f = d.replace(/\b(and|or|not)\b/g, " $1 "); + u.nodes = [M("@supports", f, u.nodes)]; + return; + } + (d.includes(":") || (d = `${d}: var(--tw)`), + (d[0] !== "(" || d[d.length - 1] !== ")") && (d = `(${d})`), + (u.nodes = [M("@supports", d, u.nodes)])); + }, + { compounds: 1 }, + ), + i("motion-safe", ["@media (prefers-reduced-motion: no-preference)"]), + i("motion-reduce", ["@media (prefers-reduced-motion: reduce)"]), + i("contrast-more", ["@media (prefers-contrast: more)"]), + i("contrast-less", ["@media (prefers-contrast: less)"])); + { + let u = function (h, d, f, v) { + if (h === d) return 0; + let k = v.get(h); + if (k === null) return f === "asc" ? -1 : 1; + let w = v.get(d); + return w === null ? (f === "asc" ? 1 : -1) : Ce(k, w, f); + }; + var c = u; + { + let h = e.namespace("--breakpoint"), + d = new H((f) => { + switch (f.kind) { + case "static": + return e.resolveValue(f.root, ["--breakpoint"]) ?? null; + case "functional": { + if (!f.value || f.modifier) return null; + let v = null; + return ( + f.value.kind === "arbitrary" + ? (v = f.value.value) + : f.value.kind === "named" && + (v = e.resolveValue(f.value.value, ["--breakpoint"])), + !v || v.includes("var(") ? null : v + ); + } + case "arbitrary": + case "compound": + return null; + } + }); + (r.group( + () => { + r.functional( + "max", + (f, v) => { + if (v.modifier) return null; + let k = d.get(v); + if (k === null) return null; + f.nodes = [M("@media", `(width < ${k})`, f.nodes)]; + }, + { compounds: 1 }, + ); + }, + (f, v) => u(f, v, "desc", d), + ), + r.suggest("max", () => Array.from(h.keys()).filter((f) => f !== null)), + r.group( + () => { + for (let [f, v] of e.namespace("--breakpoint")) + f !== null && + r.static( + f, + (k) => { + k.nodes = [M("@media", `(width >= ${v})`, k.nodes)]; + }, + { compounds: 1 }, + ); + r.functional( + "min", + (f, v) => { + if (v.modifier) return null; + let k = d.get(v); + if (k === null) return null; + f.nodes = [M("@media", `(width >= ${k})`, f.nodes)]; + }, + { compounds: 1 }, + ); + }, + (f, v) => u(f, v, "asc", d), + ), + r.suggest("min", () => Array.from(h.keys()).filter((f) => f !== null))); + } + { + let h = e.namespace("--container"), + d = new H((f) => { + switch (f.kind) { + case "functional": { + if (f.value === null) return null; + let v = null; + return ( + f.value.kind === "arbitrary" + ? (v = f.value.value) + : f.value.kind === "named" && + (v = e.resolveValue(f.value.value, ["--container"])), + !v || v.includes("var(") ? null : v + ); + } + case "static": + case "arbitrary": + case "compound": + return null; + } + }); + (r.group( + () => { + r.functional( + "@max", + (f, v) => { + let k = d.get(v); + if (k === null) return null; + f.nodes = [ + M( + "@container", + v.modifier ? `${v.modifier.value} (width < ${k})` : `(width < ${k})`, + f.nodes, + ), + ]; + }, + { compounds: 1 }, + ); + }, + (f, v) => u(f, v, "desc", d), + ), + r.suggest("@max", () => Array.from(h.keys()).filter((f) => f !== null)), + r.group( + () => { + (r.functional( + "@", + (f, v) => { + let k = d.get(v); + if (k === null) return null; + f.nodes = [ + M( + "@container", + v.modifier ? `${v.modifier.value} (width >= ${k})` : `(width >= ${k})`, + f.nodes, + ), + ]; + }, + { compounds: 1 }, + ), + r.functional( + "@min", + (f, v) => { + let k = d.get(v); + if (k === null) return null; + f.nodes = [ + M( + "@container", + v.modifier ? `${v.modifier.value} (width >= ${k})` : `(width >= ${k})`, + f.nodes, + ), + ]; + }, + { compounds: 1 }, + )); + }, + (f, v) => u(f, v, "asc", d), + ), + r.suggest("@min", () => Array.from(h.keys()).filter((f) => f !== null)), + r.suggest("@", () => Array.from(h.keys()).filter((f) => f !== null))); + } + } + return ( + i("portrait", ["@media (orientation: portrait)"]), + i("landscape", ["@media (orientation: landscape)"]), + i("ltr", ['&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *)']), + i("rtl", ['&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)']), + i("dark", ["@media (prefers-color-scheme: dark)"]), + i("starting", ["@starting-style"]), + i("print", ["@media print"]), + i("forced-colors", ["@media (forced-colors: active)"]), + i("inverted-colors", ["@media (inverted-colors: inverted)"]), + i("pointer-none", ["@media (pointer: none)"]), + i("pointer-coarse", ["@media (pointer: coarse)"]), + i("pointer-fine", ["@media (pointer: fine)"]), + i("any-pointer-none", ["@media (any-pointer: none)"]), + i("any-pointer-coarse", ["@media (any-pointer: coarse)"]), + i("any-pointer-fine", ["@media (any-pointer: fine)"]), + i("noscript", ["@media (scripting: none)"]), + r + ); + } + function Mr(e) { + if (e.includes("=")) { + let [r, ...i] = z(e, "="), + t = i.join("=").trim(); + if (t[0] === "'" || t[0] === '"') return e; + if (t.length > 1) { + let n = t[t.length - 1]; + if (t[t.length - 2] === " " && (n === "i" || n === "I" || n === "s" || n === "S")) + return `${r}="${t.slice(0, -2)}" ${n}`; + } + return `${r}="${t}"`; + } + return e; + } + function Ft(e, r) { + D(e, (i) => { + if (i.kind === "at-rule" && i.name === "@slot") return O.Replace(r); + if (i.kind === "at-rule" && (i.name === "@keyframes" || i.name === "@property")) + return (Object.assign(i, F([M(i.name, i.params, i.nodes)])), O.Skip); + }); + } + function Me(e, r) { + let i = 0; + return ( + D(e, (t) => { + if (t.kind !== "at-rule" || t.name !== "@variant") return; + let n = q("&", t.nodes), + s = t.params, + a = r.parseVariant(s); + if (a === null) throw new Error(`Cannot use \`@variant\` with unknown variant: ${s}`); + if (ft(n, a, r.variants) === null) + throw new Error(`Cannot use \`@variant\` with variant: ${s}`); + return ((i |= 32), O.Replace(n)); + }), + i + ); + } + function Br(e, r) { + let i = Ur(e), + t = Wr(e), + n = new H((d) => Ar(d, h)), + s = new H((d) => Array.from(xr(d, h))), + a = new H( + (d) => + new H((f) => { + let v = qr(f, h, d); + try { + (Re( + v.map(({ node: k }) => k), + h, + ), + Me( + v.map(({ node: k }) => k), + h, + )); + } catch { + return []; + } + return v; + }), + ), + m = new H((d) => { + for (let f of tt(d)) e.markUsedVariable(f); + }); + function c(d) { + let f = []; + for (let v of d) { + let k = !0, + { astNodes: w } = ve([v], h, { + onInvalidCandidate() { + k = !1; + }, + }); + (r && D(w, (x) => ((x.src ??= r), O.Continue)), (w = Ae(w, h, 0)), f.push(k ? w : [])); + } + return f; + } + function u(d) { + return c(d).map((f) => (f.length > 0 ? oe(f) : null)); + } + let h = { + theme: e, + utilities: i, + variants: t, + invalidCandidates: new Set(), + important: !1, + candidatesToCss: u, + candidatesToAst: c, + getClassOrder(d) { + return Fr(this, d); + }, + getClassList() { + return Lr(this); + }, + getVariants() { + return jr(this); + }, + parseCandidate(d) { + return s.get(d); + }, + parseVariant(d) { + return n.get(d); + }, + compileAstNodes(d, f = 1) { + return a.get(f).get(d); + }, + printCandidate(d) { + return Tr(h, d); + }, + printVariant(d) { + return ot(d); + }, + getVariantOrder() { + let d = Array.from(n.values()); + d.sort((w, x) => this.variants.compare(w, x)); + let f = new Map(), + v, + k = 0; + for (let w of d) + w !== null && + (v !== void 0 && this.variants.compare(v, w) !== 0 && k++, f.set(w, k), (v = w)); + return f; + }, + resolveThemeValue(d, f = !0) { + let v = d.lastIndexOf("/"), + k = null; + v !== -1 && ((k = d.slice(v + 1).trim()), (d = d.slice(0, v).trim())); + let w = e.resolve(null, [d], f ? 1 : 0) ?? void 0; + return k && w ? Q(w, k) : w; + }, + trackUsedVariables(d) { + m.get(d); + }, + canonicalizeCandidates(d, f) { + return Ir(this, d, f); + }, + storage: {}, + }; + return h; + } + var Mt = [ + "container-type", + "pointer-events", + "visibility", + "position", + "inset", + "inset-inline", + "inset-block", + "inset-inline-start", + "inset-inline-end", + "top", + "right", + "bottom", + "left", + "isolation", + "z-index", + "order", + "grid-column", + "grid-column-start", + "grid-column-end", + "grid-row", + "grid-row-start", + "grid-row-end", + "float", + "clear", + "--tw-container-component", + "margin", + "margin-inline", + "margin-block", + "margin-inline-start", + "margin-inline-end", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "box-sizing", + "display", + "field-sizing", + "aspect-ratio", + "height", + "max-height", + "min-height", + "width", + "max-width", + "min-width", + "flex", + "flex-shrink", + "flex-grow", + "flex-basis", + "table-layout", + "caption-side", + "border-collapse", + "border-spacing", + "transform-origin", + "translate", + "--tw-translate-x", + "--tw-translate-y", + "--tw-translate-z", + "scale", + "--tw-scale-x", + "--tw-scale-y", + "--tw-scale-z", + "rotate", + "--tw-rotate-x", + "--tw-rotate-y", + "--tw-rotate-z", + "--tw-skew-x", + "--tw-skew-y", + "transform", + "animation", + "cursor", + "touch-action", + "--tw-pan-x", + "--tw-pan-y", + "--tw-pinch-zoom", + "resize", + "scroll-snap-type", + "--tw-scroll-snap-strictness", + "scroll-snap-align", + "scroll-snap-stop", + "scroll-margin", + "scroll-margin-inline", + "scroll-margin-block", + "scroll-margin-inline-start", + "scroll-margin-inline-end", + "scroll-margin-top", + "scroll-margin-right", + "scroll-margin-bottom", + "scroll-margin-left", + "scroll-padding", + "scroll-padding-inline", + "scroll-padding-block", + "scroll-padding-inline-start", + "scroll-padding-inline-end", + "scroll-padding-top", + "scroll-padding-right", + "scroll-padding-bottom", + "scroll-padding-left", + "list-style-position", + "list-style-type", + "list-style-image", + "appearance", + "columns", + "break-before", + "break-inside", + "break-after", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-template-columns", + "grid-template-rows", + "flex-direction", + "flex-wrap", + "place-content", + "place-items", + "align-content", + "align-items", + "justify-content", + "justify-items", + "gap", + "column-gap", + "row-gap", + "--tw-space-x-reverse", + "--tw-space-y-reverse", + "divide-x-width", + "divide-y-width", + "--tw-divide-y-reverse", + "divide-style", + "divide-color", + "place-self", + "align-self", + "justify-self", + "overflow", + "overflow-x", + "overflow-y", + "overscroll-behavior", + "overscroll-behavior-x", + "overscroll-behavior-y", + "scroll-behavior", + "border-radius", + "border-start-radius", + "border-end-radius", + "border-top-radius", + "border-right-radius", + "border-bottom-radius", + "border-left-radius", + "border-start-start-radius", + "border-start-end-radius", + "border-end-end-radius", + "border-end-start-radius", + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "border-width", + "border-inline-width", + "border-block-width", + "border-inline-start-width", + "border-inline-end-width", + "border-top-width", + "border-right-width", + "border-bottom-width", + "border-left-width", + "border-style", + "border-inline-style", + "border-block-style", + "border-inline-start-style", + "border-inline-end-style", + "border-top-style", + "border-right-style", + "border-bottom-style", + "border-left-style", + "border-color", + "border-inline-color", + "border-block-color", + "border-inline-start-color", + "border-inline-end-color", + "border-top-color", + "border-right-color", + "border-bottom-color", + "border-left-color", + "background-color", + "background-image", + "--tw-gradient-position", + "--tw-gradient-stops", + "--tw-gradient-via-stops", + "--tw-gradient-from", + "--tw-gradient-from-position", + "--tw-gradient-via", + "--tw-gradient-via-position", + "--tw-gradient-to", + "--tw-gradient-to-position", + "mask-image", + "--tw-mask-top", + "--tw-mask-top-from-color", + "--tw-mask-top-from-position", + "--tw-mask-top-to-color", + "--tw-mask-top-to-position", + "--tw-mask-right", + "--tw-mask-right-from-color", + "--tw-mask-right-from-position", + "--tw-mask-right-to-color", + "--tw-mask-right-to-position", + "--tw-mask-bottom", + "--tw-mask-bottom-from-color", + "--tw-mask-bottom-from-position", + "--tw-mask-bottom-to-color", + "--tw-mask-bottom-to-position", + "--tw-mask-left", + "--tw-mask-left-from-color", + "--tw-mask-left-from-position", + "--tw-mask-left-to-color", + "--tw-mask-left-to-position", + "--tw-mask-linear", + "--tw-mask-linear-position", + "--tw-mask-linear-from-color", + "--tw-mask-linear-from-position", + "--tw-mask-linear-to-color", + "--tw-mask-linear-to-position", + "--tw-mask-radial", + "--tw-mask-radial-shape", + "--tw-mask-radial-size", + "--tw-mask-radial-position", + "--tw-mask-radial-from-color", + "--tw-mask-radial-from-position", + "--tw-mask-radial-to-color", + "--tw-mask-radial-to-position", + "--tw-mask-conic", + "--tw-mask-conic-position", + "--tw-mask-conic-from-color", + "--tw-mask-conic-from-position", + "--tw-mask-conic-to-color", + "--tw-mask-conic-to-position", + "box-decoration-break", + "background-size", + "background-attachment", + "background-clip", + "background-position", + "background-repeat", + "background-origin", + "mask-composite", + "mask-mode", + "mask-type", + "mask-size", + "mask-clip", + "mask-position", + "mask-repeat", + "mask-origin", + "fill", + "stroke", + "stroke-width", + "object-fit", + "object-position", + "padding", + "padding-inline", + "padding-block", + "padding-inline-start", + "padding-inline-end", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left", + "text-align", + "text-indent", + "vertical-align", + "font-family", + "font-size", + "line-height", + "font-weight", + "letter-spacing", + "text-wrap", + "overflow-wrap", + "word-break", + "text-overflow", + "hyphens", + "white-space", + "color", + "text-transform", + "font-style", + "font-stretch", + "font-variant-numeric", + "text-decoration-line", + "text-decoration-color", + "text-decoration-style", + "text-decoration-thickness", + "text-underline-offset", + "-webkit-font-smoothing", + "placeholder-color", + "caret-color", + "accent-color", + "color-scheme", + "opacity", + "background-blend-mode", + "mix-blend-mode", + "box-shadow", + "--tw-shadow", + "--tw-shadow-color", + "--tw-ring-shadow", + "--tw-ring-color", + "--tw-inset-shadow", + "--tw-inset-shadow-color", + "--tw-inset-ring-shadow", + "--tw-inset-ring-color", + "--tw-ring-offset-width", + "--tw-ring-offset-color", + "outline", + "outline-width", + "outline-offset", + "outline-color", + "--tw-blur", + "--tw-brightness", + "--tw-contrast", + "--tw-drop-shadow", + "--tw-grayscale", + "--tw-hue-rotate", + "--tw-invert", + "--tw-saturate", + "--tw-sepia", + "filter", + "--tw-backdrop-blur", + "--tw-backdrop-brightness", + "--tw-backdrop-contrast", + "--tw-backdrop-grayscale", + "--tw-backdrop-hue-rotate", + "--tw-backdrop-invert", + "--tw-backdrop-opacity", + "--tw-backdrop-saturate", + "--tw-backdrop-sepia", + "backdrop-filter", + "transition-property", + "transition-behavior", + "transition-delay", + "transition-duration", + "transition-timing-function", + "will-change", + "contain", + "content", + "forced-color-adjust", + ]; + function Hr(e, r) { + let i = e.length, + t = r.length, + n = i < t ? i : t; + for (let s = 0; s < n; s++) { + let a = e.charCodeAt(s), + m = r.charCodeAt(s); + if (a >= 48 && a <= 57 && m >= 48 && m <= 57) { + let c = s, + u = s + 1, + h = s, + d = s + 1; + for (a = e.charCodeAt(u); a >= 48 && a <= 57; ) a = e.charCodeAt(++u); + for (m = r.charCodeAt(d); m >= 48 && m <= 57; ) m = r.charCodeAt(++d); + let f = e.slice(c, u), + v = r.slice(h, d), + k = Number(f) - Number(v); + if (k) return k; + if (f < v) return -1; + if (f > v) return 1; + continue; + } + if (a !== m) return a - m; + } + return e.length - r.length; + } + function ve(e, r, { onInvalidCandidate: i, respectImportant: t } = {}) { + let n = new Map(), + s = [], + a = new Map(); + for (let u of e) { + if (r.invalidCandidates.has(u)) { + i?.(u); + continue; + } + let h = r.parseCandidate(u); + if (h.length === 0) { + i?.(u); + continue; + } + a.set(u, h); + } + let m = 0; + (t ?? !0) && (m |= 1); + let c = r.getVariantOrder(); + for (let [u, h] of a) { + let d = !1; + for (let f of h) { + let v = r.compileAstNodes(f, m); + if (v.length !== 0) { + d = !0; + for (let { node: k, propertySort: w } of v) { + let x = 0n; + for (let V of f.variants) x |= 1n << BigInt(c.get(V)); + (n.set(k, { properties: w, variants: x, candidate: u }), s.push(k)); + } + } + } + d || i?.(u); + } + return ( + s.sort((u, h) => { + let d = n.get(u), + f = n.get(h); + if (d.variants - f.variants !== 0n) return Number(d.variants - f.variants); + let v = 0; + for ( + ; + v < d.properties.order.length && + v < f.properties.order.length && + d.properties.order[v] === f.properties.order[v]; + ) + v += 1; + return ( + (d.properties.order[v] ?? 1 / 0) - (f.properties.order[v] ?? 1 / 0) || + f.properties.count - d.properties.count || + Hr(d.candidate, f.candidate) + ); + }), + { astNodes: s, nodeSorting: n } + ); + } + function qr(e, r, i) { + let t = Fo(e, r); + if (t.length === 0) return []; + let n = r.important && !!(i & 1), + s = [], + a = `.${ge(e.raw)}`; + for (let m of t) { + let c = Mo(m); + (e.important || n) && Yr(m); + let u = { kind: "rule", selector: a, nodes: m }; + for (let h of e.variants) if (ft(u, h, r.variants) === null) return []; + s.push({ node: u, propertySort: c }); + } + return s; + } + function ft(e, r, i, t = 0) { + if (r.kind === "arbitrary") { + if (r.relative && t === 0) return null; + e.nodes = [Y(r.selector, e.nodes)]; + return; + } + let { applyFn: n } = i.get(r.root); + if (r.kind === "compound") { + let a = M("@slot"); + if (ft(a, r.variant, i, t + 1) === null || (r.root === "not" && a.nodes.length > 1)) + return null; + for (let c of a.nodes) + if ((c.kind !== "rule" && c.kind !== "at-rule") || n(c, r) === null) return null; + (D(a.nodes, (c) => { + if ((c.kind === "rule" || c.kind === "at-rule") && c.nodes.length <= 0) + return ((c.nodes = e.nodes), O.Skip); + }), + (e.nodes = a.nodes)); + return; + } + if (n(e, r) === null) return null; + } + function Gr(e) { + let r = e.options?.types ?? []; + return r.length > 1 && r.includes("any"); + } + function Fo(e, r) { + if (e.kind === "arbitrary") { + let a = e.value; + return ( + e.modifier && (a = X(a, e.modifier, r.theme)), a === null ? [] : [[o(e.property, a)]] + ); + } + let i = r.utilities.get(e.root) ?? [], + t = [], + n = i.filter((a) => !Gr(a)); + for (let a of n) { + if (a.kind !== e.kind) continue; + let m = a.compileFn(e); + if (m !== void 0) { + if (m === null) return t; + t.push(m); + } + } + if (t.length > 0) return t; + let s = i.filter((a) => Gr(a)); + for (let a of s) { + if (a.kind !== e.kind) continue; + let m = a.compileFn(e); + if (m !== void 0) { + if (m === null) return t; + t.push(m); + } + } + return t; + } + function Yr(e) { + for (let r of e) + r.kind !== "at-root" && + (r.kind === "declaration" + ? (r.important = !0) + : (r.kind === "rule" || r.kind === "at-rule") && Yr(r.nodes)); + } + function Mo(e) { + let r = new Set(), + i = 0, + t = e.slice(), + n = !1; + for (; t.length > 0; ) { + let s = t.shift(); + if (s.kind === "declaration") { + if (s.value === void 0 || (i++, n)) continue; + if (s.property === "--tw-sort") { + let m = Mt.indexOf(s.value ?? ""); + if (m !== -1) { + (r.add(m), (n = !0)); + continue; + } + } + let a = Mt.indexOf(s.property); + a !== -1 && r.add(a); + } else if (s.kind === "rule" || s.kind === "at-rule") for (let a of s.nodes) t.push(a); + } + return { order: Array.from(r).sort((s, a) => s - a), count: i }; + } + function We(e, r) { + let i = 0, + t = Y("&", e), + n = new Set(), + s = new H(() => new Set()), + a = new H(() => new Set()); + D([t], (d, f) => { + if (d.kind === "at-rule") { + if (d.name === "@keyframes") + return ( + D(d.nodes, (v) => { + if (v.kind === "at-rule" && v.name === "@apply") + throw new Error("You cannot use `@apply` inside `@keyframes`."); + }), + O.Skip + ); + if (d.name === "@utility") { + let v = d.params.replace(/-\*$/, ""); + (a.get(v).add(d), + D(d.nodes, (k) => { + if (!(k.kind !== "at-rule" || k.name !== "@apply")) { + n.add(d); + for (let w of Zr(k, r)) s.get(d).add(w); + } + })); + return; + } + if (d.name === "@apply") { + if (f.parent === null) return; + ((i |= 1), n.add(f.parent)); + for (let v of Zr(d, r)) for (let k of f.path()) n.has(k) && s.get(k).add(v); + } + } + }); + let m = new Set(), + c = [], + u = new Set(); + function h(d, f = []) { + if (!m.has(d)) { + if (u.has(d)) { + let v = f[(f.indexOf(d) + 1) % f.length]; + throw ( + d.kind === "at-rule" && + d.name === "@utility" && + v.kind === "at-rule" && + v.name === "@utility" && + D(d.nodes, (k) => { + if (k.kind !== "at-rule" || k.name !== "@apply") return; + let w = k.params.split(/\s+/g); + for (let x of w) + for (let V of r.parseCandidate(x)) + switch (V.kind) { + case "arbitrary": + break; + case "static": + case "functional": + if (v.params.replace(/-\*$/, "") === V.root) + throw new Error( + `You cannot \`@apply\` the \`${x}\` utility here because it creates a circular dependency.`, + ); + break; + default: + } + }), + new Error(`Circular dependency detected: + +${oe([d])} +Relies on: + +${oe([v])}`) + ); + } + u.add(d); + for (let v of s.get(d)) for (let k of a.get(v)) (f.push(d), h(k, f), f.pop()); + (m.add(d), u.delete(d), c.push(d)); + } + } + for (let d of n) h(d); + for (let d of c) + "nodes" in d && + D(d.nodes, (f) => { + if (f.kind !== "at-rule" || f.name !== "@apply") return; + let v = f.params.split(/(\s+)/g), + k = {}, + w = 0; + for (let [x, V] of v.entries()) (x % 2 === 0 && (k[V] = w), (w += V.length)); + { + let x = Object.keys(k), + V = ve(x, r, { + respectImportant: !1, + onInvalidCandidate: (R) => { + if (r.theme.prefix && !R.startsWith(r.theme.prefix)) + throw new Error( + `Cannot apply unprefixed utility class \`${R}\`. Did you mean \`${r.theme.prefix}:${R}\`?`, + ); + if (r.invalidCandidates.has(R)) + throw new Error( + `Cannot apply utility class \`${R}\` because it has been explicitly disabled: https://tailwindcss.com/docs/detecting-classes-in-source-files#explicitly-excluding-classes`, + ); + let P = z(R, ":"); + if (P.length > 1) { + let L = P.pop(); + if (r.candidatesToCss([L])[0]) { + let U = r.candidatesToCss(P.map((W) => `${W}:[--tw-variant-check:1]`)), + j = P.filter((W, B) => U[B] === null); + if (j.length > 0) { + if (j.length === 1) + throw new Error( + `Cannot apply utility class \`${R}\` because the ${j.map((W) => `\`${W}\``)} variant does not exist.`, + ); + { + let W = new Intl.ListFormat("en", { style: "long", type: "conjunction" }); + throw new Error( + `Cannot apply utility class \`${R}\` because the ${W.format(j.map((B) => `\`${B}\``))} variants do not exist.`, + ); + } + } + } + } + throw r.theme.size === 0 + ? new Error( + `Cannot apply unknown utility class \`${R}\`. Are you using CSS modules or similar and missing \`@reference\`? https://tailwindcss.com/docs/functions-and-directives#reference-directive`, + ) + : new Error(`Cannot apply unknown utility class \`${R}\``); + }, + }), + C = f.src, + y = V.astNodes.map((R) => { + let P = V.nodeSorting.get(R)?.candidate, + L = P ? k[P] : void 0; + if (((R = re(R)), !C || !P || L === void 0)) + return ( + D([R], (j) => { + j.src = C; + }), + R + ); + let U = [C[0], C[1], C[2]]; + return ( + (U[1] += 7 + L), + (U[2] = U[1] + P.length), + D([R], (j) => { + j.src = U; + }), + R + ); + }), + K = []; + for (let R of y) + if (R.kind === "rule") for (let P of R.nodes) K.push(P); + else K.push(R); + return O.Replace(K); + } + }); + return i; + } + function* Zr(e, r) { + for (let i of e.params.split(/\s+/g)) + for (let t of r.parseCandidate(i)) + switch (t.kind) { + case "arbitrary": + break; + case "static": + case "functional": + yield t.root; + break; + default: + } + } + async function Wt(e, r, i, t = 0, n = !1) { + let s = 0, + a = []; + return ( + D(e, (m) => { + if (m.kind === "at-rule" && (m.name === "@import" || m.name === "@reference")) { + let c = Wo(G(m.params)); + if (c === null) return; + (m.name === "@reference" && (c.media = "reference"), (s |= 2)); + let { uri: u, layer: h, media: d, supports: f } = c; + if (u.startsWith("data:") || u.startsWith("http://") || u.startsWith("https://")) return; + let v = fe({}, []); + return ( + a.push( + (async () => { + if (t > 100) + throw new Error( + `Exceeded maximum recursion depth while resolving \`${u}\` in \`${r}\`)`, + ); + let k = await i(u, r), + w = Se(k.content, { from: n ? k.path : void 0 }); + (await Wt(w, k.base, i, t + 1, n), + (v.nodes = Bo(m, [fe({ base: k.base }, w)], h, d, f))); + })(), + ), + O.ReplaceSkip(v) + ); + } + }), + a.length > 0 && (await Promise.all(a)), + s + ); + } + function Wo(e) { + let r, + i = null, + t = null, + n = null; + for (let s = 0; s < e.length; s++) { + let a = e[s]; + if (a.kind !== "separator") { + if (a.kind === "word" && !r) { + if (!a.value || (a.value[0] !== '"' && a.value[0] !== "'")) return null; + r = a.value.slice(1, -1); + continue; + } + if ((a.kind === "function" && a.value.toLowerCase() === "url") || !r) return null; + if ((a.kind === "word" || a.kind === "function") && a.value.toLowerCase() === "layer") { + if (i) return null; + if (n) + throw new Error( + "`layer(\u2026)` in an `@import` should come before any other functions or conditions", + ); + "nodes" in a ? (i = J(a.nodes)) : (i = ""); + continue; + } + if (a.kind === "function" && a.value.toLowerCase() === "supports") { + if (n) return null; + n = J(a.nodes); + continue; + } + t = J(e.slice(s)); + break; + } + } + return r ? { uri: r, layer: i, media: t, supports: n } : null; + } + function Bo(e, r, i, t, n) { + let s = r; + if (i !== null) { + let a = M("@layer", i, s); + ((a.src = e.src), (s = [a])); + } + if (t !== null) { + let a = M("@media", t, s); + ((a.src = e.src), (s = [a])); + } + if (n !== null) { + let a = M("@supports", n[0] === "(" ? n : `(${n})`, s); + ((a.src = e.src), (s = [a])); + } + return s; + } + function Oe(e, r = null) { + return Array.isArray(e) && e.length === 2 && typeof e[1] == "object" && typeof e[1] !== null + ? r + ? (e[1][r] ?? null) + : e[0] + : Array.isArray(e) && r === null + ? e.join(", ") + : typeof e == "string" && r === null + ? e + : null; + } + function Jr(e, { theme: r }, i) { + for (let t of i) { + let n = pt([t]); + n && e.theme.clearNamespace(`--${n}`, 4); + } + for (let [t, n] of qo(r)) { + if (typeof n != "string" && typeof n != "number") continue; + if ( + (typeof n == "string" && (n = n.replace(//g, "1")), + t[0] === "opacity" && (typeof n == "number" || typeof n == "string")) + ) { + let a = typeof n == "string" ? parseFloat(n) : n; + a >= 0 && a <= 1 && (n = a * 100 + "%"); + } + let s = pt(t); + s && e.theme.add(`--${s}`, "" + n, 7); + } + if (Object.hasOwn(r, "fontFamily")) { + let t = 5; + { + let n = Oe(r.fontFamily.sans); + n && + e.theme.hasDefault("--font-sans") && + (e.theme.add("--default-font-family", n, t), + e.theme.add( + "--default-font-feature-settings", + Oe(r.fontFamily.sans, "fontFeatureSettings") ?? "normal", + t, + ), + e.theme.add( + "--default-font-variation-settings", + Oe(r.fontFamily.sans, "fontVariationSettings") ?? "normal", + t, + )); + } + { + let n = Oe(r.fontFamily.mono); + n && + e.theme.hasDefault("--font-mono") && + (e.theme.add("--default-mono-font-family", n, t), + e.theme.add( + "--default-mono-font-feature-settings", + Oe(r.fontFamily.mono, "fontFeatureSettings") ?? "normal", + t, + ), + e.theme.add( + "--default-mono-font-variation-settings", + Oe(r.fontFamily.mono, "fontVariationSettings") ?? "normal", + t, + )); + } + } + return r; + } + function qo(e) { + let r = []; + return ( + Qr(e, [], (i, t) => { + if (Zo(i)) return (r.push([t, i]), 1); + if (Jo(i)) { + r.push([t, i[0]]); + for (let n of Reflect.ownKeys(i[1])) r.push([[...t, `-${n}`], i[1][n]]); + return 1; + } + if (Array.isArray(i) && i.every((n) => typeof n == "string")) + return ( + t[0] === "fontSize" + ? (r.push([t, i[0]]), i.length >= 2 && r.push([[...t, "-line-height"], i[1]])) + : r.push([t, i.join(", ")]), + 1 + ); + }), + r + ); + } + var Ho = { + borderWidth: "border-width", + outlineWidth: "outline-width", + ringColor: "ring-color", + ringWidth: "ring-width", + transitionDuration: "transition-duration", + transitionTimingFunction: "transition-timing-function", + }, + Go = { + animation: "animate", + aspectRatio: "aspect", + borderRadius: "radius", + boxShadow: "shadow", + colors: "color", + containers: "container", + fontFamily: "font", + fontSize: "text", + letterSpacing: "tracking", + lineHeight: "leading", + maxWidth: "container", + screens: "breakpoint", + transitionTimingFunction: "ease", + }, + Yo = /^[a-zA-Z0-9-_%/\.]+$/; + function pt(e) { + let r = Ho[e[0]]; + if (r && e[1] === "DEFAULT") return `default-${r}`; + if (e[0] === "container") return null; + for (let t of e) if (!Yo.test(t)) return null; + let i = Go[e[0]]; + return ( + i && ((e = e.slice()), (e[0] = i)), + e + .map((t, n, s) => (t === "1" && n !== s.length - 1 ? "" : t)) + .map( + (t, n) => ( + (t = t.replaceAll(".", "_")), + (n === 0 || t.startsWith("-") || t === "lineHeight") && + (t = t.replace(/([a-z])([A-Z])/g, (a, m, c) => `${m}-${c.toLowerCase()}`)), + t + ), + ) + .filter((t, n) => t !== "DEFAULT" || n !== e.length - 1) + .join("-") + ); + } + function Zo(e) { + return typeof e == "number" || typeof e == "string"; + } + function Jo(e) { + if ( + !Array.isArray(e) || + e.length !== 2 || + (typeof e[0] != "string" && typeof e[0] != "number") || + e[1] === void 0 || + e[1] === null || + typeof e[1] != "object" + ) + return !1; + for (let r of Reflect.ownKeys(e[1])) + if (typeof r != "string" || (typeof e[1][r] != "string" && typeof e[1][r] != "number")) + return !1; + return !0; + } + function Qr(e, r = [], i) { + for (let t of Reflect.ownKeys(e)) { + let n = e[t]; + if (n == null) continue; + let s = [...r, t], + a = i(n, s) ?? 0; + if (a !== 1) { + if (a === 2) return 2; + if (!(!Array.isArray(n) && typeof n != "object") && Qr(n, s, i) === 2) return 2; + } + } + } + function Qo(e) { + return { kind: "combinator", value: e }; + } + function Xo(e, r) { + return { kind: "function", value: e, nodes: r }; + } + function we(e) { + return { kind: "selector", value: e }; + } + function en(e) { + return { kind: "separator", value: e }; + } + function tn(e) { + return { kind: "value", value: e }; + } + function Be(e) { + let r = ""; + for (let i of e) + switch (i.kind) { + case "combinator": + case "selector": + case "separator": + case "value": { + r += i.value; + break; + } + case "function": + r += i.value + "(" + Be(i.nodes) + ")"; + } + return r; + } + var Xr = 92, + rn = 93, + ei = 41, + on = 58, + ti = 44, + nn = 34, + ln = 46, + ri = 62, + ii = 10, + an = 35, + oi = 91, + ni = 40, + li = 43, + sn = 39, + ai = 32, + si = 9, + ui = 126, + un = 38, + cn = 42; + function dt(e) { + e = e.replaceAll( + `\r +`, + ` +`, + ); + let r = [], + i = [], + t = null, + n = "", + s; + for (let a = 0; a < e.length; a++) { + let m = e.charCodeAt(a); + switch (m) { + case ti: + case ri: + case ii: + case ai: + case li: + case si: + case ui: { + if (n.length > 0) { + let f = we(n); + (t ? t.nodes.push(f) : r.push(f), (n = "")); + } + let c = a, + u = a + 1; + for ( + ; + u < e.length && + ((s = e.charCodeAt(u)), + !(s !== ti && s !== ri && s !== ii && s !== ai && s !== li && s !== si && s !== ui)); + u++ + ); + a = u - 1; + let h = e.slice(c, u), + d = h.trim() === "," ? en(h) : Qo(h); + t ? t.nodes.push(d) : r.push(d); + break; + } + case ni: { + let c = Xo(n, []); + if ( + ((n = ""), + c.value !== ":not" && c.value !== ":where" && c.value !== ":has" && c.value !== ":is") + ) { + let u = a + 1, + h = 0; + for (let f = a + 1; f < e.length; f++) { + if (((s = e.charCodeAt(f)), s === ni)) { + h++; + continue; + } + if (s === ei) { + if (h === 0) { + a = f; + break; + } + h--; + } + } + let d = a; + (c.nodes.push(tn(e.slice(u, d))), (n = ""), (a = d), t ? t.nodes.push(c) : r.push(c)); + break; + } + (t ? t.nodes.push(c) : r.push(c), i.push(c), (t = c)); + break; + } + case ei: { + let c = i.pop(); + if (n.length > 0) { + let u = we(n); + (c.nodes.push(u), (n = "")); + } + i.length > 0 ? (t = i[i.length - 1]) : (t = null); + break; + } + case ln: + case on: + case an: { + if (n.length > 0) { + let c = we(n); + t ? t.nodes.push(c) : r.push(c); + } + n = e[a]; + break; + } + case oi: { + if (n.length > 0) { + let h = we(n); + t ? t.nodes.push(h) : r.push(h); + } + n = ""; + let c = a, + u = 0; + for (let h = a + 1; h < e.length; h++) { + if (((s = e.charCodeAt(h)), s === oi)) { + u++; + continue; + } + if (s === rn) { + if (u === 0) { + a = h; + break; + } + u--; + } + } + n += e.slice(c, a + 1); + break; + } + case sn: + case nn: { + let c = a; + for (let u = a + 1; u < e.length; u++) + if (((s = e.charCodeAt(u)), s === Xr)) u += 1; + else if (s === m) { + a = u; + break; + } + n += e.slice(c, a + 1); + break; + } + case un: + case cn: { + if (n.length > 0) { + let c = we(n); + (t ? t.nodes.push(c) : r.push(c), (n = "")); + } + t ? t.nodes.push(we(e[a])) : r.push(we(e[a])); + break; + } + case Xr: { + ((n += e[a] + e[a + 1]), (a += 1)); + break; + } + default: + n += e[a]; + } + } + return (n.length > 0 && r.push(we(n)), r); + } + function mt(e) { + let r = []; + for (let i of z(e, ".")) { + if (!i.includes("[")) { + r.push(i); + continue; + } + let t = 0; + for (;;) { + let n = i.indexOf("[", t), + s = i.indexOf("]", n); + if (n === -1 || s === -1) break; + (n > t && r.push(i.slice(t, n)), r.push(i.slice(n + 1, s)), (t = s + 1)); + } + t <= i.length - 1 && r.push(i.slice(t)); + } + return r; + } + function Pe(e) { + if (Object.prototype.toString.call(e) !== "[object Object]") return !1; + let r = Object.getPrototypeOf(e); + return r === null || Object.getPrototypeOf(r) === null; + } + function qe(e, r, i, t = []) { + for (let n of r) + if (n != null) + for (let s of Reflect.ownKeys(n)) { + t.push(s); + let a = i(e[s], n[s], t); + (a !== void 0 + ? (e[s] = a) + : !Pe(e[s]) || !Pe(n[s]) + ? (e[s] = n[s]) + : (e[s] = qe({}, [e[s], n[s]], i, t)), + t.pop()); + } + return e; + } + function ht(e, r, i) { + return function (n, s) { + let a = n.lastIndexOf("/"), + m = null; + a !== -1 && ((m = n.slice(a + 1).trim()), (n = n.slice(0, a).trim())); + let c = (() => { + let u = mt(n), + [h, d] = pn(e.theme, u), + f = i(ci(r() ?? {}, u) ?? null); + if ((typeof f == "string" && (f = f.replace("", "1")), typeof h != "object")) + return typeof d != "object" && d & 4 ? (f ?? h) : h; + if (f !== null && typeof f == "object" && !Array.isArray(f)) { + let v = qe({}, [f], (k, w) => w); + if (h === null && Object.hasOwn(f, "__CSS_VALUES__")) { + let k = {}; + for (let w in f.__CSS_VALUES__) ((k[w] = f[w]), delete v[w]); + h = k; + } + for (let k in h) + k !== "__CSS_VALUES__" && + ((f?.__CSS_VALUES__?.[k] & 4 && ci(v, k.split("-")) !== void 0) || (v[ye(k)] = h[k])); + return v; + } + if (Array.isArray(h) && Array.isArray(d) && Array.isArray(f)) { + let v = h[0], + k = h[1]; + d[0] & 4 && (v = f[0] ?? v); + for (let w of Object.keys(k)) d[1][w] & 4 && (k[w] = f[1][w] ?? k[w]); + return [v, k]; + } + return h ?? f; + })(); + return (m && typeof c == "string" && (c = Q(c, m)), c ?? s); + }; + } + function pn(e, r) { + if (r.length === 1 && r[0].startsWith("--")) return [e.get([r[0]]), e.getOptions(r[0])]; + let i = pt(r), + t = new Map(), + n = new H(() => new Map()), + s = e.namespace(`--${i}`); + if (s.size === 0) return [null, 0]; + let a = new Map(); + for (let [h, d] of s) { + if (!h || !h.includes("--")) { + (t.set(h, d), a.set(h, e.getOptions(h ? `--${i}-${h}` : `--${i}`))); + continue; + } + let f = h.indexOf("--"), + v = h.slice(0, f), + k = h.slice(f + 2); + ((k = k.replace(/-([a-z])/g, (w, x) => x.toUpperCase())), + n.get(v === "" ? null : v).set(k, [d, e.getOptions(`--${i}${h}`)])); + } + let m = e.getOptions(`--${i}`); + for (let [h, d] of n) { + let f = t.get(h); + if (typeof f != "string") continue; + let v = {}, + k = {}; + for (let [w, [x, V]] of d) ((v[w] = x), (k[w] = V)); + (t.set(h, [f, v]), a.set(h, [m, k])); + } + let c = {}, + u = {}; + for (let [h, d] of t) fi(c, [h ?? "DEFAULT"], d); + for (let [h, d] of a) fi(u, [h ?? "DEFAULT"], d); + return r[r.length - 1] === "DEFAULT" + ? [c?.DEFAULT ?? null, u.DEFAULT ?? 0] + : "DEFAULT" in c && Object.keys(c).length === 1 + ? [c.DEFAULT, u.DEFAULT ?? 0] + : ((c.__CSS_VALUES__ = u), [c, u]); + } + function ci(e, r) { + for (let i = 0; i < r.length; ++i) { + let t = r[i]; + if (e?.[t] === void 0) { + if (r[i + 1] === void 0) return; + r[i + 1] = `${t}-${r[i + 1]}`; + continue; + } + if (typeof e == "string") return; + e = e[t]; + } + return e; + } + function fi(e, r, i) { + for (let t of r.slice(0, -1)) (e[t] === void 0 && (e[t] = {}), (e = e[t])); + e[r[r.length - 1]] = i; + } + var pi = /^[a-z@][a-zA-Z0-9/%._-]*$/; + function Bt({ + designSystem: e, + ast: r, + resolvedConfig: i, + featuresRef: t, + referenceMode: n, + src: s, + }) { + let a = { + addBase(m) { + if (n) return; + let c = pe(m); + t.current |= Re(c, e); + let u = M("@layer", "base", c); + (D([u], (h) => { + h.src = s; + }), + r.push(u)); + }, + addVariant(m, c) { + if (!ct.test(m)) + throw new Error( + `\`addVariant('${m}')\` defines an invalid variant name. Variants should only contain alphanumeric, dashes, or underscore characters and start with a lowercase letter or number.`, + ); + if (typeof c == "string") { + if (c.includes(":merge(")) return; + } else if (Array.isArray(c)) { + if (c.some((h) => h.includes(":merge("))) return; + } else if (typeof c == "object") { + let h = function (d, f) { + return Object.entries(d).some( + ([v, k]) => v.includes(f) || (typeof k == "object" && h(k, f)), + ); + }; + var u = h; + if (h(c, ":merge(")) return; + } + typeof c == "string" || Array.isArray(c) + ? e.variants.static( + m, + (h) => { + h.nodes = di(c, h.nodes); + }, + { compounds: $e(typeof c == "string" ? [c] : c) }, + ) + : typeof c == "object" && e.variants.fromAst(m, pe(c), e); + }, + matchVariant(m, c, u) { + function h(f, v, k) { + let w = c(f, { modifier: v?.value ?? null }); + return di(w, k); + } + try { + let f = c("a", { modifier: null }); + if (typeof f == "string" && f.includes(":merge(")) return; + if (Array.isArray(f) && f.some((v) => v.includes(":merge("))) return; + } catch {} + let d = Object.keys(u?.values ?? {}); + (e.variants.group( + () => { + e.variants.functional(m, (f, v) => { + if (!v.value) { + if (u?.values && "DEFAULT" in u.values) { + f.nodes = h(u.values.DEFAULT, v.modifier, f.nodes); + return; + } + return null; + } + if (v.value.kind === "arbitrary") f.nodes = h(v.value.value, v.modifier, f.nodes); + else if (v.value.kind === "named" && u?.values) { + let k = u.values[v.value.value]; + if (typeof k != "string") return null; + f.nodes = h(k, v.modifier, f.nodes); + } else return null; + }); + }, + (f, v) => { + if (f.kind !== "functional" || v.kind !== "functional") return 0; + let k = f.value ? f.value.value : "DEFAULT", + w = v.value ? v.value.value : "DEFAULT", + x = u?.values?.[k] ?? k, + V = u?.values?.[w] ?? w; + if (u && typeof u.sort == "function") + return u.sort( + { value: x, modifier: f.modifier?.value ?? null }, + { value: V, modifier: v.modifier?.value ?? null }, + ); + let C = d.indexOf(k), + y = d.indexOf(w); + return ( + (C = C === -1 ? d.length : C), + (y = y === -1 ? d.length : y), + C !== y ? C - y : x < V ? -1 : 1 + ); + }, + ), + e.variants.suggest(m, () => Object.keys(u?.values ?? {}).filter((f) => f !== "DEFAULT"))); + }, + addUtilities(m) { + m = Array.isArray(m) ? m : [m]; + let c = m.flatMap((h) => Object.entries(h)); + c = c.flatMap(([h, d]) => z(h, ",").map((f) => [f.trim(), d])); + let u = new H(() => []); + for (let [h, d] of c) { + if (h.startsWith("@keyframes ")) { + if (!n) { + let k = Y(h, pe(d)); + (D([k], (w) => { + w.src = s; + }), + r.push(k)); + } + continue; + } + let f = dt(h), + v = !1; + if ( + (D(f, (k) => { + if (k.kind === "selector" && k.value[0] === "." && pi.test(k.value.slice(1))) { + let w = k.value; + k.value = "&"; + let x = Be(f), + V = w.slice(1), + C = x === "&" ? pe(d) : [Y(x, pe(d))]; + (u.get(V).push(...C), (v = !0), (k.value = w)); + return; + } + if (k.kind === "function" && k.value === ":not") return O.Skip; + }), + !v) + ) + throw new Error( + `\`addUtilities({ '${h}' : \u2026 })\` defines an invalid utility selector. Utilities must be a single class name and start with a lowercase letter, eg. \`.scrollbar-none\`.`, + ); + } + for (let [h, d] of u) + (e.theme.prefix && + D(d, (f) => { + if (f.kind === "rule") { + let v = dt(f.selector); + (D(v, (k) => { + k.kind === "selector" && + k.value[0] === "." && + (k.value = `.${e.theme.prefix}\\:${k.value.slice(1)}`); + }), + (f.selector = Be(v))); + } + }), + e.utilities.static(h, (f) => { + let v = d.map(re); + return (mi(v, h, f.raw), (t.current |= We(v, e)), v); + })); + }, + matchUtilities(m, c) { + let u = c?.type ? (Array.isArray(c?.type) ? c.type : [c.type]) : ["any"]; + for (let [d, f] of Object.entries(m)) { + let v = function ({ negative: k }) { + return (w) => { + if ( + w.value?.kind === "arbitrary" && + u.length > 0 && + !u.includes("any") && + ((w.value.dataType && !u.includes(w.value.dataType)) || + (!w.value.dataType && !Z(w.value.value, u))) + ) + return; + let x = u.includes("color"), + V = null, + C = !1; + { + let R = c?.values ?? {}; + (x && + (R = Object.assign( + { inherit: "inherit", transparent: "transparent", current: "currentcolor" }, + R, + )), + w.value + ? w.value.kind === "arbitrary" + ? (V = w.value.value) + : w.value.fraction && R[w.value.fraction] + ? ((V = R[w.value.fraction]), (C = !0)) + : R[w.value.value] + ? (V = R[w.value.value]) + : R.__BARE_VALUE__ && + ((V = R.__BARE_VALUE__(w.value) ?? null), + (C = (w.value.fraction !== null && V?.includes("/")) ?? !1)) + : (V = R.DEFAULT ?? null)); + } + if (V === null) return; + let y; + { + let R = c?.modifiers ?? null; + w.modifier + ? R === "any" || w.modifier.kind === "arbitrary" + ? (y = w.modifier.value) + : R?.[w.modifier.value] + ? (y = R[w.modifier.value]) + : x && !Number.isNaN(Number(w.modifier.value)) + ? (y = `${w.modifier.value}%`) + : (y = null) + : (y = null); + } + if (w.modifier && y === null && !C) + return w.value?.kind === "arbitrary" ? null : void 0; + (x && y !== null && (V = Q(V, y)), k && (V = `calc(${V} * -1)`)); + let K = pe(f(V, { modifier: y })); + return (mi(K, d, w.raw), (t.current |= We(K, e)), K); + }; + }; + var h = v; + if (!pi.test(d)) + throw new Error( + `\`matchUtilities({ '${d}' : \u2026 })\` defines an invalid utility name. Utilities should be alphanumeric and start with a lowercase letter, eg. \`scrollbar\`.`, + ); + (c?.supportsNegativeValues && + e.utilities.functional(`-${d}`, v({ negative: !0 }), { types: u }), + e.utilities.functional(d, v({ negative: !1 }), { types: u }), + e.utilities.suggest(d, () => { + let k = c?.values ?? {}, + w = new Set(Object.keys(k)); + (w.delete("__BARE_VALUE__"), + w.delete("__CSS_VALUES__"), + w.has("DEFAULT") && (w.delete("DEFAULT"), w.add(null))); + let x = c?.modifiers ?? {}, + V = x === "any" ? [] : Object.keys(x); + return [ + { + supportsNegative: c?.supportsNegativeValues ?? !1, + values: Array.from(w), + modifiers: V, + }, + ]; + })); + } + }, + addComponents(m, c) { + this.addUtilities(m, c); + }, + matchComponents(m, c) { + this.matchUtilities(m, c); + }, + theme: ht( + e, + () => i.theme ?? {}, + (m) => m, + ), + prefix(m) { + return m; + }, + config(m, c) { + let u = i; + if (!m) return u; + let h = mt(m); + for (let d = 0; d < h.length; ++d) { + let f = h[d]; + if (u[f] === void 0) return c; + u = u[f]; + } + return u ?? c; + }, + }; + return ( + (a.addComponents = a.addComponents.bind(a)), + (a.matchComponents = a.matchComponents.bind(a)), + a + ); + } + function pe(e) { + let r = []; + e = Array.isArray(e) ? e : [e]; + let i = e.flatMap((t) => Object.entries(t)); + for (let [t, n] of i) + if (n != null && n !== !1) + if (typeof n != "object") { + if (!t.startsWith("--")) { + if (n === "@slot") { + r.push(Y(t, [M("@slot")])); + continue; + } + t = t.replace(/([A-Z])/g, "-$1").toLowerCase(); + } + r.push(o(t, String(n))); + } else if (Array.isArray(n)) + for (let s of n) typeof s == "string" ? r.push(o(t, s)) : r.push(Y(t, pe(s))); + else r.push(Y(t, pe(n))); + return r; + } + function di(e, r) { + return (typeof e == "string" ? [e] : e).flatMap((t) => { + if (t.trim().endsWith("}")) { + let n = t.replace("}", "{@slot}}"), + s = Se(n); + return (Ft(s, r), s); + } else return Y(t, r); + }); + } + function mi(e, r, i) { + D(e, (t) => { + if (t.kind === "rule") { + let n = dt(t.selector); + (D(n, (s) => { + s.kind === "selector" && s.value === `.${r}` && (s.value = `.${ge(i)}`); + }), + (t.selector = Be(n))); + } + }); + } + function hi(e, r) { + for (let i of dn(r)) e.theme.addKeyframes(i); + } + function dn(e) { + let r = []; + if ("keyframes" in e.theme) + for (let [i, t] of Object.entries(e.theme.keyframes)) r.push(M("@keyframes", i, pe(t))); + return r; + } + var gt = { + inherit: "inherit", + current: "currentcolor", + transparent: "transparent", + black: "#000", + white: "#fff", + slate: { + 50: "oklch(98.4% 0.003 247.858)", + 100: "oklch(96.8% 0.007 247.896)", + 200: "oklch(92.9% 0.013 255.508)", + 300: "oklch(86.9% 0.022 252.894)", + 400: "oklch(70.4% 0.04 256.788)", + 500: "oklch(55.4% 0.046 257.417)", + 600: "oklch(44.6% 0.043 257.281)", + 700: "oklch(37.2% 0.044 257.287)", + 800: "oklch(27.9% 0.041 260.031)", + 900: "oklch(20.8% 0.042 265.755)", + 950: "oklch(12.9% 0.042 264.695)", + }, + gray: { + 50: "oklch(98.5% 0.002 247.839)", + 100: "oklch(96.7% 0.003 264.542)", + 200: "oklch(92.8% 0.006 264.531)", + 300: "oklch(87.2% 0.01 258.338)", + 400: "oklch(70.7% 0.022 261.325)", + 500: "oklch(55.1% 0.027 264.364)", + 600: "oklch(44.6% 0.03 256.802)", + 700: "oklch(37.3% 0.034 259.733)", + 800: "oklch(27.8% 0.033 256.848)", + 900: "oklch(21% 0.034 264.665)", + 950: "oklch(13% 0.028 261.692)", + }, + zinc: { + 50: "oklch(98.5% 0 0)", + 100: "oklch(96.7% 0.001 286.375)", + 200: "oklch(92% 0.004 286.32)", + 300: "oklch(87.1% 0.006 286.286)", + 400: "oklch(70.5% 0.015 286.067)", + 500: "oklch(55.2% 0.016 285.938)", + 600: "oklch(44.2% 0.017 285.786)", + 700: "oklch(37% 0.013 285.805)", + 800: "oklch(27.4% 0.006 286.033)", + 900: "oklch(21% 0.006 285.885)", + 950: "oklch(14.1% 0.005 285.823)", + }, + neutral: { + 50: "oklch(98.5% 0 0)", + 100: "oklch(97% 0 0)", + 200: "oklch(92.2% 0 0)", + 300: "oklch(87% 0 0)", + 400: "oklch(70.8% 0 0)", + 500: "oklch(55.6% 0 0)", + 600: "oklch(43.9% 0 0)", + 700: "oklch(37.1% 0 0)", + 800: "oklch(26.9% 0 0)", + 900: "oklch(20.5% 0 0)", + 950: "oklch(14.5% 0 0)", + }, + stone: { + 50: "oklch(98.5% 0.001 106.423)", + 100: "oklch(97% 0.001 106.424)", + 200: "oklch(92.3% 0.003 48.717)", + 300: "oklch(86.9% 0.005 56.366)", + 400: "oklch(70.9% 0.01 56.259)", + 500: "oklch(55.3% 0.013 58.071)", + 600: "oklch(44.4% 0.011 73.639)", + 700: "oklch(37.4% 0.01 67.558)", + 800: "oklch(26.8% 0.007 34.298)", + 900: "oklch(21.6% 0.006 56.043)", + 950: "oklch(14.7% 0.004 49.25)", + }, + red: { + 50: "oklch(97.1% 0.013 17.38)", + 100: "oklch(93.6% 0.032 17.717)", + 200: "oklch(88.5% 0.062 18.334)", + 300: "oklch(80.8% 0.114 19.571)", + 400: "oklch(70.4% 0.191 22.216)", + 500: "oklch(63.7% 0.237 25.331)", + 600: "oklch(57.7% 0.245 27.325)", + 700: "oklch(50.5% 0.213 27.518)", + 800: "oklch(44.4% 0.177 26.899)", + 900: "oklch(39.6% 0.141 25.723)", + 950: "oklch(25.8% 0.092 26.042)", + }, + orange: { + 50: "oklch(98% 0.016 73.684)", + 100: "oklch(95.4% 0.038 75.164)", + 200: "oklch(90.1% 0.076 70.697)", + 300: "oklch(83.7% 0.128 66.29)", + 400: "oklch(75% 0.183 55.934)", + 500: "oklch(70.5% 0.213 47.604)", + 600: "oklch(64.6% 0.222 41.116)", + 700: "oklch(55.3% 0.195 38.402)", + 800: "oklch(47% 0.157 37.304)", + 900: "oklch(40.8% 0.123 38.172)", + 950: "oklch(26.6% 0.079 36.259)", + }, + amber: { + 50: "oklch(98.7% 0.022 95.277)", + 100: "oklch(96.2% 0.059 95.617)", + 200: "oklch(92.4% 0.12 95.746)", + 300: "oklch(87.9% 0.169 91.605)", + 400: "oklch(82.8% 0.189 84.429)", + 500: "oklch(76.9% 0.188 70.08)", + 600: "oklch(66.6% 0.179 58.318)", + 700: "oklch(55.5% 0.163 48.998)", + 800: "oklch(47.3% 0.137 46.201)", + 900: "oklch(41.4% 0.112 45.904)", + 950: "oklch(27.9% 0.077 45.635)", + }, + yellow: { + 50: "oklch(98.7% 0.026 102.212)", + 100: "oklch(97.3% 0.071 103.193)", + 200: "oklch(94.5% 0.129 101.54)", + 300: "oklch(90.5% 0.182 98.111)", + 400: "oklch(85.2% 0.199 91.936)", + 500: "oklch(79.5% 0.184 86.047)", + 600: "oklch(68.1% 0.162 75.834)", + 700: "oklch(55.4% 0.135 66.442)", + 800: "oklch(47.6% 0.114 61.907)", + 900: "oklch(42.1% 0.095 57.708)", + 950: "oklch(28.6% 0.066 53.813)", + }, + lime: { + 50: "oklch(98.6% 0.031 120.757)", + 100: "oklch(96.7% 0.067 122.328)", + 200: "oklch(93.8% 0.127 124.321)", + 300: "oklch(89.7% 0.196 126.665)", + 400: "oklch(84.1% 0.238 128.85)", + 500: "oklch(76.8% 0.233 130.85)", + 600: "oklch(64.8% 0.2 131.684)", + 700: "oklch(53.2% 0.157 131.589)", + 800: "oklch(45.3% 0.124 130.933)", + 900: "oklch(40.5% 0.101 131.063)", + 950: "oklch(27.4% 0.072 132.109)", + }, + green: { + 50: "oklch(98.2% 0.018 155.826)", + 100: "oklch(96.2% 0.044 156.743)", + 200: "oklch(92.5% 0.084 155.995)", + 300: "oklch(87.1% 0.15 154.449)", + 400: "oklch(79.2% 0.209 151.711)", + 500: "oklch(72.3% 0.219 149.579)", + 600: "oklch(62.7% 0.194 149.214)", + 700: "oklch(52.7% 0.154 150.069)", + 800: "oklch(44.8% 0.119 151.328)", + 900: "oklch(39.3% 0.095 152.535)", + 950: "oklch(26.6% 0.065 152.934)", + }, + emerald: { + 50: "oklch(97.9% 0.021 166.113)", + 100: "oklch(95% 0.052 163.051)", + 200: "oklch(90.5% 0.093 164.15)", + 300: "oklch(84.5% 0.143 164.978)", + 400: "oklch(76.5% 0.177 163.223)", + 500: "oklch(69.6% 0.17 162.48)", + 600: "oklch(59.6% 0.145 163.225)", + 700: "oklch(50.8% 0.118 165.612)", + 800: "oklch(43.2% 0.095 166.913)", + 900: "oklch(37.8% 0.077 168.94)", + 950: "oklch(26.2% 0.051 172.552)", + }, + teal: { + 50: "oklch(98.4% 0.014 180.72)", + 100: "oklch(95.3% 0.051 180.801)", + 200: "oklch(91% 0.096 180.426)", + 300: "oklch(85.5% 0.138 181.071)", + 400: "oklch(77.7% 0.152 181.912)", + 500: "oklch(70.4% 0.14 182.503)", + 600: "oklch(60% 0.118 184.704)", + 700: "oklch(51.1% 0.096 186.391)", + 800: "oklch(43.7% 0.078 188.216)", + 900: "oklch(38.6% 0.063 188.416)", + 950: "oklch(27.7% 0.046 192.524)", + }, + cyan: { + 50: "oklch(98.4% 0.019 200.873)", + 100: "oklch(95.6% 0.045 203.388)", + 200: "oklch(91.7% 0.08 205.041)", + 300: "oklch(86.5% 0.127 207.078)", + 400: "oklch(78.9% 0.154 211.53)", + 500: "oklch(71.5% 0.143 215.221)", + 600: "oklch(60.9% 0.126 221.723)", + 700: "oklch(52% 0.105 223.128)", + 800: "oklch(45% 0.085 224.283)", + 900: "oklch(39.8% 0.07 227.392)", + 950: "oklch(30.2% 0.056 229.695)", + }, + sky: { + 50: "oklch(97.7% 0.013 236.62)", + 100: "oklch(95.1% 0.026 236.824)", + 200: "oklch(90.1% 0.058 230.902)", + 300: "oklch(82.8% 0.111 230.318)", + 400: "oklch(74.6% 0.16 232.661)", + 500: "oklch(68.5% 0.169 237.323)", + 600: "oklch(58.8% 0.158 241.966)", + 700: "oklch(50% 0.134 242.749)", + 800: "oklch(44.3% 0.11 240.79)", + 900: "oklch(39.1% 0.09 240.876)", + 950: "oklch(29.3% 0.066 243.157)", + }, + blue: { + 50: "oklch(97% 0.014 254.604)", + 100: "oklch(93.2% 0.032 255.585)", + 200: "oklch(88.2% 0.059 254.128)", + 300: "oklch(80.9% 0.105 251.813)", + 400: "oklch(70.7% 0.165 254.624)", + 500: "oklch(62.3% 0.214 259.815)", + 600: "oklch(54.6% 0.245 262.881)", + 700: "oklch(48.8% 0.243 264.376)", + 800: "oklch(42.4% 0.199 265.638)", + 900: "oklch(37.9% 0.146 265.522)", + 950: "oklch(28.2% 0.091 267.935)", + }, + indigo: { + 50: "oklch(96.2% 0.018 272.314)", + 100: "oklch(93% 0.034 272.788)", + 200: "oklch(87% 0.065 274.039)", + 300: "oklch(78.5% 0.115 274.713)", + 400: "oklch(67.3% 0.182 276.935)", + 500: "oklch(58.5% 0.233 277.117)", + 600: "oklch(51.1% 0.262 276.966)", + 700: "oklch(45.7% 0.24 277.023)", + 800: "oklch(39.8% 0.195 277.366)", + 900: "oklch(35.9% 0.144 278.697)", + 950: "oklch(25.7% 0.09 281.288)", + }, + violet: { + 50: "oklch(96.9% 0.016 293.756)", + 100: "oklch(94.3% 0.029 294.588)", + 200: "oklch(89.4% 0.057 293.283)", + 300: "oklch(81.1% 0.111 293.571)", + 400: "oklch(70.2% 0.183 293.541)", + 500: "oklch(60.6% 0.25 292.717)", + 600: "oklch(54.1% 0.281 293.009)", + 700: "oklch(49.1% 0.27 292.581)", + 800: "oklch(43.2% 0.232 292.759)", + 900: "oklch(38% 0.189 293.745)", + 950: "oklch(28.3% 0.141 291.089)", + }, + purple: { + 50: "oklch(97.7% 0.014 308.299)", + 100: "oklch(94.6% 0.033 307.174)", + 200: "oklch(90.2% 0.063 306.703)", + 300: "oklch(82.7% 0.119 306.383)", + 400: "oklch(71.4% 0.203 305.504)", + 500: "oklch(62.7% 0.265 303.9)", + 600: "oklch(55.8% 0.288 302.321)", + 700: "oklch(49.6% 0.265 301.924)", + 800: "oklch(43.8% 0.218 303.724)", + 900: "oklch(38.1% 0.176 304.987)", + 950: "oklch(29.1% 0.149 302.717)", + }, + fuchsia: { + 50: "oklch(97.7% 0.017 320.058)", + 100: "oklch(95.2% 0.037 318.852)", + 200: "oklch(90.3% 0.076 319.62)", + 300: "oklch(83.3% 0.145 321.434)", + 400: "oklch(74% 0.238 322.16)", + 500: "oklch(66.7% 0.295 322.15)", + 600: "oklch(59.1% 0.293 322.896)", + 700: "oklch(51.8% 0.253 323.949)", + 800: "oklch(45.2% 0.211 324.591)", + 900: "oklch(40.1% 0.17 325.612)", + 950: "oklch(29.3% 0.136 325.661)", + }, + pink: { + 50: "oklch(97.1% 0.014 343.198)", + 100: "oklch(94.8% 0.028 342.258)", + 200: "oklch(89.9% 0.061 343.231)", + 300: "oklch(82.3% 0.12 346.018)", + 400: "oklch(71.8% 0.202 349.761)", + 500: "oklch(65.6% 0.241 354.308)", + 600: "oklch(59.2% 0.249 0.584)", + 700: "oklch(52.5% 0.223 3.958)", + 800: "oklch(45.9% 0.187 3.815)", + 900: "oklch(40.8% 0.153 2.432)", + 950: "oklch(28.4% 0.109 3.907)", + }, + rose: { + 50: "oklch(96.9% 0.015 12.422)", + 100: "oklch(94.1% 0.03 12.58)", + 200: "oklch(89.2% 0.058 10.001)", + 300: "oklch(81% 0.117 11.638)", + 400: "oklch(71.2% 0.194 13.428)", + 500: "oklch(64.5% 0.246 16.439)", + 600: "oklch(58.6% 0.253 17.585)", + 700: "oklch(51.4% 0.222 16.935)", + 800: "oklch(45.5% 0.188 13.697)", + 900: "oklch(41% 0.159 10.272)", + 950: "oklch(27.1% 0.105 12.094)", + }, + }; + function Ne(e) { + return { __BARE_VALUE__: e }; + } + var ue = Ne((e) => { + if (E(e.value)) return e.value; + }), + ie = Ne((e) => { + if (E(e.value)) return `${e.value}%`; + }), + be = Ne((e) => { + if (E(e.value)) return `${e.value}px`; + }), + gi = Ne((e) => { + if (E(e.value)) return `${e.value}ms`; + }), + kt = Ne((e) => { + if (E(e.value)) return `${e.value}deg`; + }), + mn = Ne((e) => { + if (e.fraction === null) return; + let [r, i] = z(e.fraction, "/"); + if (!(!E(r) || !E(i))) return e.fraction; + }), + ki = Ne((e) => { + if (E(Number(e.value))) return `repeat(${e.value}, minmax(0, 1fr))`; + }), + vi = { + accentColor: ({ theme: e }) => e("colors"), + animation: { + none: "none", + spin: "spin 1s linear infinite", + ping: "ping 1s cubic-bezier(0, 0, 0.2, 1) infinite", + pulse: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite", + bounce: "bounce 1s infinite", + }, + aria: { + busy: 'busy="true"', + checked: 'checked="true"', + disabled: 'disabled="true"', + expanded: 'expanded="true"', + hidden: 'hidden="true"', + pressed: 'pressed="true"', + readonly: 'readonly="true"', + required: 'required="true"', + selected: 'selected="true"', + }, + aspectRatio: { auto: "auto", square: "1 / 1", video: "16 / 9", ...mn }, + backdropBlur: ({ theme: e }) => e("blur"), + backdropBrightness: ({ theme: e }) => ({ ...e("brightness"), ...ie }), + backdropContrast: ({ theme: e }) => ({ ...e("contrast"), ...ie }), + backdropGrayscale: ({ theme: e }) => ({ ...e("grayscale"), ...ie }), + backdropHueRotate: ({ theme: e }) => ({ ...e("hueRotate"), ...kt }), + backdropInvert: ({ theme: e }) => ({ ...e("invert"), ...ie }), + backdropOpacity: ({ theme: e }) => ({ ...e("opacity"), ...ie }), + backdropSaturate: ({ theme: e }) => ({ ...e("saturate"), ...ie }), + backdropSepia: ({ theme: e }) => ({ ...e("sepia"), ...ie }), + backgroundColor: ({ theme: e }) => e("colors"), + backgroundImage: { + none: "none", + "gradient-to-t": "linear-gradient(to top, var(--tw-gradient-stops))", + "gradient-to-tr": "linear-gradient(to top right, var(--tw-gradient-stops))", + "gradient-to-r": "linear-gradient(to right, var(--tw-gradient-stops))", + "gradient-to-br": "linear-gradient(to bottom right, var(--tw-gradient-stops))", + "gradient-to-b": "linear-gradient(to bottom, var(--tw-gradient-stops))", + "gradient-to-bl": "linear-gradient(to bottom left, var(--tw-gradient-stops))", + "gradient-to-l": "linear-gradient(to left, var(--tw-gradient-stops))", + "gradient-to-tl": "linear-gradient(to top left, var(--tw-gradient-stops))", + }, + backgroundOpacity: ({ theme: e }) => e("opacity"), + backgroundPosition: { + bottom: "bottom", + center: "center", + left: "left", + "left-bottom": "left bottom", + "left-top": "left top", + right: "right", + "right-bottom": "right bottom", + "right-top": "right top", + top: "top", + }, + backgroundSize: { auto: "auto", cover: "cover", contain: "contain" }, + blur: { + 0: "0", + none: "", + sm: "4px", + DEFAULT: "8px", + md: "12px", + lg: "16px", + xl: "24px", + "2xl": "40px", + "3xl": "64px", + }, + borderColor: ({ theme: e }) => ({ DEFAULT: "currentcolor", ...e("colors") }), + borderOpacity: ({ theme: e }) => e("opacity"), + borderRadius: { + none: "0px", + sm: "0.125rem", + DEFAULT: "0.25rem", + md: "0.375rem", + lg: "0.5rem", + xl: "0.75rem", + "2xl": "1rem", + "3xl": "1.5rem", + full: "9999px", + }, + borderSpacing: ({ theme: e }) => e("spacing"), + borderWidth: { DEFAULT: "1px", 0: "0px", 2: "2px", 4: "4px", 8: "8px", ...be }, + boxShadow: { + sm: "0 1px 2px 0 rgb(0 0 0 / 0.05)", + DEFAULT: "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", + md: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)", + lg: "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)", + xl: "0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)", + "2xl": "0 25px 50px -12px rgb(0 0 0 / 0.25)", + inner: "inset 0 2px 4px 0 rgb(0 0 0 / 0.05)", + none: "none", + }, + boxShadowColor: ({ theme: e }) => e("colors"), + brightness: { + 0: "0", + 50: ".5", + 75: ".75", + 90: ".9", + 95: ".95", + 100: "1", + 105: "1.05", + 110: "1.1", + 125: "1.25", + 150: "1.5", + 200: "2", + ...ie, + }, + caretColor: ({ theme: e }) => e("colors"), + colors: () => ({ ...gt }), + columns: { + auto: "auto", + 1: "1", + 2: "2", + 3: "3", + 4: "4", + 5: "5", + 6: "6", + 7: "7", + 8: "8", + 9: "9", + 10: "10", + 11: "11", + 12: "12", + "3xs": "16rem", + "2xs": "18rem", + xs: "20rem", + sm: "24rem", + md: "28rem", + lg: "32rem", + xl: "36rem", + "2xl": "42rem", + "3xl": "48rem", + "4xl": "56rem", + "5xl": "64rem", + "6xl": "72rem", + "7xl": "80rem", + ...ue, + }, + container: {}, + content: { none: "none" }, + contrast: { 0: "0", 50: ".5", 75: ".75", 100: "1", 125: "1.25", 150: "1.5", 200: "2", ...ie }, + cursor: { + auto: "auto", + default: "default", + pointer: "pointer", + wait: "wait", + text: "text", + move: "move", + help: "help", + "not-allowed": "not-allowed", + none: "none", + "context-menu": "context-menu", + progress: "progress", + cell: "cell", + crosshair: "crosshair", + "vertical-text": "vertical-text", + alias: "alias", + copy: "copy", + "no-drop": "no-drop", + grab: "grab", + grabbing: "grabbing", + "all-scroll": "all-scroll", + "col-resize": "col-resize", + "row-resize": "row-resize", + "n-resize": "n-resize", + "e-resize": "e-resize", + "s-resize": "s-resize", + "w-resize": "w-resize", + "ne-resize": "ne-resize", + "nw-resize": "nw-resize", + "se-resize": "se-resize", + "sw-resize": "sw-resize", + "ew-resize": "ew-resize", + "ns-resize": "ns-resize", + "nesw-resize": "nesw-resize", + "nwse-resize": "nwse-resize", + "zoom-in": "zoom-in", + "zoom-out": "zoom-out", + }, + divideColor: ({ theme: e }) => e("borderColor"), + divideOpacity: ({ theme: e }) => e("borderOpacity"), + divideWidth: ({ theme: e }) => ({ ...e("borderWidth"), ...be }), + dropShadow: { + sm: "0 1px 1px rgb(0 0 0 / 0.05)", + DEFAULT: ["0 1px 2px rgb(0 0 0 / 0.1)", "0 1px 1px rgb(0 0 0 / 0.06)"], + md: ["0 4px 3px rgb(0 0 0 / 0.07)", "0 2px 2px rgb(0 0 0 / 0.06)"], + lg: ["0 10px 8px rgb(0 0 0 / 0.04)", "0 4px 3px rgb(0 0 0 / 0.1)"], + xl: ["0 20px 13px rgb(0 0 0 / 0.03)", "0 8px 5px rgb(0 0 0 / 0.08)"], + "2xl": "0 25px 25px rgb(0 0 0 / 0.15)", + none: "0 0 #0000", + }, + fill: ({ theme: e }) => e("colors"), + flex: { 1: "1 1 0%", auto: "1 1 auto", initial: "0 1 auto", none: "none" }, + flexBasis: ({ theme: e }) => ({ + auto: "auto", + "1/2": "50%", + "1/3": "33.333333%", + "2/3": "66.666667%", + "1/4": "25%", + "2/4": "50%", + "3/4": "75%", + "1/5": "20%", + "2/5": "40%", + "3/5": "60%", + "4/5": "80%", + "1/6": "16.666667%", + "2/6": "33.333333%", + "3/6": "50%", + "4/6": "66.666667%", + "5/6": "83.333333%", + "1/12": "8.333333%", + "2/12": "16.666667%", + "3/12": "25%", + "4/12": "33.333333%", + "5/12": "41.666667%", + "6/12": "50%", + "7/12": "58.333333%", + "8/12": "66.666667%", + "9/12": "75%", + "10/12": "83.333333%", + "11/12": "91.666667%", + full: "100%", + ...e("spacing"), + }), + flexGrow: { 0: "0", DEFAULT: "1", ...ue }, + flexShrink: { 0: "0", DEFAULT: "1", ...ue }, + fontFamily: { + sans: [ + "ui-sans-serif", + "system-ui", + "sans-serif", + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ], + serif: ["ui-serif", "Georgia", "Cambria", '"Times New Roman"', "Times", "serif"], + mono: [ + "ui-monospace", + "SFMono-Regular", + "Menlo", + "Monaco", + "Consolas", + '"Liberation Mono"', + '"Courier New"', + "monospace", + ], + }, + fontSize: { + xs: ["0.75rem", { lineHeight: "1rem" }], + sm: ["0.875rem", { lineHeight: "1.25rem" }], + base: ["1rem", { lineHeight: "1.5rem" }], + lg: ["1.125rem", { lineHeight: "1.75rem" }], + xl: ["1.25rem", { lineHeight: "1.75rem" }], + "2xl": ["1.5rem", { lineHeight: "2rem" }], + "3xl": ["1.875rem", { lineHeight: "2.25rem" }], + "4xl": ["2.25rem", { lineHeight: "2.5rem" }], + "5xl": ["3rem", { lineHeight: "1" }], + "6xl": ["3.75rem", { lineHeight: "1" }], + "7xl": ["4.5rem", { lineHeight: "1" }], + "8xl": ["6rem", { lineHeight: "1" }], + "9xl": ["8rem", { lineHeight: "1" }], + }, + fontWeight: { + thin: "100", + extralight: "200", + light: "300", + normal: "400", + medium: "500", + semibold: "600", + bold: "700", + extrabold: "800", + black: "900", + }, + gap: ({ theme: e }) => e("spacing"), + gradientColorStops: ({ theme: e }) => e("colors"), + gradientColorStopPositions: { + "0%": "0%", + "5%": "5%", + "10%": "10%", + "15%": "15%", + "20%": "20%", + "25%": "25%", + "30%": "30%", + "35%": "35%", + "40%": "40%", + "45%": "45%", + "50%": "50%", + "55%": "55%", + "60%": "60%", + "65%": "65%", + "70%": "70%", + "75%": "75%", + "80%": "80%", + "85%": "85%", + "90%": "90%", + "95%": "95%", + "100%": "100%", + ...ie, + }, + grayscale: { 0: "0", DEFAULT: "100%", ...ie }, + gridAutoColumns: { + auto: "auto", + min: "min-content", + max: "max-content", + fr: "minmax(0, 1fr)", + }, + gridAutoRows: { auto: "auto", min: "min-content", max: "max-content", fr: "minmax(0, 1fr)" }, + gridColumn: { + auto: "auto", + "span-1": "span 1 / span 1", + "span-2": "span 2 / span 2", + "span-3": "span 3 / span 3", + "span-4": "span 4 / span 4", + "span-5": "span 5 / span 5", + "span-6": "span 6 / span 6", + "span-7": "span 7 / span 7", + "span-8": "span 8 / span 8", + "span-9": "span 9 / span 9", + "span-10": "span 10 / span 10", + "span-11": "span 11 / span 11", + "span-12": "span 12 / span 12", + "span-full": "1 / -1", + }, + gridColumnEnd: { + auto: "auto", + 1: "1", + 2: "2", + 3: "3", + 4: "4", + 5: "5", + 6: "6", + 7: "7", + 8: "8", + 9: "9", + 10: "10", + 11: "11", + 12: "12", + 13: "13", + ...ue, + }, + gridColumnStart: { + auto: "auto", + 1: "1", + 2: "2", + 3: "3", + 4: "4", + 5: "5", + 6: "6", + 7: "7", + 8: "8", + 9: "9", + 10: "10", + 11: "11", + 12: "12", + 13: "13", + ...ue, + }, + gridRow: { + auto: "auto", + "span-1": "span 1 / span 1", + "span-2": "span 2 / span 2", + "span-3": "span 3 / span 3", + "span-4": "span 4 / span 4", + "span-5": "span 5 / span 5", + "span-6": "span 6 / span 6", + "span-7": "span 7 / span 7", + "span-8": "span 8 / span 8", + "span-9": "span 9 / span 9", + "span-10": "span 10 / span 10", + "span-11": "span 11 / span 11", + "span-12": "span 12 / span 12", + "span-full": "1 / -1", + }, + gridRowEnd: { + auto: "auto", + 1: "1", + 2: "2", + 3: "3", + 4: "4", + 5: "5", + 6: "6", + 7: "7", + 8: "8", + 9: "9", + 10: "10", + 11: "11", + 12: "12", + 13: "13", + ...ue, + }, + gridRowStart: { + auto: "auto", + 1: "1", + 2: "2", + 3: "3", + 4: "4", + 5: "5", + 6: "6", + 7: "7", + 8: "8", + 9: "9", + 10: "10", + 11: "11", + 12: "12", + 13: "13", + ...ue, + }, + gridTemplateColumns: { + none: "none", + subgrid: "subgrid", + 1: "repeat(1, minmax(0, 1fr))", + 2: "repeat(2, minmax(0, 1fr))", + 3: "repeat(3, minmax(0, 1fr))", + 4: "repeat(4, minmax(0, 1fr))", + 5: "repeat(5, minmax(0, 1fr))", + 6: "repeat(6, minmax(0, 1fr))", + 7: "repeat(7, minmax(0, 1fr))", + 8: "repeat(8, minmax(0, 1fr))", + 9: "repeat(9, minmax(0, 1fr))", + 10: "repeat(10, minmax(0, 1fr))", + 11: "repeat(11, minmax(0, 1fr))", + 12: "repeat(12, minmax(0, 1fr))", + ...ki, + }, + gridTemplateRows: { + none: "none", + subgrid: "subgrid", + 1: "repeat(1, minmax(0, 1fr))", + 2: "repeat(2, minmax(0, 1fr))", + 3: "repeat(3, minmax(0, 1fr))", + 4: "repeat(4, minmax(0, 1fr))", + 5: "repeat(5, minmax(0, 1fr))", + 6: "repeat(6, minmax(0, 1fr))", + 7: "repeat(7, minmax(0, 1fr))", + 8: "repeat(8, minmax(0, 1fr))", + 9: "repeat(9, minmax(0, 1fr))", + 10: "repeat(10, minmax(0, 1fr))", + 11: "repeat(11, minmax(0, 1fr))", + 12: "repeat(12, minmax(0, 1fr))", + ...ki, + }, + height: ({ theme: e }) => ({ + auto: "auto", + "1/2": "50%", + "1/3": "33.333333%", + "2/3": "66.666667%", + "1/4": "25%", + "2/4": "50%", + "3/4": "75%", + "1/5": "20%", + "2/5": "40%", + "3/5": "60%", + "4/5": "80%", + "1/6": "16.666667%", + "2/6": "33.333333%", + "3/6": "50%", + "4/6": "66.666667%", + "5/6": "83.333333%", + full: "100%", + screen: "100vh", + svh: "100svh", + lvh: "100lvh", + dvh: "100dvh", + min: "min-content", + max: "max-content", + fit: "fit-content", + ...e("spacing"), + }), + hueRotate: { + 0: "0deg", + 15: "15deg", + 30: "30deg", + 60: "60deg", + 90: "90deg", + 180: "180deg", + ...kt, + }, + inset: ({ theme: e }) => ({ + auto: "auto", + "1/2": "50%", + "1/3": "33.333333%", + "2/3": "66.666667%", + "1/4": "25%", + "2/4": "50%", + "3/4": "75%", + full: "100%", + ...e("spacing"), + }), + invert: { 0: "0", DEFAULT: "100%", ...ie }, + keyframes: { + spin: { to: { transform: "rotate(360deg)" } }, + ping: { "75%, 100%": { transform: "scale(2)", opacity: "0" } }, + pulse: { "50%": { opacity: ".5" } }, + bounce: { + "0%, 100%": { + transform: "translateY(-25%)", + animationTimingFunction: "cubic-bezier(0.8,0,1,1)", + }, + "50%": { transform: "none", animationTimingFunction: "cubic-bezier(0,0,0.2,1)" }, + }, + }, + letterSpacing: { + tighter: "-0.05em", + tight: "-0.025em", + normal: "0em", + wide: "0.025em", + wider: "0.05em", + widest: "0.1em", + }, + lineHeight: { + none: "1", + tight: "1.25", + snug: "1.375", + normal: "1.5", + relaxed: "1.625", + loose: "2", + 3: ".75rem", + 4: "1rem", + 5: "1.25rem", + 6: "1.5rem", + 7: "1.75rem", + 8: "2rem", + 9: "2.25rem", + 10: "2.5rem", + }, + listStyleType: { none: "none", disc: "disc", decimal: "decimal" }, + listStyleImage: { none: "none" }, + margin: ({ theme: e }) => ({ auto: "auto", ...e("spacing") }), + lineClamp: { 1: "1", 2: "2", 3: "3", 4: "4", 5: "5", 6: "6", ...ue }, + maxHeight: ({ theme: e }) => ({ + none: "none", + full: "100%", + screen: "100vh", + svh: "100svh", + lvh: "100lvh", + dvh: "100dvh", + min: "min-content", + max: "max-content", + fit: "fit-content", + ...e("spacing"), + }), + maxWidth: ({ theme: e }) => ({ + none: "none", + xs: "20rem", + sm: "24rem", + md: "28rem", + lg: "32rem", + xl: "36rem", + "2xl": "42rem", + "3xl": "48rem", + "4xl": "56rem", + "5xl": "64rem", + "6xl": "72rem", + "7xl": "80rem", + full: "100%", + min: "min-content", + max: "max-content", + fit: "fit-content", + prose: "65ch", + ...e("spacing"), + }), + minHeight: ({ theme: e }) => ({ + full: "100%", + screen: "100vh", + svh: "100svh", + lvh: "100lvh", + dvh: "100dvh", + min: "min-content", + max: "max-content", + fit: "fit-content", + ...e("spacing"), + }), + minWidth: ({ theme: e }) => ({ + full: "100%", + min: "min-content", + max: "max-content", + fit: "fit-content", + ...e("spacing"), + }), + objectPosition: { + bottom: "bottom", + center: "center", + left: "left", + "left-bottom": "left bottom", + "left-top": "left top", + right: "right", + "right-bottom": "right bottom", + "right-top": "right top", + top: "top", + }, + opacity: { + 0: "0", + 5: "0.05", + 10: "0.1", + 15: "0.15", + 20: "0.2", + 25: "0.25", + 30: "0.3", + 35: "0.35", + 40: "0.4", + 45: "0.45", + 50: "0.5", + 55: "0.55", + 60: "0.6", + 65: "0.65", + 70: "0.7", + 75: "0.75", + 80: "0.8", + 85: "0.85", + 90: "0.9", + 95: "0.95", + 100: "1", + ...ie, + }, + order: { + first: "-9999", + last: "9999", + none: "0", + 1: "1", + 2: "2", + 3: "3", + 4: "4", + 5: "5", + 6: "6", + 7: "7", + 8: "8", + 9: "9", + 10: "10", + 11: "11", + 12: "12", + ...ue, + }, + outlineColor: ({ theme: e }) => e("colors"), + outlineOffset: { 0: "0px", 1: "1px", 2: "2px", 4: "4px", 8: "8px", ...be }, + outlineWidth: { 0: "0px", 1: "1px", 2: "2px", 4: "4px", 8: "8px", ...be }, + padding: ({ theme: e }) => e("spacing"), + placeholderColor: ({ theme: e }) => e("colors"), + placeholderOpacity: ({ theme: e }) => e("opacity"), + ringColor: ({ theme: e }) => ({ DEFAULT: "currentcolor", ...e("colors") }), + ringOffsetColor: ({ theme: e }) => e("colors"), + ringOffsetWidth: { 0: "0px", 1: "1px", 2: "2px", 4: "4px", 8: "8px", ...be }, + ringOpacity: ({ theme: e }) => ({ DEFAULT: "0.5", ...e("opacity") }), + ringWidth: { DEFAULT: "3px", 0: "0px", 1: "1px", 2: "2px", 4: "4px", 8: "8px", ...be }, + rotate: { + 0: "0deg", + 1: "1deg", + 2: "2deg", + 3: "3deg", + 6: "6deg", + 12: "12deg", + 45: "45deg", + 90: "90deg", + 180: "180deg", + ...kt, + }, + saturate: { 0: "0", 50: ".5", 100: "1", 150: "1.5", 200: "2", ...ie }, + scale: { + 0: "0", + 50: ".5", + 75: ".75", + 90: ".9", + 95: ".95", + 100: "1", + 105: "1.05", + 110: "1.1", + 125: "1.25", + 150: "1.5", + ...ie, + }, + screens: { sm: "40rem", md: "48rem", lg: "64rem", xl: "80rem", "2xl": "96rem" }, + scrollMargin: ({ theme: e }) => e("spacing"), + scrollPadding: ({ theme: e }) => e("spacing"), + sepia: { 0: "0", DEFAULT: "100%", ...ie }, + skew: { 0: "0deg", 1: "1deg", 2: "2deg", 3: "3deg", 6: "6deg", 12: "12deg", ...kt }, + space: ({ theme: e }) => e("spacing"), + spacing: { + px: "1px", + 0: "0px", + 0.5: "0.125rem", + 1: "0.25rem", + 1.5: "0.375rem", + 2: "0.5rem", + 2.5: "0.625rem", + 3: "0.75rem", + 3.5: "0.875rem", + 4: "1rem", + 5: "1.25rem", + 6: "1.5rem", + 7: "1.75rem", + 8: "2rem", + 9: "2.25rem", + 10: "2.5rem", + 11: "2.75rem", + 12: "3rem", + 14: "3.5rem", + 16: "4rem", + 20: "5rem", + 24: "6rem", + 28: "7rem", + 32: "8rem", + 36: "9rem", + 40: "10rem", + 44: "11rem", + 48: "12rem", + 52: "13rem", + 56: "14rem", + 60: "15rem", + 64: "16rem", + 72: "18rem", + 80: "20rem", + 96: "24rem", + }, + stroke: ({ theme: e }) => ({ none: "none", ...e("colors") }), + strokeWidth: { 0: "0", 1: "1", 2: "2", ...ue }, + supports: {}, + data: {}, + textColor: ({ theme: e }) => e("colors"), + textDecorationColor: ({ theme: e }) => e("colors"), + textDecorationThickness: { + auto: "auto", + "from-font": "from-font", + 0: "0px", + 1: "1px", + 2: "2px", + 4: "4px", + 8: "8px", + ...be, + }, + textIndent: ({ theme: e }) => e("spacing"), + textOpacity: ({ theme: e }) => e("opacity"), + textUnderlineOffset: { + auto: "auto", + 0: "0px", + 1: "1px", + 2: "2px", + 4: "4px", + 8: "8px", + ...be, + }, + transformOrigin: { + center: "center", + top: "top", + "top-right": "top right", + right: "right", + "bottom-right": "bottom right", + bottom: "bottom", + "bottom-left": "bottom left", + left: "left", + "top-left": "top left", + }, + transitionDelay: { + 0: "0s", + 75: "75ms", + 100: "100ms", + 150: "150ms", + 200: "200ms", + 300: "300ms", + 500: "500ms", + 700: "700ms", + 1e3: "1000ms", + ...gi, + }, + transitionDuration: { + DEFAULT: "150ms", + 0: "0s", + 75: "75ms", + 100: "100ms", + 150: "150ms", + 200: "200ms", + 300: "300ms", + 500: "500ms", + 700: "700ms", + 1e3: "1000ms", + ...gi, + }, + transitionProperty: { + none: "none", + all: "all", + DEFAULT: + "color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter", + colors: + "color, background-color, border-color, outline-color, text-decoration-color, fill, stroke", + opacity: "opacity", + shadow: "box-shadow", + transform: "transform", + }, + transitionTimingFunction: { + DEFAULT: "cubic-bezier(0.4, 0, 0.2, 1)", + linear: "linear", + in: "cubic-bezier(0.4, 0, 1, 1)", + out: "cubic-bezier(0, 0, 0.2, 1)", + "in-out": "cubic-bezier(0.4, 0, 0.2, 1)", + }, + translate: ({ theme: e }) => ({ + "1/2": "50%", + "1/3": "33.333333%", + "2/3": "66.666667%", + "1/4": "25%", + "2/4": "50%", + "3/4": "75%", + full: "100%", + ...e("spacing"), + }), + size: ({ theme: e }) => ({ + auto: "auto", + "1/2": "50%", + "1/3": "33.333333%", + "2/3": "66.666667%", + "1/4": "25%", + "2/4": "50%", + "3/4": "75%", + "1/5": "20%", + "2/5": "40%", + "3/5": "60%", + "4/5": "80%", + "1/6": "16.666667%", + "2/6": "33.333333%", + "3/6": "50%", + "4/6": "66.666667%", + "5/6": "83.333333%", + "1/12": "8.333333%", + "2/12": "16.666667%", + "3/12": "25%", + "4/12": "33.333333%", + "5/12": "41.666667%", + "6/12": "50%", + "7/12": "58.333333%", + "8/12": "66.666667%", + "9/12": "75%", + "10/12": "83.333333%", + "11/12": "91.666667%", + full: "100%", + min: "min-content", + max: "max-content", + fit: "fit-content", + ...e("spacing"), + }), + width: ({ theme: e }) => ({ + auto: "auto", + "1/2": "50%", + "1/3": "33.333333%", + "2/3": "66.666667%", + "1/4": "25%", + "2/4": "50%", + "3/4": "75%", + "1/5": "20%", + "2/5": "40%", + "3/5": "60%", + "4/5": "80%", + "1/6": "16.666667%", + "2/6": "33.333333%", + "3/6": "50%", + "4/6": "66.666667%", + "5/6": "83.333333%", + "1/12": "8.333333%", + "2/12": "16.666667%", + "3/12": "25%", + "4/12": "33.333333%", + "5/12": "41.666667%", + "6/12": "50%", + "7/12": "58.333333%", + "8/12": "66.666667%", + "9/12": "75%", + "10/12": "83.333333%", + "11/12": "91.666667%", + full: "100%", + screen: "100vw", + svw: "100svw", + lvw: "100lvw", + dvw: "100dvw", + min: "min-content", + max: "max-content", + fit: "fit-content", + ...e("spacing"), + }), + willChange: { + auto: "auto", + scroll: "scroll-position", + contents: "contents", + transform: "transform", + }, + zIndex: { auto: "auto", 0: "0", 10: "10", 20: "20", 30: "30", 40: "40", 50: "50", ...ue }, + }; + function wi(e) { + return { + theme: { + ...vi, + colors: ({ theme: r }) => r("color", {}), + extend: { + fontSize: ({ theme: r }) => ({ ...r("text", {}) }), + boxShadow: ({ theme: r }) => ({ ...r("shadow", {}) }), + animation: ({ theme: r }) => ({ ...r("animate", {}) }), + aspectRatio: ({ theme: r }) => ({ ...r("aspect", {}) }), + borderRadius: ({ theme: r }) => ({ ...r("radius", {}) }), + screens: ({ theme: r }) => ({ ...r("breakpoint", {}) }), + letterSpacing: ({ theme: r }) => ({ ...r("tracking", {}) }), + lineHeight: ({ theme: r }) => ({ ...r("leading", {}) }), + transitionDuration: { DEFAULT: e.get(["--default-transition-duration"]) ?? null }, + transitionTimingFunction: { + DEFAULT: e.get(["--default-transition-timing-function"]) ?? null, + }, + maxWidth: ({ theme: r }) => ({ ...r("container", {}) }), + }, + }, + }; + } + var hn = { + blocklist: [], + future: {}, + experimental: {}, + prefix: "", + important: !1, + darkMode: null, + theme: {}, + plugins: [], + content: { files: [] }, + }; + function Ht(e, r) { + let i = { + design: e, + configs: [], + plugins: [], + content: { files: [] }, + theme: {}, + extend: {}, + result: structuredClone(hn), + }; + for (let n of r) qt(i, n); + for (let n of i.configs) + ("darkMode" in n && n.darkMode !== void 0 && (i.result.darkMode = n.darkMode ?? null), + "prefix" in n && n.prefix !== void 0 && (i.result.prefix = n.prefix ?? ""), + "blocklist" in n && n.blocklist !== void 0 && (i.result.blocklist = n.blocklist ?? []), + "important" in n && n.important !== void 0 && (i.result.important = n.important ?? !1)); + let t = kn(i); + return { + resolvedConfig: { ...i.result, content: i.content, theme: i.theme, plugins: i.plugins }, + replacedThemeKeys: t, + }; + } + function gn(e, r) { + if (Array.isArray(e) && Pe(e[0])) return e.concat(r); + if (Array.isArray(r) && Pe(r[0]) && Pe(e)) return [e, ...r]; + if (Array.isArray(r)) return r; + } + function qt(e, { config: r, base: i, path: t, reference: n, src: s }) { + let a = []; + for (let u of r.plugins ?? []) + "__isOptionsFunction" in u + ? a.push({ ...u(), reference: n, src: s }) + : "handler" in u + ? a.push({ ...u, reference: n, src: s }) + : a.push({ handler: u, reference: n, src: s }); + if (Array.isArray(r.presets) && r.presets.length === 0) + throw new Error( + "Error in the config file/plugin/preset. An empty preset (`preset: []`) is not currently supported.", + ); + for (let u of r.presets ?? []) qt(e, { path: t, base: i, config: u, reference: n, src: s }); + for (let u of a) + (e.plugins.push(u), + u.config && + qt(e, { path: t, base: i, config: u.config, reference: !!u.reference, src: u.src ?? s })); + let m = r.content ?? [], + c = Array.isArray(m) ? m : m.files; + for (let u of c) e.content.files.push(typeof u == "object" ? u : { base: i, pattern: u }); + e.configs.push(r); + } + function kn(e) { + let r = new Set(), + i = ht(e.design, () => e.theme, n), + t = Object.assign(i, { theme: i, colors: gt }); + function n(s) { + return typeof s == "function" ? (s(t) ?? null) : (s ?? null); + } + for (let s of e.configs) { + let a = s.theme ?? {}, + m = a.extend ?? {}; + for (let c in a) c !== "extend" && r.add(c); + Object.assign(e.theme, a); + for (let c in m) ((e.extend[c] ??= []), e.extend[c].push(m[c])); + } + delete e.theme.extend; + for (let s in e.extend) { + let a = [e.theme[s], ...e.extend[s]]; + e.theme[s] = () => { + let m = a.map(n); + return qe({}, m, gn); + }; + } + for (let s in e.theme) e.theme[s] = n(e.theme[s]); + if (e.theme.screens && typeof e.theme.screens == "object") + for (let s of Object.keys(e.theme.screens)) { + let a = e.theme.screens[s]; + a && + typeof a == "object" && + ("raw" in a || "max" in a || ("min" in a && (e.theme.screens[s] = a.min))); + } + return r; + } + function bi(e, r) { + let i = e.theme.container || {}; + if (typeof i != "object" || i === null) return; + let t = vn(i, r); + t.length !== 0 && r.utilities.static("container", () => t.map(re)); + } + function vn({ center: e, padding: r, screens: i }, t) { + let n = [], + s = null; + if ( + (e && n.push(o("margin-inline", "auto")), + (typeof r == "string" || (typeof r == "object" && r !== null && "DEFAULT" in r)) && + n.push(o("padding-inline", typeof r == "string" ? r : r.DEFAULT)), + typeof i == "object" && i !== null) + ) { + s = new Map(); + let a = Array.from(t.theme.namespace("--breakpoint").entries()); + if ((a.sort((m, c) => Ce(m[1], c[1], "asc")), a.length > 0)) { + let [m] = a[0]; + n.push(M("@media", `(width >= --theme(--breakpoint-${m}))`, [o("max-width", "none")])); + } + for (let [m, c] of Object.entries(i)) { + if (typeof c == "object") + if ("min" in c) c = c.min; + else continue; + s.set(m, M("@media", `(width >= ${c})`, [o("max-width", c)])); + } + } + if (typeof r == "object" && r !== null) { + let a = Object.entries(r) + .filter(([m]) => m !== "DEFAULT") + .map(([m, c]) => [m, t.theme.resolveValue(m, ["--breakpoint"]), c]) + .filter(Boolean); + a.sort((m, c) => Ce(m[1], c[1], "asc")); + for (let [m, , c] of a) + if (s && s.has(m)) s.get(m).nodes.push(o("padding-inline", c)); + else { + if (s) continue; + n.push(M("@media", `(width >= theme(--breakpoint-${m}))`, [o("padding-inline", c)])); + } + } + if (s) for (let [, a] of s) n.push(a); + return n; + } + function yi({ addVariant: e, config: r }) { + let i = r("darkMode", null), + [t, n = ".dark"] = Array.isArray(i) ? i : [i]; + if (t === "variant") { + let s; + if ( + (Array.isArray(n) || typeof n == "function" ? (s = n) : typeof n == "string" && (s = [n]), + Array.isArray(s)) + ) + for (let a of s) + a === ".dark" + ? ((t = !1), + console.warn( + 'When using `variant` for `darkMode`, you must provide a selector.\nExample: `darkMode: ["variant", ".your-selector &"]`', + )) + : a.includes("&") || + ((t = !1), + console.warn( + 'When using `variant` for `darkMode`, your selector must contain `&`.\nExample `darkMode: ["variant", ".your-selector &"]`', + )); + n = s; + } + t === null || + (t === "selector" + ? e("dark", `&:where(${n}, ${n} *)`) + : t === "media" + ? e("dark", "@media (prefers-color-scheme: dark)") + : t === "variant" + ? e("dark", n) + : t === "class" && e("dark", `&:is(${n} *)`)); + } + function xi(e) { + for (let [r, i] of [ + ["t", "top"], + ["tr", "top right"], + ["r", "right"], + ["br", "bottom right"], + ["b", "bottom"], + ["bl", "bottom left"], + ["l", "left"], + ["tl", "top left"], + ]) + (e.utilities.suggest(`bg-gradient-to-${r}`, () => []), + e.utilities.static(`bg-gradient-to-${r}`, () => [ + o("--tw-gradient-position", `to ${i} in oklab`), + o("background-image", "linear-gradient(var(--tw-gradient-stops))"), + ])); + (e.utilities.suggest("bg-left-top", () => []), + e.utilities.static("bg-left-top", () => [o("background-position", "left top")]), + e.utilities.suggest("bg-right-top", () => []), + e.utilities.static("bg-right-top", () => [o("background-position", "right top")]), + e.utilities.suggest("bg-left-bottom", () => []), + e.utilities.static("bg-left-bottom", () => [o("background-position", "left bottom")]), + e.utilities.suggest("bg-right-bottom", () => []), + e.utilities.static("bg-right-bottom", () => [o("background-position", "right bottom")]), + e.utilities.suggest("object-left-top", () => []), + e.utilities.static("object-left-top", () => [o("object-position", "left top")]), + e.utilities.suggest("object-right-top", () => []), + e.utilities.static("object-right-top", () => [o("object-position", "right top")]), + e.utilities.suggest("object-left-bottom", () => []), + e.utilities.static("object-left-bottom", () => [o("object-position", "left bottom")]), + e.utilities.suggest("object-right-bottom", () => []), + e.utilities.static("object-right-bottom", () => [o("object-position", "right bottom")]), + e.utilities.suggest("max-w-screen", () => []), + e.utilities.functional("max-w-screen", (r) => { + if (!r.value || r.value.kind === "arbitrary") return; + let i = e.theme.resolve(r.value.value, ["--breakpoint"]); + if (i) return [o("max-width", i)]; + }), + e.utilities.suggest("overflow-ellipsis", () => []), + e.utilities.static("overflow-ellipsis", () => [o("text-overflow", "ellipsis")]), + e.utilities.suggest("decoration-slice", () => []), + e.utilities.static("decoration-slice", () => [ + o("-webkit-box-decoration-break", "slice"), + o("box-decoration-break", "slice"), + ]), + e.utilities.suggest("decoration-clone", () => []), + e.utilities.static("decoration-clone", () => [ + o("-webkit-box-decoration-break", "clone"), + o("box-decoration-break", "clone"), + ]), + e.utilities.suggest("flex-shrink", () => []), + e.utilities.functional("flex-shrink", (r) => { + if (!r.modifier) { + if (!r.value) return [o("flex-shrink", "1")]; + if (r.value.kind === "arbitrary") return [o("flex-shrink", r.value.value)]; + if (E(r.value.value)) return [o("flex-shrink", r.value.value)]; + } + }), + e.utilities.suggest("flex-grow", () => []), + e.utilities.functional("flex-grow", (r) => { + if (!r.modifier) { + if (!r.value) return [o("flex-grow", "1")]; + if (r.value.kind === "arbitrary") return [o("flex-grow", r.value.value)]; + if (E(r.value.value)) return [o("flex-grow", r.value.value)]; + } + }), + e.utilities.suggest("order-none", () => []), + e.utilities.static("order-none", () => [o("order", "0")]), + e.utilities.suggest("break-words", () => []), + e.utilities.static("break-words", () => [o("overflow-wrap", "break-word")])); + } + function Ai(e, r) { + let i = e.theme.screens || {}, + t = r.variants.get("min")?.order ?? 0, + n = []; + for (let [a, m] of Object.entries(i)) { + let f = function (v) { + r.variants.static( + a, + (k) => { + k.nodes = [M("@media", d, k.nodes)]; + }, + { order: v }, + ); + }; + var s = f; + let c = r.variants.get(a), + u = r.theme.resolveValue(a, ["--breakpoint"]); + if (c && u && !r.theme.hasDefault(`--breakpoint-${a}`)) continue; + let h = !0; + typeof m == "string" && (h = !1); + let d = wn(m); + h ? n.push(f) : f(t); + } + if (n.length !== 0) { + for (let [, a] of r.variants.variants) a.order > t && (a.order += n.length); + r.variants.compareFns = new Map( + Array.from(r.variants.compareFns).map(([a, m]) => (a > t && (a += n.length), [a, m])), + ); + for (let [a, m] of n.entries()) m(t + a + 1); + } + } + function wn(e) { + return (Array.isArray(e) ? e : [e]) + .map((i) => (typeof i == "string" ? { min: i } : i && typeof i == "object" ? i : null)) + .map((i) => { + if (i === null) return null; + if ("raw" in i) return i.raw; + let t = ""; + return ( + i.max !== void 0 && (t += `${i.max} >= `), + (t += "width"), + i.min !== void 0 && (t += ` >= ${i.min}`), + `(${t})` + ); + }) + .filter(Boolean) + .join(", "); + } + function Ci(e, r) { + let i = e.theme.aria || {}, + t = e.theme.supports || {}, + n = e.theme.data || {}; + if (Object.keys(i).length > 0) { + let s = r.variants.get("aria"), + a = s?.applyFn, + m = s?.compounds; + r.variants.functional( + "aria", + (c, u) => { + let h = u.value; + return h && h.kind === "named" && h.value in i + ? a?.(c, { ...u, value: { kind: "arbitrary", value: i[h.value] } }) + : a?.(c, u); + }, + { compounds: m }, + ); + } + if (Object.keys(t).length > 0) { + let s = r.variants.get("supports"), + a = s?.applyFn, + m = s?.compounds; + r.variants.functional( + "supports", + (c, u) => { + let h = u.value; + return h && h.kind === "named" && h.value in t + ? a?.(c, { ...u, value: { kind: "arbitrary", value: t[h.value] } }) + : a?.(c, u); + }, + { compounds: m }, + ); + } + if (Object.keys(n).length > 0) { + let s = r.variants.get("data"), + a = s?.applyFn, + m = s?.compounds; + r.variants.functional( + "data", + (c, u) => { + let h = u.value; + return h && h.kind === "named" && h.value in n + ? a?.(c, { ...u, value: { kind: "arbitrary", value: n[h.value] } }) + : a?.(c, u); + }, + { compounds: m }, + ); + } + } + var bn = /^[a-z]+$/; + async function $i({ designSystem: e, base: r, ast: i, loadModule: t, sources: n }) { + let s = 0, + a = [], + m = []; + (D(i, (d, f) => { + if (d.kind !== "at-rule") return; + let v = Le(f); + if (d.name === "@plugin") { + if (v.parent !== null) throw new Error("`@plugin` cannot be nested."); + let k = d.params.slice(1, -1); + if (k.length === 0) throw new Error("`@plugin` must have a path."); + let w = {}; + for (let x of d.nodes ?? []) { + if (x.kind !== "declaration") + throw new Error(`Unexpected \`@plugin\` option: + +${oe([x])} + +\`@plugin\` options must be a flat list of declarations.`); + if (x.value === void 0) continue; + let V = x.value, + C = z(V, ",").map((y) => { + if (((y = y.trim()), y === "null")) return null; + if (y === "true") return !0; + if (y === "false") return !1; + if (Number.isNaN(Number(y))) { + if ( + (y[0] === '"' && y[y.length - 1] === '"') || + (y[0] === "'" && y[y.length - 1] === "'") + ) + return y.slice(1, -1); + if (y[0] === "{" && y[y.length - 1] === "}") + throw new Error(`Unexpected \`@plugin\` option: Value of declaration \`${oe([x]).trim()}\` is not supported. + +Using an object as a plugin option is currently only supported in JavaScript configuration files.`); + } else return Number(y); + return y; + }); + w[x.property] = C.length === 1 ? C[0] : C; + } + return ( + a.push([ + { id: k, base: v.context.base, reference: !!v.context.reference, src: d.src }, + Object.keys(w).length > 0 ? w : null, + ]), + (s |= 4), + O.Replace([]) + ); + } + if (d.name === "@config") { + if (d.nodes.length > 0) throw new Error("`@config` cannot have a body."); + if (v.parent !== null) throw new Error("`@config` cannot be nested."); + return ( + m.push({ + id: d.params.slice(1, -1), + base: v.context.base, + reference: !!v.context.reference, + src: d.src, + }), + (s |= 4), + O.Replace([]) + ); + } + }), + xi(e)); + let c = e.resolveThemeValue; + if ( + ((e.resolveThemeValue = function (f, v) { + return f.startsWith("--") + ? c(f, v) + : ((s |= Ti({ + designSystem: e, + base: r, + ast: i, + sources: n, + configs: [], + pluginDetails: [], + })), + e.resolveThemeValue(f, v)); + }), + !a.length && !m.length) + ) + return 0; + let [u, h] = await Promise.all([ + Promise.all( + m.map(async ({ id: d, base: f, reference: v, src: k }) => { + let w = await t(d, f, "config"); + return { path: d, base: w.base, config: w.module, reference: v, src: k }; + }), + ), + Promise.all( + a.map(async ([{ id: d, base: f, reference: v, src: k }, w]) => { + let x = await t(d, f, "plugin"); + return { path: d, base: x.base, plugin: x.module, options: w, reference: v, src: k }; + }), + ), + ]); + return ( + (s |= Ti({ designSystem: e, base: r, ast: i, sources: n, configs: u, pluginDetails: h })), s + ); + } + function Ti({ designSystem: e, base: r, ast: i, sources: t, configs: n, pluginDetails: s }) { + let a = 0, + c = [ + ...s.map((w) => { + if (!w.options) + return { + config: { plugins: [w.plugin] }, + base: w.base, + reference: w.reference, + src: w.src, + }; + if ("__isOptionsFunction" in w.plugin) + return { + config: { plugins: [w.plugin(w.options)] }, + base: w.base, + reference: w.reference, + src: w.src, + }; + throw new Error(`The plugin "${w.path}" does not accept options`); + }), + ...n, + ], + { resolvedConfig: u } = Ht(e, [ + { config: wi(e.theme), base: r, reference: !0, src: void 0 }, + ...c, + { config: { plugins: [yi] }, base: r, reference: !0, src: void 0 }, + ]), + { resolvedConfig: h, replacedThemeKeys: d } = Ht(e, c), + f = { + designSystem: e, + ast: i, + resolvedConfig: u, + featuresRef: { + set current(w) { + a |= w; + }, + }, + }, + v = Bt({ ...f, referenceMode: !1, src: void 0 }), + k = e.resolveThemeValue; + e.resolveThemeValue = function (x, V) { + if (x[0] === "-" && x[1] === "-") return k(x, V); + let C = v.theme(x, void 0); + if (Array.isArray(C) && C.length === 2) return C[0]; + if (Array.isArray(C)) return C.join(", "); + if (typeof C == "object" && C !== null && "DEFAULT" in C) return C.DEFAULT; + if (typeof C == "string") return C; + }; + for (let { handler: w, reference: x, src: V } of u.plugins) { + let C = Bt({ ...f, referenceMode: x ?? !1, src: V }); + w(C); + } + if ((Jr(e, h, d), hi(e, h), Ci(h, e), Ai(h, e), bi(h, e), !e.theme.prefix && u.prefix)) { + if ( + (u.prefix.endsWith("-") && + ((u.prefix = u.prefix.slice(0, -1)), + console.warn( + `The prefix "${u.prefix}" is invalid. Prefixes must be lowercase ASCII letters (a-z) only and is written as a variant before all utilities. We have fixed up the prefix for you. Remove the trailing \`-\` to silence this warning.`, + )), + !bn.test(u.prefix)) + ) + throw new Error( + `The prefix "${u.prefix}" is invalid. Prefixes must be lowercase ASCII letters (a-z) only.`, + ); + e.theme.prefix = u.prefix; + } + if ( + (!e.important && u.important === !0 && (e.important = !0), typeof u.important == "string") + ) { + let w = u.important; + D(i, (x, V) => { + if (x.kind !== "at-rule" || x.name !== "@tailwind" || x.params !== "utilities") return; + let C = Le(V); + return C.parent?.kind === "rule" && C.parent.selector === w + ? O.Stop + : O.ReplaceStop(q(w, [x])); + }); + } + for (let w of u.blocklist) e.invalidCandidates.add(w); + for (let w of u.content.files) { + if ("raw" in w) + throw new Error(`Error in the config file/plugin/preset. The \`content\` key contains a \`raw\` entry: + +${JSON.stringify(w, null, 2)} + +This feature is not currently supported.`); + let x = !1; + (w.pattern[0] == "!" && ((x = !0), (w.pattern = w.pattern.slice(1))), + t.push({ ...w, negated: x })); + } + return a; + } + function Ni({ ast: e }) { + let r = new H((n) => Ge(n.code)), + i = new H((n) => ({ url: n.file, content: n.code, ignore: !1 })), + t = { file: null, sources: [], mappings: [] }; + D(e, (n) => { + if (!n.src || !n.dst) return; + let s = i.get(n.src[0]); + if (!s.content) return; + let a = r.get(n.src[0]), + m = r.get(n.dst[0]), + c = s.content.slice(n.src[1], n.src[2]), + u = 0; + for (let f of c.split(` +`)) { + if (f.trim() !== "") { + let v = a.find(n.src[1] + u), + k = m.find(n.dst[1]); + t.mappings.push({ + name: null, + originalPosition: { source: s, ...v }, + generatedPosition: k, + }); + } + ((u += f.length), (u += 1)); + } + let h = a.find(n.src[2]), + d = m.find(n.dst[2]); + t.mappings.push({ name: null, originalPosition: { source: s, ...h }, generatedPosition: d }); + }); + for (let n of r.keys()) t.sources.push(i.get(n)); + return ( + t.mappings.sort( + (n, s) => + n.generatedPosition.line - s.generatedPosition.line || + n.generatedPosition.column - s.generatedPosition.column || + (n.originalPosition?.line ?? 0) - (s.originalPosition?.line ?? 0) || + (n.originalPosition?.column ?? 0) - (s.originalPosition?.column ?? 0), + ), + t + ); + } + var Si = /^(-?\d+)\.\.(-?\d+)(?:\.\.(-?\d+))?$/; + function vt(e) { + let r = e.indexOf("{"); + if (r === -1) return [e]; + let i = [], + t = e.slice(0, r), + n = e.slice(r), + s = 0, + a = n.lastIndexOf("}"); + for (let d = 0; d < n.length; d++) { + let f = n[d]; + if (f === "{") s++; + else if (f === "}" && (s--, s === 0)) { + a = d; + break; + } + } + if (a === -1) throw new Error(`The pattern \`${e}\` is not balanced.`); + let m = n.slice(1, a), + c = n.slice(a + 1), + u; + (yn(m) ? (u = xn(m)) : (u = z(m, ",")), (u = u.flatMap((d) => vt(d)))); + let h = vt(c); + for (let d of h) for (let f of u) i.push(t + f + d); + return i; + } + function yn(e) { + return Si.test(e); + } + function xn(e) { + let r = e.match(Si); + if (!r) return [e]; + let [, i, t, n] = r, + s = n ? parseInt(n, 10) : void 0, + a = []; + if (/^-?\d+$/.test(i) && /^-?\d+$/.test(t)) { + let m = parseInt(i, 10), + c = parseInt(t, 10); + if ((s === void 0 && (s = m <= c ? 1 : -1), s === 0)) + throw new Error("Step cannot be zero in sequence expansion."); + let u = m < c; + (u && s < 0 && (s = -s), !u && s > 0 && (s = -s)); + for (let h = m; u ? h <= c : h >= c; h += s) a.push(h.toString()); + } + return a; + } + function Ei(e, r) { + let i = new Set(), + t = new Set(), + n = []; + function s(a, m = []) { + if (e.has(a) && !i.has(a)) { + (t.has(a) && r.onCircularDependency?.(m, a), t.add(a)); + for (let c of e.get(a) ?? []) (m.push(a), s(c, m), m.pop()); + (i.add(a), t.delete(a), n.push(a)); + } + } + for (let a of e.keys()) s(a); + return n; + } + var An = /^[a-z]+$/; + function Cn() { + throw new Error("No `loadModule` function provided to `compile`"); + } + function Tn() { + throw new Error("No `loadStylesheet` function provided to `compile`"); + } + function $n(e) { + let r = 0, + i = null; + for (let t of z(e, " ")) + t === "reference" + ? (r |= 2) + : t === "inline" + ? (r |= 1) + : t === "default" + ? (r |= 4) + : t === "static" + ? (r |= 8) + : t.startsWith("prefix(") && t.endsWith(")") && (i = t.slice(7, -1)); + return [r, i]; + } + async function Nn(e, { base: r = "", from: i, loadModule: t = Cn, loadStylesheet: n = Tn } = {}) { + let s = 0; + ((e = [fe({ base: r }, e)]), (s |= await Wt(e, r, n, 0, i !== void 0))); + let a = null, + m = new et(), + c = new Map(), + u = new Map(), + h = [], + d = null, + f = null, + v = [], + k = [], + w = [], + x = [], + V = null; + D(e, (y, K) => { + if (y.kind !== "at-rule") return; + let R = Le(K); + if ( + y.name === "@tailwind" && + (y.params === "utilities" || y.params.startsWith("utilities")) + ) { + if (f !== null) return O.Replace([]); + if (R.context.reference) return O.Replace([]); + let P = z(y.params, " "); + for (let L of P) + if (L.startsWith("source(")) { + let U = L.slice(7, -1); + if (U === "none") { + V = U; + continue; + } + if ( + (U[0] === '"' && U[U.length - 1] !== '"') || + (U[0] === "'" && U[U.length - 1] !== "'") || + (U[0] !== "'" && U[0] !== '"') + ) + throw new Error("`source(\u2026)` paths must be quoted."); + V = { base: R.context.sourceBase ?? R.context.base, pattern: U.slice(1, -1) }; + } + ((f = y), (s |= 16)); + } + if (y.name === "@utility") { + if (R.parent !== null) throw new Error("`@utility` cannot be nested."); + if (y.nodes.length === 0) + throw new Error( + `\`@utility ${y.params}\` is empty. Utilities should include at least one property.`, + ); + let P = Dr(y); + if (P === null) { + if (!y.params.endsWith("-*")) { + if (y.params.endsWith("*")) + throw new Error( + `\`@utility ${y.params}\` defines an invalid utility name. A functional utility must end in \`-*\`.`, + ); + if (y.params.includes("*")) + throw new Error( + `\`@utility ${y.params}\` defines an invalid utility name. The dynamic portion marked by \`-*\` must appear once at the end.`, + ); + } + throw new Error( + `\`@utility ${y.params}\` defines an invalid utility name. Utilities should be alphanumeric and start with a lowercase letter.`, + ); + } + h.push(P); + } + if (y.name === "@source") { + if (y.nodes.length > 0) throw new Error("`@source` cannot have a body."); + if (R.parent !== null) throw new Error("`@source` cannot be nested."); + let P = !1, + L = !1, + U = y.params; + if ( + (U[0] === "n" && U.startsWith("not ") && ((P = !0), (U = U.slice(4))), + U[0] === "i" && U.startsWith("inline(") && ((L = !0), (U = U.slice(7, -1))), + (U[0] === '"' && U[U.length - 1] !== '"') || + (U[0] === "'" && U[U.length - 1] !== "'") || + (U[0] !== "'" && U[0] !== '"')) + ) + throw new Error("`@source` paths must be quoted."); + let j = U.slice(1, -1); + if (L) { + let W = P ? x : w, + B = z(j, " "); + for (let ne of B) for (let le of vt(ne)) W.push(le); + } else k.push({ base: R.context.base, pattern: j, negated: P }); + return O.ReplaceSkip([]); + } + if ( + (y.name === "@variant" && + (R.parent === null + ? y.nodes.length === 0 + ? (y.name = "@custom-variant") + : (D(y.nodes, (P) => { + if (P.kind === "at-rule" && P.name === "@slot") + return ((y.name = "@custom-variant"), O.Stop); + }), + y.name === "@variant" && v.push(y)) + : v.push(y)), + y.name === "@custom-variant") + ) { + if (R.parent !== null) throw new Error("`@custom-variant` cannot be nested."); + let [P, L] = z(y.params, " "); + if (!ct.test(P)) + throw new Error( + `\`@custom-variant ${P}\` defines an invalid variant name. Variants should only contain alphanumeric, dashes, or underscore characters and start with a lowercase letter or number.`, + ); + if (y.nodes.length > 0 && L) + throw new Error(`\`@custom-variant ${P}\` cannot have both a selector and a body.`); + if (y.nodes.length === 0) { + if (!L) throw new Error(`\`@custom-variant ${P}\` has no selector or body.`); + let U = z(L.slice(1, -1), ","); + if (U.length === 0 || U.some((B) => B.trim() === "")) + throw new Error(`\`@custom-variant ${P} (${U.join(",")})\` selector is invalid.`); + let j = [], + W = []; + for (let B of U) ((B = B.trim()), B[0] === "@" ? j.push(B) : W.push(B)); + (c.set(P, (B) => { + B.variants.static( + P, + (ne) => { + let le = []; + W.length > 0 && le.push(q(W.join(", "), ne.nodes)); + for (let l of j) le.push(Y(l, ne.nodes)); + ne.nodes = le; + }, + { compounds: $e([...W, ...j]) }, + ); + }), + u.set(P, new Set())); + } else { + let U = new Set(); + (D(y.nodes, (j) => { + j.kind === "at-rule" && j.name === "@variant" && U.add(j.params); + }), + c.set(P, (j) => { + j.variants.fromAst(P, y.nodes, j); + }), + u.set(P, U)); + } + return O.ReplaceSkip([]); + } + if (y.name === "@media") { + let P = z(y.params, " "), + L = []; + for (let U of P) + if (U.startsWith("source(")) { + let j = U.slice(7, -1); + D(y.nodes, (W) => { + if (W.kind === "at-rule" && W.name === "@tailwind" && W.params === "utilities") + return ( + (W.params += ` source(${j})`), + O.ReplaceStop([fe({ sourceBase: R.context.base }, [W])]) + ); + }); + } else if (U.startsWith("theme(")) { + let j = U.slice(6, -1), + W = j.includes("reference"); + D(y.nodes, (B) => { + if (B.kind !== "context") { + if (B.kind !== "at-rule") { + if (W) + throw new Error( + 'Files imported with `@import "\u2026" theme(reference)` must only contain `@theme` blocks.\nUse `@reference "\u2026";` instead.', + ); + return O.Continue; + } + if (B.name === "@theme") return ((B.params += " " + j), O.Skip); + } + }); + } else if (U.startsWith("prefix(")) { + let j = U.slice(7, -1); + D(y.nodes, (W) => { + if (W.kind === "at-rule" && W.name === "@theme") + return ((W.params += ` prefix(${j})`), O.Skip); + }); + } else + U === "important" + ? (a = !0) + : U === "reference" + ? (y.nodes = [fe({ reference: !0 }, y.nodes)]) + : L.push(U); + if (L.length > 0) y.params = L.join(" "); + else if (P.length > 0) return O.Replace(y.nodes); + return O.Continue; + } + if (y.name === "@theme") { + let [P, L] = $n(y.params); + if (((s |= 64), R.context.reference && (P |= 2), L)) { + if (!An.test(L)) + throw new Error( + `The prefix "${L}" is invalid. Prefixes must be lowercase ASCII letters (a-z) only.`, + ); + m.prefix = L; + } + return ( + D(y.nodes, (U) => { + if (U.kind === "at-rule" && U.name === "@keyframes") return (m.addKeyframes(U), O.Skip); + if (U.kind === "comment") return; + if (U.kind === "declaration" && U.property.startsWith("--")) { + m.add(ye(U.property), U.value ?? "", P, U.src); + return; + } + let j = oe([M(y.name, y.params, [U])]) + .split(` +`) + .map((W, B, ne) => `${B === 0 || B >= ne.length - 2 ? " " : ">"} ${W}`).join(` +`); + throw new Error(`\`@theme\` blocks must only contain custom properties or \`@keyframes\`. + +${j}`); + }), + d ? O.ReplaceSkip([]) : ((d = q(":root, :host", [])), (d.src = y.src), O.ReplaceSkip(d)) + ); + } + }); + let C = Br(m, f?.src); + if ((a && (C.important = a), x.length > 0)) for (let y of x) C.invalidCandidates.add(y); + s |= await $i({ designSystem: C, base: r, ast: e, loadModule: t, sources: k }); + for (let y of c.keys()) C.variants.static(y, () => {}); + for (let y of Ei(u, { + onCircularDependency(K, R) { + let P = oe(K.map((L, U) => M("@custom-variant", L, [M("@variant", K[U + 1] ?? R, [])]))) + .replaceAll(";", " { \u2026 }") + .replace(`@custom-variant ${R} {`, `@custom-variant ${R} { /* \u2190 */`); + throw new Error(`Circular dependency detected in custom variants: + +${P}`); + }, + })) + c.get(y)?.(C); + for (let y of h) y(C); + if (d) { + let y = []; + for (let [R, P] of C.theme.entries()) { + if (P.options & 2) continue; + let L = o(ge(R), P.value); + ((L.src = P.src), y.push(L)); + } + let K = C.theme.getKeyframes(); + for (let R of K) e.push(fe({ theme: !0 }, [F([R])])); + d.nodes = [fe({ theme: !0 }, y)]; + } + if (((s |= Me(e, C)), (s |= Re(e, C)), (s |= We(e, C)), f)) { + let y = f; + ((y.kind = "context"), (y.context = {})); + } + return ( + D(e, (y) => { + if (y.kind === "at-rule") return y.name === "@utility" ? O.Replace([]) : O.Skip; + }), + { + designSystem: C, + ast: e, + sources: k, + root: V, + utilitiesNode: f, + features: s, + inlineCandidates: w, + } + ); + } + async function Sn(e, r = {}) { + let { + designSystem: i, + ast: t, + sources: n, + root: s, + utilitiesNode: a, + features: m, + inlineCandidates: c, + } = await Nn(e, r); + t.unshift(Xe(`! tailwindcss v${Jt} | MIT License | https://tailwindcss.com `)); + function u(k) { + i.invalidCandidates.add(k); + } + let h = new Set(), + d = null, + f = 0, + v = !1; + for (let k of c) i.invalidCandidates.has(k) || (h.add(k), (v = !0)); + return { + sources: n, + root: s, + features: m, + build(k) { + if (m === 0) return e; + if (!a) return ((d ??= Ae(t, i, r.polyfills)), d); + let w = v, + x = !1; + v = !1; + let V = h.size; + for (let y of k) + if (!i.invalidCandidates.has(y)) + if (y[0] === "-" && y[1] === "-") { + let K = i.theme.markUsedVariable(y); + ((w ||= K), (x ||= K)); + } else (h.add(y), (w ||= h.size !== V)); + if (!w) return ((d ??= Ae(t, i, r.polyfills)), d); + let C = ve(h, i, { onInvalidCandidate: u }).astNodes; + return ( + r.from && + D(C, (y) => { + y.src ??= a.src; + }), + !x && f === C.length + ? ((d ??= Ae(t, i, r.polyfills)), d) + : ((f = C.length), (a.nodes = C), (d = Ae(t, i, r.polyfills)), d) + ); + }, + }; + } + async function Vi(e, r = {}) { + let i = Se(e, { from: r.from }), + t = await Sn(i, r), + n = i, + s = e; + return { + ...t, + build(a) { + let m = t.build(a); + return (m === n || ((s = oe(m, !!r.from)), (n = m)), s); + }, + buildSourceMap() { + return Ni({ ast: n }); + }, + }; + } + var Ri = `@layer theme, base, components, utilities; + +@import './theme.css' layer(theme); +@import './preflight.css' layer(base); +@import './utilities.css' layer(utilities); +`; + var Oi = `/* + 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) + 2. Remove default margins and padding + 3. Reset all borders. +*/ + +*, +::after, +::before, +::backdrop, +::file-selector-button { + box-sizing: border-box; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 2 */ + border: 0 solid; /* 3 */ +} + +/* + 1. Use a consistent sensible line-height in all browsers. + 2. Prevent adjustments of font size after orientation changes in iOS. + 3. Use a more readable tab size. + 4. Use the user's configured \`sans\` font-family by default. + 5. Use the user's configured \`sans\` font-feature-settings by default. + 6. Use the user's configured \`sans\` font-variation-settings by default. + 7. Disable tap highlights on iOS. +*/ + +html, +:host { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + tab-size: 4; /* 3 */ + font-family: --theme( + --default-font-family, + ui-sans-serif, + system-ui, + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' + ); /* 4 */ + font-feature-settings: --theme(--default-font-feature-settings, normal); /* 5 */ + font-variation-settings: --theme(--default-font-variation-settings, normal); /* 6 */ + -webkit-tap-highlight-color: transparent; /* 7 */ +} + +/* + 1. Add the correct height in Firefox. + 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) + 3. Reset the default border style to a 1px solid border. +*/ + +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* + Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* + Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* + Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + -webkit-text-decoration: inherit; + text-decoration: inherit; +} + +/* + Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* + 1. Use the user's configured \`mono\` font-family by default. + 2. Use the user's configured \`mono\` font-feature-settings by default. + 3. Use the user's configured \`mono\` font-variation-settings by default. + 4. Correct the odd \`em\` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: --theme( + --default-mono-font-family, + ui-monospace, + SFMono-Regular, + Menlo, + Monaco, + Consolas, + 'Liberation Mono', + 'Courier New', + monospace + ); /* 1 */ + font-feature-settings: --theme(--default-mono-font-feature-settings, normal); /* 2 */ + font-variation-settings: --theme(--default-mono-font-variation-settings, normal); /* 3 */ + font-size: 1em; /* 4 */ +} + +/* + Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* + Prevent \`sub\` and \`sup\` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* + 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) + 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) + 3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* + Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* + Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* + Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* + Make lists unstyled by default. +*/ + +ol, +ul, +menu { + list-style: none; +} + +/* + 1. Make replaced elements \`display: block\` by default. (https://github.com/mozdevs/cssremedy/issues/14) + 2. Add \`vertical-align: middle\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* + Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* + 1. Inherit font styles in all browsers. + 2. Remove border radius in all browsers. + 3. Remove background color in all browsers. + 4. Ensure consistent opacity for disabled states in all browsers. +*/ + +button, +input, +select, +optgroup, +textarea, +::file-selector-button { + font: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + letter-spacing: inherit; /* 1 */ + color: inherit; /* 1 */ + border-radius: 0; /* 2 */ + background-color: transparent; /* 3 */ + opacity: 1; /* 4 */ +} + +/* + Restore default font weight. +*/ + +:where(select:is([multiple], [size])) optgroup { + font-weight: bolder; +} + +/* + Restore indentation. +*/ + +:where(select:is([multiple], [size])) optgroup option { + padding-inline-start: 20px; +} + +/* + Restore space after button. +*/ + +::file-selector-button { + margin-inline-end: 4px; +} + +/* + Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +*/ + +::placeholder { + opacity: 1; +} + +/* + Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not + crash when using \`color-mix(\u2026)\` with \`currentcolor\`. (https://github.com/tailwindlabs/tailwindcss/issues/17194) +*/ + +@supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or + (contain-intrinsic-size: 1px) /* Safari 17+ */ { + ::placeholder { + color: color-mix(in oklab, currentcolor 50%, transparent); + } +} + +/* + Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* + Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* + 1. Ensure date/time inputs have the same height when empty in iOS Safari. + 2. Ensure text alignment can be changed on date/time inputs in iOS Safari. +*/ + +::-webkit-date-and-time-value { + min-height: 1lh; /* 1 */ + text-align: inherit; /* 2 */ +} + +/* + Prevent height from changing on date/time inputs in macOS Safari when the input is set to \`display: block\`. +*/ + +::-webkit-datetime-edit { + display: inline-flex; +} + +/* + Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers. +*/ + +::-webkit-datetime-edit-fields-wrapper { + padding: 0; +} + +::-webkit-datetime-edit, +::-webkit-datetime-edit-year-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-minute-field, +::-webkit-datetime-edit-second-field, +::-webkit-datetime-edit-millisecond-field, +::-webkit-datetime-edit-meridiem-field { + padding-block: 0; +} + +/* + Center dropdown marker shown on inputs with paired \`\`s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499) +*/ + +::-webkit-calendar-picker-indicator { + line-height: 1; +} + +/* + Remove the additional \`:invalid\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* + Correct the inability to style the border radius in iOS Safari. +*/ + +button, +input:where([type='button'], [type='reset'], [type='submit']), +::file-selector-button { + appearance: button; +} + +/* + Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* + Make elements with the HTML hidden attribute stay hidden by default. +*/ + +[hidden]:where(:not([hidden='until-found'])) { + display: none !important; +} +`; + var Pi = `@theme default { + --font-sans: + ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; + --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; + --font-mono: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', + monospace; + + --color-red-50: oklch(97.1% 0.013 17.38); + --color-red-100: oklch(93.6% 0.032 17.717); + --color-red-200: oklch(88.5% 0.062 18.334); + --color-red-300: oklch(80.8% 0.114 19.571); + --color-red-400: oklch(70.4% 0.191 22.216); + --color-red-500: oklch(63.7% 0.237 25.331); + --color-red-600: oklch(57.7% 0.245 27.325); + --color-red-700: oklch(50.5% 0.213 27.518); + --color-red-800: oklch(44.4% 0.177 26.899); + --color-red-900: oklch(39.6% 0.141 25.723); + --color-red-950: oklch(25.8% 0.092 26.042); + + --color-orange-50: oklch(98% 0.016 73.684); + --color-orange-100: oklch(95.4% 0.038 75.164); + --color-orange-200: oklch(90.1% 0.076 70.697); + --color-orange-300: oklch(83.7% 0.128 66.29); + --color-orange-400: oklch(75% 0.183 55.934); + --color-orange-500: oklch(70.5% 0.213 47.604); + --color-orange-600: oklch(64.6% 0.222 41.116); + --color-orange-700: oklch(55.3% 0.195 38.402); + --color-orange-800: oklch(47% 0.157 37.304); + --color-orange-900: oklch(40.8% 0.123 38.172); + --color-orange-950: oklch(26.6% 0.079 36.259); + + --color-amber-50: oklch(98.7% 0.022 95.277); + --color-amber-100: oklch(96.2% 0.059 95.617); + --color-amber-200: oklch(92.4% 0.12 95.746); + --color-amber-300: oklch(87.9% 0.169 91.605); + --color-amber-400: oklch(82.8% 0.189 84.429); + --color-amber-500: oklch(76.9% 0.188 70.08); + --color-amber-600: oklch(66.6% 0.179 58.318); + --color-amber-700: oklch(55.5% 0.163 48.998); + --color-amber-800: oklch(47.3% 0.137 46.201); + --color-amber-900: oklch(41.4% 0.112 45.904); + --color-amber-950: oklch(27.9% 0.077 45.635); + + --color-yellow-50: oklch(98.7% 0.026 102.212); + --color-yellow-100: oklch(97.3% 0.071 103.193); + --color-yellow-200: oklch(94.5% 0.129 101.54); + --color-yellow-300: oklch(90.5% 0.182 98.111); + --color-yellow-400: oklch(85.2% 0.199 91.936); + --color-yellow-500: oklch(79.5% 0.184 86.047); + --color-yellow-600: oklch(68.1% 0.162 75.834); + --color-yellow-700: oklch(55.4% 0.135 66.442); + --color-yellow-800: oklch(47.6% 0.114 61.907); + --color-yellow-900: oklch(42.1% 0.095 57.708); + --color-yellow-950: oklch(28.6% 0.066 53.813); + + --color-lime-50: oklch(98.6% 0.031 120.757); + --color-lime-100: oklch(96.7% 0.067 122.328); + --color-lime-200: oklch(93.8% 0.127 124.321); + --color-lime-300: oklch(89.7% 0.196 126.665); + --color-lime-400: oklch(84.1% 0.238 128.85); + --color-lime-500: oklch(76.8% 0.233 130.85); + --color-lime-600: oklch(64.8% 0.2 131.684); + --color-lime-700: oklch(53.2% 0.157 131.589); + --color-lime-800: oklch(45.3% 0.124 130.933); + --color-lime-900: oklch(40.5% 0.101 131.063); + --color-lime-950: oklch(27.4% 0.072 132.109); + + --color-green-50: oklch(98.2% 0.018 155.826); + --color-green-100: oklch(96.2% 0.044 156.743); + --color-green-200: oklch(92.5% 0.084 155.995); + --color-green-300: oklch(87.1% 0.15 154.449); + --color-green-400: oklch(79.2% 0.209 151.711); + --color-green-500: oklch(72.3% 0.219 149.579); + --color-green-600: oklch(62.7% 0.194 149.214); + --color-green-700: oklch(52.7% 0.154 150.069); + --color-green-800: oklch(44.8% 0.119 151.328); + --color-green-900: oklch(39.3% 0.095 152.535); + --color-green-950: oklch(26.6% 0.065 152.934); + + --color-emerald-50: oklch(97.9% 0.021 166.113); + --color-emerald-100: oklch(95% 0.052 163.051); + --color-emerald-200: oklch(90.5% 0.093 164.15); + --color-emerald-300: oklch(84.5% 0.143 164.978); + --color-emerald-400: oklch(76.5% 0.177 163.223); + --color-emerald-500: oklch(69.6% 0.17 162.48); + --color-emerald-600: oklch(59.6% 0.145 163.225); + --color-emerald-700: oklch(50.8% 0.118 165.612); + --color-emerald-800: oklch(43.2% 0.095 166.913); + --color-emerald-900: oklch(37.8% 0.077 168.94); + --color-emerald-950: oklch(26.2% 0.051 172.552); + + --color-teal-50: oklch(98.4% 0.014 180.72); + --color-teal-100: oklch(95.3% 0.051 180.801); + --color-teal-200: oklch(91% 0.096 180.426); + --color-teal-300: oklch(85.5% 0.138 181.071); + --color-teal-400: oklch(77.7% 0.152 181.912); + --color-teal-500: oklch(70.4% 0.14 182.503); + --color-teal-600: oklch(60% 0.118 184.704); + --color-teal-700: oklch(51.1% 0.096 186.391); + --color-teal-800: oklch(43.7% 0.078 188.216); + --color-teal-900: oklch(38.6% 0.063 188.416); + --color-teal-950: oklch(27.7% 0.046 192.524); + + --color-cyan-50: oklch(98.4% 0.019 200.873); + --color-cyan-100: oklch(95.6% 0.045 203.388); + --color-cyan-200: oklch(91.7% 0.08 205.041); + --color-cyan-300: oklch(86.5% 0.127 207.078); + --color-cyan-400: oklch(78.9% 0.154 211.53); + --color-cyan-500: oklch(71.5% 0.143 215.221); + --color-cyan-600: oklch(60.9% 0.126 221.723); + --color-cyan-700: oklch(52% 0.105 223.128); + --color-cyan-800: oklch(45% 0.085 224.283); + --color-cyan-900: oklch(39.8% 0.07 227.392); + --color-cyan-950: oklch(30.2% 0.056 229.695); + + --color-sky-50: oklch(97.7% 0.013 236.62); + --color-sky-100: oklch(95.1% 0.026 236.824); + --color-sky-200: oklch(90.1% 0.058 230.902); + --color-sky-300: oklch(82.8% 0.111 230.318); + --color-sky-400: oklch(74.6% 0.16 232.661); + --color-sky-500: oklch(68.5% 0.169 237.323); + --color-sky-600: oklch(58.8% 0.158 241.966); + --color-sky-700: oklch(50% 0.134 242.749); + --color-sky-800: oklch(44.3% 0.11 240.79); + --color-sky-900: oklch(39.1% 0.09 240.876); + --color-sky-950: oklch(29.3% 0.066 243.157); + + --color-blue-50: oklch(97% 0.014 254.604); + --color-blue-100: oklch(93.2% 0.032 255.585); + --color-blue-200: oklch(88.2% 0.059 254.128); + --color-blue-300: oklch(80.9% 0.105 251.813); + --color-blue-400: oklch(70.7% 0.165 254.624); + --color-blue-500: oklch(62.3% 0.214 259.815); + --color-blue-600: oklch(54.6% 0.245 262.881); + --color-blue-700: oklch(48.8% 0.243 264.376); + --color-blue-800: oklch(42.4% 0.199 265.638); + --color-blue-900: oklch(37.9% 0.146 265.522); + --color-blue-950: oklch(28.2% 0.091 267.935); + + --color-indigo-50: oklch(96.2% 0.018 272.314); + --color-indigo-100: oklch(93% 0.034 272.788); + --color-indigo-200: oklch(87% 0.065 274.039); + --color-indigo-300: oklch(78.5% 0.115 274.713); + --color-indigo-400: oklch(67.3% 0.182 276.935); + --color-indigo-500: oklch(58.5% 0.233 277.117); + --color-indigo-600: oklch(51.1% 0.262 276.966); + --color-indigo-700: oklch(45.7% 0.24 277.023); + --color-indigo-800: oklch(39.8% 0.195 277.366); + --color-indigo-900: oklch(35.9% 0.144 278.697); + --color-indigo-950: oklch(25.7% 0.09 281.288); + + --color-violet-50: oklch(96.9% 0.016 293.756); + --color-violet-100: oklch(94.3% 0.029 294.588); + --color-violet-200: oklch(89.4% 0.057 293.283); + --color-violet-300: oklch(81.1% 0.111 293.571); + --color-violet-400: oklch(70.2% 0.183 293.541); + --color-violet-500: oklch(60.6% 0.25 292.717); + --color-violet-600: oklch(54.1% 0.281 293.009); + --color-violet-700: oklch(49.1% 0.27 292.581); + --color-violet-800: oklch(43.2% 0.232 292.759); + --color-violet-900: oklch(38% 0.189 293.745); + --color-violet-950: oklch(28.3% 0.141 291.089); + + --color-purple-50: oklch(97.7% 0.014 308.299); + --color-purple-100: oklch(94.6% 0.033 307.174); + --color-purple-200: oklch(90.2% 0.063 306.703); + --color-purple-300: oklch(82.7% 0.119 306.383); + --color-purple-400: oklch(71.4% 0.203 305.504); + --color-purple-500: oklch(62.7% 0.265 303.9); + --color-purple-600: oklch(55.8% 0.288 302.321); + --color-purple-700: oklch(49.6% 0.265 301.924); + --color-purple-800: oklch(43.8% 0.218 303.724); + --color-purple-900: oklch(38.1% 0.176 304.987); + --color-purple-950: oklch(29.1% 0.149 302.717); + + --color-fuchsia-50: oklch(97.7% 0.017 320.058); + --color-fuchsia-100: oklch(95.2% 0.037 318.852); + --color-fuchsia-200: oklch(90.3% 0.076 319.62); + --color-fuchsia-300: oklch(83.3% 0.145 321.434); + --color-fuchsia-400: oklch(74% 0.238 322.16); + --color-fuchsia-500: oklch(66.7% 0.295 322.15); + --color-fuchsia-600: oklch(59.1% 0.293 322.896); + --color-fuchsia-700: oklch(51.8% 0.253 323.949); + --color-fuchsia-800: oklch(45.2% 0.211 324.591); + --color-fuchsia-900: oklch(40.1% 0.17 325.612); + --color-fuchsia-950: oklch(29.3% 0.136 325.661); + + --color-pink-50: oklch(97.1% 0.014 343.198); + --color-pink-100: oklch(94.8% 0.028 342.258); + --color-pink-200: oklch(89.9% 0.061 343.231); + --color-pink-300: oklch(82.3% 0.12 346.018); + --color-pink-400: oklch(71.8% 0.202 349.761); + --color-pink-500: oklch(65.6% 0.241 354.308); + --color-pink-600: oklch(59.2% 0.249 0.584); + --color-pink-700: oklch(52.5% 0.223 3.958); + --color-pink-800: oklch(45.9% 0.187 3.815); + --color-pink-900: oklch(40.8% 0.153 2.432); + --color-pink-950: oklch(28.4% 0.109 3.907); + + --color-rose-50: oklch(96.9% 0.015 12.422); + --color-rose-100: oklch(94.1% 0.03 12.58); + --color-rose-200: oklch(89.2% 0.058 10.001); + --color-rose-300: oklch(81% 0.117 11.638); + --color-rose-400: oklch(71.2% 0.194 13.428); + --color-rose-500: oklch(64.5% 0.246 16.439); + --color-rose-600: oklch(58.6% 0.253 17.585); + --color-rose-700: oklch(51.4% 0.222 16.935); + --color-rose-800: oklch(45.5% 0.188 13.697); + --color-rose-900: oklch(41% 0.159 10.272); + --color-rose-950: oklch(27.1% 0.105 12.094); + + --color-slate-50: oklch(98.4% 0.003 247.858); + --color-slate-100: oklch(96.8% 0.007 247.896); + --color-slate-200: oklch(92.9% 0.013 255.508); + --color-slate-300: oklch(86.9% 0.022 252.894); + --color-slate-400: oklch(70.4% 0.04 256.788); + --color-slate-500: oklch(55.4% 0.046 257.417); + --color-slate-600: oklch(44.6% 0.043 257.281); + --color-slate-700: oklch(37.2% 0.044 257.287); + --color-slate-800: oklch(27.9% 0.041 260.031); + --color-slate-900: oklch(20.8% 0.042 265.755); + --color-slate-950: oklch(12.9% 0.042 264.695); + + --color-gray-50: oklch(98.5% 0.002 247.839); + --color-gray-100: oklch(96.7% 0.003 264.542); + --color-gray-200: oklch(92.8% 0.006 264.531); + --color-gray-300: oklch(87.2% 0.01 258.338); + --color-gray-400: oklch(70.7% 0.022 261.325); + --color-gray-500: oklch(55.1% 0.027 264.364); + --color-gray-600: oklch(44.6% 0.03 256.802); + --color-gray-700: oklch(37.3% 0.034 259.733); + --color-gray-800: oklch(27.8% 0.033 256.848); + --color-gray-900: oklch(21% 0.034 264.665); + --color-gray-950: oklch(13% 0.028 261.692); + + --color-zinc-50: oklch(98.5% 0 0); + --color-zinc-100: oklch(96.7% 0.001 286.375); + --color-zinc-200: oklch(92% 0.004 286.32); + --color-zinc-300: oklch(87.1% 0.006 286.286); + --color-zinc-400: oklch(70.5% 0.015 286.067); + --color-zinc-500: oklch(55.2% 0.016 285.938); + --color-zinc-600: oklch(44.2% 0.017 285.786); + --color-zinc-700: oklch(37% 0.013 285.805); + --color-zinc-800: oklch(27.4% 0.006 286.033); + --color-zinc-900: oklch(21% 0.006 285.885); + --color-zinc-950: oklch(14.1% 0.005 285.823); + + --color-neutral-50: oklch(98.5% 0 0); + --color-neutral-100: oklch(97% 0 0); + --color-neutral-200: oklch(92.2% 0 0); + --color-neutral-300: oklch(87% 0 0); + --color-neutral-400: oklch(70.8% 0 0); + --color-neutral-500: oklch(55.6% 0 0); + --color-neutral-600: oklch(43.9% 0 0); + --color-neutral-700: oklch(37.1% 0 0); + --color-neutral-800: oklch(26.9% 0 0); + --color-neutral-900: oklch(20.5% 0 0); + --color-neutral-950: oklch(14.5% 0 0); + + --color-stone-50: oklch(98.5% 0.001 106.423); + --color-stone-100: oklch(97% 0.001 106.424); + --color-stone-200: oklch(92.3% 0.003 48.717); + --color-stone-300: oklch(86.9% 0.005 56.366); + --color-stone-400: oklch(70.9% 0.01 56.259); + --color-stone-500: oklch(55.3% 0.013 58.071); + --color-stone-600: oklch(44.4% 0.011 73.639); + --color-stone-700: oklch(37.4% 0.01 67.558); + --color-stone-800: oklch(26.8% 0.007 34.298); + --color-stone-900: oklch(21.6% 0.006 56.043); + --color-stone-950: oklch(14.7% 0.004 49.25); + + --color-black: #000; + --color-white: #fff; + + --spacing: 0.25rem; + + --breakpoint-sm: 40rem; + --breakpoint-md: 48rem; + --breakpoint-lg: 64rem; + --breakpoint-xl: 80rem; + --breakpoint-2xl: 96rem; + + --container-3xs: 16rem; + --container-2xs: 18rem; + --container-xs: 20rem; + --container-sm: 24rem; + --container-md: 28rem; + --container-lg: 32rem; + --container-xl: 36rem; + --container-2xl: 42rem; + --container-3xl: 48rem; + --container-4xl: 56rem; + --container-5xl: 64rem; + --container-6xl: 72rem; + --container-7xl: 80rem; + + --text-xs: 0.75rem; + --text-xs--line-height: calc(1 / 0.75); + --text-sm: 0.875rem; + --text-sm--line-height: calc(1.25 / 0.875); + --text-base: 1rem; + --text-base--line-height: calc(1.5 / 1); + --text-lg: 1.125rem; + --text-lg--line-height: calc(1.75 / 1.125); + --text-xl: 1.25rem; + --text-xl--line-height: calc(1.75 / 1.25); + --text-2xl: 1.5rem; + --text-2xl--line-height: calc(2 / 1.5); + --text-3xl: 1.875rem; + --text-3xl--line-height: calc(2.25 / 1.875); + --text-4xl: 2.25rem; + --text-4xl--line-height: calc(2.5 / 2.25); + --text-5xl: 3rem; + --text-5xl--line-height: 1; + --text-6xl: 3.75rem; + --text-6xl--line-height: 1; + --text-7xl: 4.5rem; + --text-7xl--line-height: 1; + --text-8xl: 6rem; + --text-8xl--line-height: 1; + --text-9xl: 8rem; + --text-9xl--line-height: 1; + + --font-weight-thin: 100; + --font-weight-extralight: 200; + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extrabold: 800; + --font-weight-black: 900; + + --tracking-tighter: -0.05em; + --tracking-tight: -0.025em; + --tracking-normal: 0em; + --tracking-wide: 0.025em; + --tracking-wider: 0.05em; + --tracking-widest: 0.1em; + + --leading-tight: 1.25; + --leading-snug: 1.375; + --leading-normal: 1.5; + --leading-relaxed: 1.625; + --leading-loose: 2; + + --radius-xs: 0.125rem; + --radius-sm: 0.25rem; + --radius-md: 0.375rem; + --radius-lg: 0.5rem; + --radius-xl: 0.75rem; + --radius-2xl: 1rem; + --radius-3xl: 1.5rem; + --radius-4xl: 2rem; + + --shadow-2xs: 0 1px rgb(0 0 0 / 0.05); + --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); + + --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05); + --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05); + --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05); + + --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05); + --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15); + --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12); + --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15); + --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1); + --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15); + + --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15); + --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2); + --text-shadow-sm: + 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075); + --text-shadow-md: + 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1); + --text-shadow-lg: + 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1); + + --ease-in: cubic-bezier(0.4, 0, 1, 1); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); + + --animate-spin: spin 1s linear infinite; + --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; + --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + --animate-bounce: bounce 1s infinite; + + @keyframes spin { + to { + transform: rotate(360deg); + } + } + + @keyframes ping { + 75%, + 100% { + transform: scale(2); + opacity: 0; + } + } + + @keyframes pulse { + 50% { + opacity: 0.5; + } + } + + @keyframes bounce { + 0%, + 100% { + transform: translateY(-25%); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + + 50% { + transform: none; + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } + } + + --blur-xs: 4px; + --blur-sm: 8px; + --blur-md: 12px; + --blur-lg: 16px; + --blur-xl: 24px; + --blur-2xl: 40px; + --blur-3xl: 64px; + + --perspective-dramatic: 100px; + --perspective-near: 300px; + --perspective-normal: 500px; + --perspective-midrange: 800px; + --perspective-distant: 1200px; + + --aspect-video: 16 / 9; + + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + --default-font-family: --theme(--font-sans, initial); + --default-font-feature-settings: --theme(--font-sans--font-feature-settings, initial); + --default-font-variation-settings: --theme(--font-sans--font-variation-settings, initial); + --default-mono-font-family: --theme(--font-mono, initial); + --default-mono-font-feature-settings: --theme(--font-mono--font-feature-settings, initial); + --default-mono-font-variation-settings: --theme(--font-mono--font-variation-settings, initial); +} + +/* Deprecated */ +@theme default inline reference { + --blur: 8px; + --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); + --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06); + --radius: 0.25rem; + --max-width-prose: 65ch; +} +`; + var _i = `@tailwind utilities; +`; + var He = { index: Ri, preflight: Oi, theme: Pi, utilities: _i }; + var wt = class { + start(r) { + performance.mark(`${r} (start)`); + } + end(r, i) { + (performance.mark(`${r} (end)`), + performance.measure(r, { start: `${r} (start)`, end: `${r} (end)`, detail: i })); + } + hit(r, i) { + performance.mark(r, { detail: i }); + } + error(r) { + throw (performance.mark("(error)", { detail: { error: `${r}` } }), r); + } + }; + var Di = "text/tailwindcss", + bt, + Yt = new Set(), + Gt = "", + Zt = document.createElement("style"), + Ui = Promise.resolve(), + Un = 1, + te = new wt(); + async function Dn() { + (te.start("Create compiler"), te.start("Reading Stylesheets")); + let e = document.querySelectorAll(`style[type="${Di}"]`), + r = ""; + for (let i of e) + (zi(i), + (r += + i.textContent + + ` +`)); + if ( + (r.includes("@import") || (r = `@import "tailwindcss";${r}`), + te.end("Reading Stylesheets", { size: r.length, changed: Gt !== r }), + Gt !== r) + ) { + ((Gt = r), te.start("Compile CSS")); + try { + bt = await Vi(r, { base: "/", loadStylesheet: zn, loadModule: Kn }); + } finally { + (te.end("Compile CSS"), te.end("Create compiler")); + } + Yt.clear(); + } + } + async function zn(e, r) { + function i() { + if (e === "tailwindcss") + return { path: "virtual:tailwindcss/index.css", base: r, content: He.index }; + if ( + e === "tailwindcss/preflight" || + e === "tailwindcss/preflight.css" || + e === "./preflight.css" + ) + return { path: "virtual:tailwindcss/preflight.css", base: r, content: He.preflight }; + if (e === "tailwindcss/theme" || e === "tailwindcss/theme.css" || e === "./theme.css") + return { path: "virtual:tailwindcss/theme.css", base: r, content: He.theme }; + if ( + e === "tailwindcss/utilities" || + e === "tailwindcss/utilities.css" || + e === "./utilities.css" + ) + return { path: "virtual:tailwindcss/utilities.css", base: r, content: He.utilities }; + throw new Error(`The browser build does not support @import for "${e}"`); + } + try { + let t = i(); + return (te.hit("Loaded stylesheet", { id: e, base: r, size: t.content.length }), t); + } catch (t) { + throw (te.hit("Failed to load stylesheet", { id: e, base: r, error: t.message ?? t }), t); + } + } + async function Kn() { + throw new Error("The browser build does not support plugins or config files."); + } + async function Ln(e) { + if (!bt) return; + let r = new Set(); + te.start("Collect classes"); + for (let i of document.querySelectorAll("[class]")) + for (let t of i.classList) Yt.has(t) || (Yt.add(t), r.add(t)); + (te.end("Collect classes", { count: r.size }), + !(r.size === 0 && e === "incremental") && + (te.start("Build utilities"), + (Zt.textContent = bt.build(Array.from(r))), + te.end("Build utilities"))); + } + function yt(e) { + async function r() { + if (!bt && e !== "full") return; + let i = Un++; + (te.start(`Build #${i} (${e})`), + e === "full" && (await Dn()), + te.start("Build"), + await Ln(e), + te.end("Build"), + te.end(`Build #${i} (${e})`)); + } + Ui = Ui.then(r).catch((i) => te.error(i)); + } + var jn = new MutationObserver(() => yt("full")); + function zi(e) { + jn.observe(e, { + attributes: !0, + attributeFilter: ["type"], + characterData: !0, + subtree: !0, + childList: !0, + }); + } + new MutationObserver((e) => { + let r = 0, + i = 0; + for (let t of e) { + for (let n of t.addedNodes) + n.nodeType === Node.ELEMENT_NODE && + n.tagName === "STYLE" && + n.getAttribute("type") === Di && + (zi(n), r++); + for (let n of t.addedNodes) n.nodeType === 1 && n !== Zt && i++; + t.type === "attributes" && i++; + } + if (r > 0) return yt("full"); + if (i > 0) return yt("incremental"); + }).observe(document.documentElement, { + attributes: !0, + attributeFilter: ["class"], + childList: !0, + subtree: !0, + }); + yt("full"); + document.head.append(Zt); +})(); diff --git a/external-scripts/background.js b/external-scripts/background.js deleted file mode 100644 index 46b46bca..00000000 --- a/external-scripts/background.js +++ /dev/null @@ -1,989 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009-2012 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.Connector_Browser = new function() { - var _tabInfo = {}; - var _incompatibleVersionMessageShown; - var _injectTranslationScripts = [ - "browser-polyfill.min.js", - "Zotero/zotero_config.js", - "Zotero/zotero.js", - "Zotero/promise.js", - "Zotero/http.js", - "Zotero/proxy.js", - "Zotero/cachedTypes.js", - "Zotero/date.js", - "Zotero/debug.js", - "Zotero/openurl.js", - "Zotero/xregexp-all.js", - "Zotero/unicode-zotero.js", - "Zotero/translate.js", - "Zotero/translator.js", - "Zotero/translate_item.js", - "Zotero/connectorTypeSchemaData.js", - "Zotero/utilities.js", - "Zotero/utilities_translate.js", - "Zotero/utilities-common.js", - "Zotero/http_inject.js", - "Zotero/progressWindow.js", - "Zotero/translate_inject.js", - "Zotero/messages.js", - "Zotero/messaging_inject.js", - "Zotero/inject.js" - ]; - // Exposed for tests - this._tabInfo = _tabInfo; - - /** - * Called when translators are available for a given page - */ - this.onTranslators = function(translators, instanceID, contentType, tab, frameId) { - //_enableForTab(tab.id); - - let existingTranslators = _tabInfo[tab.id] && _tabInfo[tab.id].translators; - // If translators already exist for tab we need to figure out if the new translators - // are more important/higher priority - if (existingTranslators) { - if (!translators.length) return; - - if (existingTranslators.length) { - let existingTranslatorsHaveHigherPriority = existingTranslators[0].priority < translators[0].priority; - if (existingTranslatorsHaveHigherPriority) return; - - let priorityEqual = translators[0].priority == existingTranslators[0].priority; - let newTranslatorsAreFromTopFrame = frameId == 0; - if (priorityEqual && !newTranslatorsAreFromTopFrame) return; - } - } - - var isPDF = contentType == 'application/pdf'; - _tabInfo[tab.id] = Object.assign(_tabInfo[tab.id] || { - injections: {} - }, { - translators, - instanceID, - isPDF - }); - - //Zotero.Connector_Browser._updateExtensionUI(tab); - } - - /** - * If there's a frame with a PDF mimeType this gets invoked - * @param frameURL - * @param tabId - */ - this.onPDFFrame = function(frameURL, frameId, tabId) { - if (_tabInfo[tabId] && _tabInfo[tabId].translators && _tabInfo[tabId].translators.length) { - return; - } - browser.tabs.get(tabId).then(function(tab) { - _tabInfo[tab.id] = Object.assign(_tabInfo[tab.id] || { - injections: {} - }, { - translators: [], - isPDF: true, - frameId - }); - Zotero.Connector_Browser.injectTranslationScripts(tab, frameId); - Zotero.Connector_Browser._updateExtensionUI(tab); - }); - } - - /** - * Called to display select items dialog - */ - this.onSelect = async function(items, tab) { - await Zotero.Connector_Browser.openWindow( - browser.runtime.getURL("itemSelector/itemSelector.html") + - "#" + encodeURIComponent(JSON.stringify([tab.id, items])) - // Remove once https://bugzilla.mozilla.org/show_bug.cgi?id=719905 is fixed - .replace(/%3A/g, 'ZOTEROCOLON'), { - width: 600, - height: 325 - }, tab - ); - return new Promise(function(resolve) { - _tabInfo[tab.id].selectCallback = resolve; - }); - }; - - /** - * Called when a tab is removed or the URL has changed - */ - this.onPageLoad = function(url, tab) { - if (tab) _updateInfoForTab(tab.id, url); - } - - /** - * Called when Zotero goes online or offline - * @param [String|Boolean] version - either `false` or version string from X-Zotero-Version header - */ - this.onStateChange = function(version) { - if (version) { - Zotero.Prefs.set('firstSaveToServer', true); - // TODO: Enable once 5.0 is out, so that ContentTypeHandlers show an upgradeClient message instead - parseInt(version[0]) >= 5 && Zotero.ContentTypeHandler.enable(); - } else { - Zotero.ContentTypeHandler.disable(); - } - } - - this.onTabActivated = function(tab) { - Zotero.Connector_Browser._updateExtensionUI(tab); - }; - - /** - * Called if Zotero version is determined to be incompatible with Standalone - */ - this.onIncompatibleStandaloneVersion = function(zoteroVersion, standaloneVersion) { - if (_incompatibleVersionMessageShown) return; - alert('Zotero Connector for Chrome ' + zoteroVersion + ' is incompatible with the running ' + - 'version of Zotero Standalone' + (standaloneVersion ? " (" + standaloneVersion + ")" : "") + - '. Zotero Connector will continue to operate, but functionality that relies upon ' + - 'Zotero Standalone may be unavaliable.\n\n' + - 'Please ensure that you have installed the latest version of these components. See ' + - 'https://www.zotero.org/download for more details.'); - _incompatibleVersionMessageShown = true; - } - - /** - * Called if Zotero version is determined to be incompatible with Standalone - */ - this.newerVersionRequiredPrompt = function() { - let clientName = ZOTERO_CONFIG.CLIENT_NAME; - let url = ZOTERO_CONFIG.CLIENT_DOWNLOAD_URL; - let pageName = Zotero.getString('progressWindow_error_upgradeClient_latestVersion'); - let pageLink = `${pageName}`; - - return Zotero.Messaging.sendMessage('confirm', { - title: Zotero.getString("general_warning"), - button2Text: "", - message: Zotero.getString("progressWindow_error_upgradeClient", [clientName, pageLink]) - }); - } - - /** - * Checks whether a given frame has any matching translators. Injects translation code - * if translators are found. - * - * @param tab - * @param frameId - * @param url - url of the frame - */ - this.onFrameLoaded = async function(tab, frameId, url) { - if (_isDisabledForURL(tab.url) && frameId == 0 || _isDisabledForURL(url)) { - return; - } - Zotero.debug("Connector_Browser: onFrameLoaded for " + tab.url + "; " + url); - if (frameId == 0) { - // Injected via the manifest file - return; - } else { - if (!(tab.id in _tabInfo)) { - _tabInfo[tab.id] = {}; - } - if (!_tabInfo[tab.id].frameChecked) { - // Also in the first frame detected - // See https://github.com/zotero/zotero-connectors/issues/156 - _tabInfo[tab.id].frameChecked = true; - // If you try to inject here immediately Firefox throws - // "Frame not found, or missing host permission" - if (Zotero.isFirefox) { - await Zotero.Promise.delay(100); - } - return Zotero.Connector_Browser.injectTranslationScripts(tab, frameId); - } - } - // Frame url shouldn't ever match the tab url but sometimes it does and causes weird - // injections. We explicitly ignore it here. - if (url == tab.url) { - Zotero.debug(`Ignoring frame ${frameId} with a tab matching url ${tab.url}`); - return; - } - return Zotero.Translators.getWebTranslatorsForLocation(url, tab.url).then(function(translators) { - if (translators[0].length == 0) { - Zotero.debug("Not injecting. No translators found for [tab.url, url]: " + tab.url + " , " + url); - return; - } - Zotero.debug(translators[0].length + " translators found. Injecting into [tab.url, url]: " + tab.url + " , " + url); - return Zotero.Connector_Browser.injectTranslationScripts(tab, frameId); - }); - }; - - this.isIncognito = function(tab) { - return tab.incognito; - } - - /** - * Checks whether translation scripts are already injected into a frame and if not - injects - * @param tab {Object} - * @param [frameId=0] {Number] Defaults to top frame - * @returns {Promise} A promise that resolves when all scripts have been injected - */ - this.injectTranslationScripts = function(tab, frameId = 0) { - // Prevent triggering multiple times - let key = tab.id + '-' + frameId; - let deferred = this.injectTranslationScripts[key]; - if (deferred) { - Zotero.debug(`Translation Inject: Script injection already in progress for ${key}`); - return deferred.promise; - } - deferred = Zotero.Promise.defer(); - this.injectTranslationScripts[key] = deferred; - deferred.promise.catch(function(e) { - Zotero.debug(`Translation Inject: Script injection rejected ${key}`); - Zotero.debug(e.message); - }).then(function() { - delete Zotero.Connector_Browser.injectTranslationScripts[key]; - }); - - Zotero.Messaging.sendMessage('ping', null, tab, frameId).then(function(response) { - if (response && frameId == 0) return deferred.resolve(); - Zotero.debug(`Injecting translation scripts into ${frameId} ${tab.url}`); - return Zotero.Connector_Browser.injectScripts(_injectTranslationScripts, tab, frameId) - .then(deferred.resolve).catch(deferred.reject); - }); - return deferred.promise; - }; - - this.INJECTION_TIMEOUT = 10000; - - /** - * Injects custom scripts - * - * @param scripts {Object[]} array of scripts to inject - * @param tab {Object} - * @param [frameId=0] {Number] Defaults to top frame - * @returns {Promise} A promise that resolves when all scripts have been injected - */ - this.injectScripts = async function(scripts, tab, frameId = 0) { - function* injectScripts() { - if (!Array.isArray(scripts)) scripts = [scripts]; - // Make sure we're not changing the original list - scripts = Array.from(scripts); - Zotero.debug(`Inject: Injecting scripts into ${frameId} - ${tab.url} : ${scripts.join(', ')}`); - - for (let script of scripts) { - // Firefox returns an error for unstructured data being returned from scripts - // We are forced to catch these, even though when sometimes they may be legit errors - yield browser.tabs.executeScript(tab.id, { - file: script, - frameId, - runAt: 'document_end' - }) - .catch((e) => console.log("Error while loading % s: % o ", script, e)); - } - - // Send a ready message to confirm successful injection - let readyMsg = `ready${Date.now()}`; - yield browser.tabs.executeScript(tab.id, { - code: `browser.runtime.onMessage.addListener(function awaitReady(request) { - if (request == '${readyMsg}') { - browser.runtime.onMessage.removeListener(awaitReady); - return Promise.resolve(true); - } - })`, - frameId, - runAt: 'document_end' - }); - - while (true) { - try { - var response = yield browser.tabs.sendMessage(tab.id, readyMsg, { - frameId: frameId - }); - } catch (e) {} - if (!response) { - yield Zotero.Promise.delay(100); - } else { - Zotero.debug(`Inject: Complete ${frameId} - ${tab.url}`); - return true; - } - } - } - var timedOut = Zotero.Promise.defer(); - let timeout = setTimeout(function() { - timedOut.reject(new Error(`Inject: Timed out ${frameId} - ${tab.url} after ${this.INJECTION_TIMEOUT}ms`)) - }.bind(this), this.INJECTION_TIMEOUT); - - // Prevent triggering multiple times - let deferred = _tabInfo[tab.id].injections[frameId]; - if (deferred) { - Zotero.debug(`Inject: Script injection already in progress for ${frameId} - ${tab.url}`); - await deferred.promise; - } - deferred = Zotero.Promise.defer(); - _tabInfo[tab.id].injections[frameId] = deferred; - - function tabRemovedListener(tabID) { - if (tabID != tab.id) return; - deferred.reject(new Error(`Inject: Tab removed mid-injection into ${frameId} - ${tab.url}`)) - } - browser.tabs.onRemoved.addListener(tabRemovedListener); - - // This is a bit complex, but we need to cut off script injection as soon as we notice an - // interruption condition, such as a timeout or url change, otherwise we get partial injections - try { - var iter = injectScripts(); - var val = iter.next(); - while (true) { - if (val.done) { - return val.value; - } - if (val.value.then) { - // Will either throw from the first two, or return from the third one - let nextVal = await Promise.race([ - timedOut.promise, - deferred.promise, - val.value - ]); - val = iter.next(nextVal); - } else { - val = iter.next(val.value); - } - } - } finally { - browser.tabs.onRemoved.removeListener(tabRemovedListener); - deferred.resolve(); - delete _tabInfo[tab.id].injections[frameId]; - clearTimeout(timeout); - } - }; - - this.injectSingleFile = async function(tab, frameId) { - Zotero.debug("SingleFile: injecting SingleFile into page"); - await extension.injectScript(tab.id, Zotero.SingleFile.CONFIG); - // Also insert the config object - await this.injectScripts('singlefile-config.js', tab, frameId); - }; - - this.openWindow = async function(url, options = {}, tab = null) { - if (!tab) { - tab = (await browser.tabs.query({ - active: true - }))[0]; - } - options = Object.assign({ - width: 800, - height: 600, - type: "popup" - }, options); - let win = await browser.windows.get(tab.windowId, null); - options.left = Math.floor(win.left + (win.width / 2) - (options.width / 2)); - options.top = Math.floor(win.top + (win.height / 2) - (options.height / 2)); - - win = await browser.windows.create({ - url, - type: options.type, - width: options.width, - height: options.height, - left: options.left, - top: options.top - }); - - // Fix positioning in Chrome when window is on second monitor - // https://bugs.chromium.org/p/chromium/issues/detail?id=137681 - if (Zotero.isBrowserExt && win.left < options.left) { - browser.windows.update(win.id, { - left: options.left - }); - } - // Fix a Firefox bug where content does not appear before resize on linux - // https://bugzilla.mozilla.org/show_bug.cgi?id=1402110 - // this one might actually get fixed, unlike the one above - if (Zotero.isFirefox) { - await Zotero.Promise.delay(1000); - browser.windows.update(win.id, { - width: win.width + 1 - }); - } - if (typeof options.onClose == 'function') { - browser.windows.onRemoved.addListener(function onClose(id) { - if (id == win.id) options.onClose(); - browser.windows.onRemoved.removeListener(onClose); - }); - } - return win; - }; - - this.bringToFront = async function(drawAttention = false, tab) { - var windowId; - if (tab && tab.windowId) { - windowId = tab.windowId; - } else { - let win = await browser.windows.getLastFocused(); - windowId = win.id; - } - browser.windows.update(windowId, { - drawAttention, - focused: true - }); - } - - this.openTab = function(url, tab) { - if (tab) { - let tabProps = { - index: tab.index + 1 - }; - // Firefox doesn't support openerTabId - if (!Zotero.isFirefox) { - tabProps.openerTabId = tab.id; - } - browser.tabs.create(Object.assign({ - url - }, tabProps)); - } else { - browser.tabs.query({ - active: true, - lastFocusedWindow: true - }).then((tabs) => this.openTab(url, tabs[0])); - } - }; - - this.openPreferences = function(paneID, tab) { - this.openTab(browser.runtime.getURL(`preferences/preferences.html#${paneID}`), tab); - }; - - this.openConfigEditor = function(tab) { - this.openTab(browser.runtime.getURL(`preferences/config.html`), tab); - }; - - /** - * Display an old-school firefox notification by injecting HTML directly into DOM. - * This has a side-effect of navigation (user-initiated or JS-redirect-based) - * removing the notification so we keep on re-injecting it into DOM. - * - * The timeout argument specifies how long the notification has to be displayed for - * without navigation, before it is considered "seen" and further navigation on the tab - * will not make it re-appear. - * - * @param {String} text - * @param {String[]} buttons - labels for buttons - * @param {Number} [seenTimeout=5000] - * @param {Tab} [tab=currentTab] - * @returns {Promise{Number}} button pressed idx or undefined if timed-out and navigated away from - */ - this.notify = async function(text, buttons, seenTimeout = 5000, tab = null) { - // Get current tab if not provided - if (!tab) { - return browser.tabs.query({ - active: true, - lastFocusedWindow: true - }) - .then((tabs) => this.notify(text, buttons, seenTimeout, tabs[0])); - } else if (typeof tab === 'number') { - return browser.tabs.get(tab).then((tab) => this.notify(text, buttons, seenTimeout, tab)); - } - let timedOut = false; - seenTimeout && setTimeout(() => timedOut = true, seenTimeout); - var response = await Zotero.Messaging.sendMessage('notify', [text, buttons, null, tab.status], tab) - if (response != undefined || timedOut) return response; - - // Tab url changed or tab got removed, hence the undefined response - // Wait half a sec to not run a busy-waiting loop - await Zotero.Promise.delay(500) - var tab = await browser.tabs.get(tab.id) - if (!tab) return; - // If it still exists try again - return this.notify(text, buttons, seenTimeout, tab); - }; - - /** - * Update status and tooltip of Zotero button - */ - this._updateExtensionUI = function(tab) { - if (!tab) { - return chrome.tabs.query({ - lastFocusedWindow: true, - active: true - }, - (tabs) => tabs.length && this._updateExtensionUI(tabs[0])); - } - if (Zotero.Prefs.get('firstUse')) return _showFirstUseUI(tab); - if (!tab.active) return; - browser.contextMenus.removeAll(); - - if (_isDisabledForURL(tab.url, true)) { - _showZoteroStatus(); - return; - } else { - _enableForTab(tab.id); - } - - var isPDF = _tabInfo[tab.id] && _tabInfo[tab.id].isPDF; - var translators = _tabInfo[tab.id] && _tabInfo[tab.id].translators; - - // Show the save menu if we have more than one save option to show, which is true in all cases - // other than for PDFs with no translator - var showSaveMenu = (translators && translators.length) || !isPDF; - var showProxyMenu = !isPDF && - Zotero.Proxies.proxies.length > 0 - // Don't show proxy menu if already proxied - && - !Zotero.Proxies.proxyToProper(tab.url, true); - - var saveMenuID; - if (showSaveMenu) { - saveMenuID = "zotero-context-menu-save-menu"; - browser.contextMenus.create({ - id: saveMenuID, - title: `${Zotero.getString('general_saveTo', 'Zotero')}`, - contexts: ['all'] - }); - } - - if (translators && translators.length) { - _showTranslatorIcon(tab, translators[0]); - _showTranslatorContextMenuItem(translators, saveMenuID); - _showNoteContextMenuItems(translators, saveMenuID); - } else if (isPDF) { - Zotero.Connector_Browser._showPDFIcon(tab); - } else { - _showWebpageIcon(tab); - } - - if (isPDF) { - _showPDFContextMenuItem(saveMenuID); - } else { - _showWebpageContextMenuItem(saveMenuID); - } - - // If unproxied, show "Reload via Proxy" options - if (showProxyMenu) { - _showProxyContextMenuItems(tab.url); - } - - if (Zotero.isFirefox) { - _showPreferencesContextMenuItem(); - } - } - - function _showFirstUseUI(tab) { - var icon = `${Zotero.platform}/zotero-z-${window.devicePixelRatio > 1 ? 32 : 16}px-australis.png`; - browser.browserAction.setIcon({ - tabId: tab.id, - path: `images/${icon}` - }); - browser.browserAction.setTitle({ - tabId: tab.id, - title: "Zotero Connector" - }); - browser.browserAction.enable(tab.id); - } - - /** - * Removes information about a specific tab - */ - function _clearInfoForTab(tabID, changeInfo) { - if (tabID in _tabInfo) { - _tabInfo[tabID].frameChecked = false; - } - if (changeInfo && !changeInfo.url) return; - delete _tabInfo[tabID]; - } - - function _updateInfoForTab(tabId, url) { - if ((tabId in _tabInfo) && _tabInfo[tabId].url != url) { - Zotero.debug(`Connector_Browser: URL changed from ${_tabInfo[tabId].url} to ${url}`); - if (_tabInfo[tabId].injections) { - for (let frameId in _tabInfo[tabId].injections) { - _tabInfo[tabId].injections[frameId].reject(new Error(`URL changed for tab ${url}`)); - } - } - } - _tabInfo[tabId] = { - url: url, - injections: {} - } - } - - function _isDisabledForURL(url, excludeTests = false) { - return url.startsWith('chrome://') || - url.startsWith('about:') || - (url.startsWith(browser.runtime.getURL('')) && (!excludeTests || !url.includes('/test/data/'))); - } - - function _showZoteroStatus(tabID) { - Zotero.Connector.checkIsOnline().then(function(isOnline) { - var icon, title; - if (isOnline) { - icon = "images/zotero-new-z-16px.png"; - title = "Zotero is Online"; - } else { - icon = "images/zotero-z-16px-offline.png"; - title = "Zotero is Offline"; - } - browser.browserAction.setIcon({ - tabId: tabID, - path: icon - }); - - browser.browserAction.setTitle({ - tabId: tabID, - title: title - }); - }); - browser.browserAction.disable(tabID); - browser.contextMenus.removeAll(); - } - - function _enableForTab(tabID) { - browser.browserAction.enable(tabID); - } - - function _showTranslatorIcon(tab, translator) { - var itemType = translator.itemType; - - browser.browserAction.setIcon({ - tabId: tab.id, - path: (itemType === "multiple" ? - "images/treesource-collection.png" : - Zotero.ItemTypes.getImageSrc(itemType)) - }); - - browser.browserAction.setTitle({ - tabId: tab.id, - title: _getTranslatorLabel(translator) - }); - } - - function _showWebpageIcon(tab) { - browser.browserAction.setIcon({ - tabId: tab.id, - path: Zotero.ItemTypes.getImageSrc("webpage-gray") - }); - let withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - let title = `Save to Zotero (Web Page ${withSnapshot ? 'with' : 'without'} Snapshot)`; - browser.browserAction.setTitle({ - tabId: tab.id, - title - }); - } - - this._showPDFIcon = function(tab) { - browser.browserAction.setIcon({ - tabId: tab.id, - path: browser.runtime.getURL('images/pdf.png') - }); - browser.browserAction.setTitle({ - tabId: tab.id, - title: "Save to Zotero (PDF)" - }); - } - - function _showTranslatorContextMenuItem(translators, parentID) { - for (var i = 0; i < translators.length; i++) { - browser.contextMenus.create({ - id: "zotero-context-menu-translator-save" + i, - title: _getTranslatorLabel(translators[i]), - onclick: (function(i) { - return function(info, tab) { - Zotero.Connector_Browser.saveWithTranslator(tab, i, { - resave: true - }); - }; - })(i), - parentId: parentID, - contexts: ['page', 'browser_action'] - }); - } - } - - function _showNoteContextMenuItems(translators, parentID) { - if (translators[0].itemType == "multiple") return; - browser.contextMenus.create({ - id: "zotero-context-menu-translator-save-with-selection-note", - title: "Create Zotero Item and Note from Selection", - onclick: function(info, tab) { - Zotero.Connector_Browser.saveWithTranslator( - tab, - 0, { - note: '
    ' + info.selectionText + '
    ' - } - ); - }, - parentId: parentID, - contexts: ['selection'] - }); - } - - function _showWebpageContextMenuItem(parentID) { - var fns = []; - fns.push(() => browser.contextMenus.create({ - id: "zotero-context-menu-webpage-withSnapshot-save", - title: "Save to Zotero (Web Page with Snapshot)", - onclick: function(info, tab) { - Zotero.Connector_Browser.saveAsWebpage(tab, 0, { - snapshot: true - }); - }, - parentId: parentID, - contexts: ['page', 'browser_action'] - })); - fns.push(() => browser.contextMenus.create({ - id: "zotero-context-menu-webpage-withoutSnapshot-save", - title: "Save to Zotero (Web Page without Snapshot)", - onclick: function(info, tab) { - Zotero.Connector_Browser.saveAsWebpage(tab, 0); - }, - parentId: parentID, - contexts: ['page', 'browser_action'] - })); - // Swap order if automatic snapshots disabled - let withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - if (!withSnapshot) { - fns = [fns[1], fns[0]]; - } - fns.forEach((fn) => fn()); - } - - function _showPDFContextMenuItem(parentID) { - browser.contextMenus.create({ - id: "zotero-context-menu-pdf-save", - title: "Save to Zotero (PDF)", - onclick: function(info, tab) { - Zotero.Connector_Browser.saveAsWebpage(tab); - }, - parentId: parentID, - contexts: ['all'] - }); - } - - function _showProxyContextMenuItems(url) { - var parentID = "zotero-context-menu-proxy-reload-menu"; - browser.contextMenus.create({ - id: parentID, - title: "Reload via Proxy", - contexts: ['page', 'browser_action'] - }); - - var i = 0; - for (let proxy of Zotero.Proxies.proxies) { - let name = proxy.toDisplayName(); - let proxied = proxy.toProxy(url); - browser.contextMenus.create({ - id: `zotero-context-menu-proxy-reload-${i++}`, - title: `Reload via ${name}`, - onclick: function() { - browser.tabs.update({ - url: proxied - }); - }, - parentId: parentID, - contexts: ['page', 'browser_action'] - }); - } - } - - function _showPreferencesContextMenuItem() { - browser.contextMenus.create({ - type: "separator", - id: "zotero-context-menu-pref-separator", - contexts: ['all'] - }); - browser.contextMenus.create({ - id: "zotero-context-menu-preferences", - title: "Preferences", - onclick: function() { - browser.tabs.create({ - url: browser.runtime.getURL('preferences/preferences.html') - }); - }, - contexts: ['all'] - }); - } - - function _browserAction(tab) { - if (Zotero.Prefs.get('firstUse')) { - Zotero.Messaging.sendMessage("firstUse", null, tab) - .then(function() { - Zotero.Prefs.set('firstUse', false); - Zotero.Connector_Browser._updateExtensionUI(tab); - }); - } else if (_tabInfo[tab.id] && _tabInfo[tab.id].translators && _tabInfo[tab.id].translators.length) { - Zotero.Connector_Browser.saveWithTranslator(tab, 0, { - fallbackOnFailure: true - }); - } else { - if (_tabInfo[tab.id] && _tabInfo[tab.id].isPDF) { - Zotero.Connector_Browser.saveAsWebpage( - tab, - _tabInfo[tab.id].frameId, { - snapshot: true - } - ); - } else { - let withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - Zotero.Connector_Browser.saveAsWebpage(tab, 0, { - snapshot: withSnapshot - }); - } - } - } - - /** - * @param tab - * @param i the index of translator to save with - * @param options - * - fallbackOnFailure if translation fails, attempt to save with lower priority translators - * - note add string as a note to the saved item - * @returns {Promise<*>} - */ - this.saveWithTranslator = function(tab, i, options = {}) { - var translator = _tabInfo[tab.id].translators[i]; - - // Set frameId to null - send message to all frames - // There is code to figure out which frame should translate with instanceID. - return Zotero.Messaging.sendMessage( - "translate", - [ - _tabInfo[tab.id].instanceID, - translator.translatorID, - options - ], - tab, - null - ); - } - - this.saveAsWebpage = function(tab, frameId, options) { - if (Zotero.isFirefox && Zotero.browserMajorVersion >= 60 && _tabInfo[tab.id].isPDF) { - return Zotero.Utilities.saveFirefoxPDF(tab, frameId); - } - - if (tab.id != -1) { - return Zotero.Messaging.sendMessage("saveAsWebpage", [tab.title, options], tab, frameId); - } - // Handle right-click on PDF overlay, which exists in a weird non-tab state - else { - browser.tabs.query({ - lastFocusedWindow: true, - active: true - }).then(function(tabs) { - Zotero.Messaging.sendMessage("saveAsWebpage", tabs[0].title, tabs[0]); - }); - } - } - - function _getTranslatorLabel(translator) { - var translatorName = translator.label; - return "Save to Zotero (" + translatorName + ")"; - } - - Zotero.Messaging.addMessageListener("selectDone", function(data) { - _tabInfo[data[0]].selectCallback(data[1]); - }); - - function logListenerErrors(listener) { - return function() { - try { - var returnValue = listener.apply(this, arguments); - if (returnValue && returnValue.then) { - returnValue.catch(function(e) { - Zotero.logError(e); - throw (e); - }); - } - } catch (e) { - Zotero.logError(e); - throw e; - } - } - } - - /* - CHANGED: Uncommented the following, we have our own tab handling code - - async function onNavigation(details, historyChange=false) { - // Ignore developer tools, item selector - if (details.tabId < 0 || _isDisabledForURL(details.url, true) - || details.url.indexOf(browser.runtime.getURL("itemSelector/itemSelector.html")) === 0) return; - - // Don't process again if URL hasn't changed - if (_tabInfo[details.tabId] && _tabInfo[details.tabId].url == details.url) { - return Zotero.Connector_Browser._updateExtensionUI(tab); - } - - if (details.frameId == 0) { - _updateInfoForTab(details.tabId, details.url); - // Getting the tab is uber slow in Firefox. Since _updateInfoForTab() resets the - // object we use to store tab related metadata, it needs to fire ASAP, so that other hooks - // such as those from webNavigation events can update the metadata, without it being overwritten - var tab = await browser.tabs.get(details.tabId); - Zotero.Connector_Browser._updateExtensionUI(tab); - Zotero.Connector.reportActiveURL(tab.url); - } - if (!tab) { - var tab = await browser.tabs.get(details.tabId); - } - // _updateInfoForTab will reject pending injections, but we need to make sure this - // executes in the next event loop such that the rejections can be processed - await Zotero.Promise.delay(1); - await Zotero.Connector_Browser.onFrameLoaded(tab, details.frameId, details.url); - if (historyChange && details.frameId === 0) { - Zotero.Messaging.sendMessage('historyChanged'); - } - } - - browser.browserAction.onClicked.addListener(logListenerErrors(_browserAction)); - - browser.tabs.onRemoved.addListener(logListenerErrors(_clearInfoForTab)); - - browser.tabs.onActivated.addListener(logListenerErrors(async function(details) { - // Chrome 91 has started throwing - // "Tabs cannot be edited right now (user may be dragging a tab)." - // when attempting to retrieve the tab on event here when user is clicking on a tab - // Follow https://bugs.chromium.org/p/chromium/issues/detail?id=1213925 - // for progress. - let attemptsLeft = 10; - while (!tab && attemptsLeft > 0) { - try { - var tab = await browser.tabs.get(details.tabId); - } - catch (e) { - attemptsLeft--; - await Zotero.Promise.delay(100 * (10 - attemptsLeft)); - } - } - // Ignore item selector - if (tab.url.indexOf(browser.runtime.getURL("itemSelector/itemSelector.html")) === 0) return; - Zotero.debug("Connector_Browser: onActivated for " + tab.url); - Zotero.Connector_Browser.onTabActivated(tab); - Zotero.Connector.reportActiveURL(tab.url); - })); - - browser.webNavigation.onCommitted.addListener(logListenerErrors(onNavigation)); - browser.webNavigation.onHistoryStateUpdated.addListener(details => logListenerErrors(onNavigation(details, true))); - */ -} - -// CHANGED: Don't call init method of Zotero (because ??) -// CHANGED: But at least pretend we did -//Zotero.initGlobal(); -Zotero.initDeferred.resolve(); \ No newline at end of file diff --git a/external-scripts/cachedTypes.js b/external-scripts/cachedTypes.js deleted file mode 100644 index e079fa59..00000000 --- a/external-scripts/cachedTypes.js +++ /dev/null @@ -1,201 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Emulates very small parts of cachedTypes.js and itemFields.js APIs for use with connector - */ - -/** - * @namespace - */ -Zotero.Connector_Types = new function() { - var TypeSchema = ZOTERO_TYPE_SCHEMA; - /** - * Initializes types - * @param {Object} typeSchema typeSchema generated by Zotero.Connector.GetData#_generateTypeSchema - */ - this.init = function() { - const schemaTypes = ["itemTypes", "creatorTypes", "fields"]; - - // attach IDs and make referenceable by either ID or name - for (var i = 0; i < schemaTypes.length; i++) { - var schemaType = schemaTypes[i]; - this[schemaType] = Zotero.Utilities.deepCopy(TypeSchema[schemaType]); - for (var id in TypeSchema[schemaType]) { - var entry = this[schemaType][id]; - entry.unshift(parseInt(id, 10)); - this[schemaType][entry[1] /* name */ ] = entry; - } - } - - var itemTypes = Zotero.Connector_Types["itemTypes"]; - var creatorTypes = Zotero.Connector_Types["creatorTypes"]; - var fields = Zotero.Connector_Types["fields"]; - - Zotero.CachedTypes = function() { - var thisType = Zotero.Connector_Types[this.schemaType]; - - this.getID = function(idOrName) { - var type = thisType[idOrName]; - return (type ? type[0] /* id */ : false); - }; - - this.getName = function(idOrName) { - var type = thisType[idOrName]; - return (type ? type[1] /* name */ : false); - }; - - this.getLocalizedString = function(idOrName) { - var type = thisType[idOrName]; - return (type ? type[2] /* localizedString */ : false); - }; - } - - Zotero.ItemTypes = new function() { - this.schemaType = "itemTypes"; - Zotero.CachedTypes.call(this); - - this.getImageSrc = function(idOrName) { - var itemType = Zotero.Connector_Types["itemTypes"][idOrName]; - var icon = itemType ? itemType[6] /* icon */ : "treeitem-" + idOrName + ".png"; - - if (Zotero.isBookmarklet) { - return ZOTERO_CONFIG.BOOKMARKLET_URL + "images/" + icon; - } else if (Zotero.isBrowserExt) { - return browser.runtime.getURL("images/" + icon); - } else if (Zotero.isSafari) { - if (typeof safari == "undefined") { - return "images/" + icon; - } else { - return `${safari.extension.baseURI}safari/` + "images/" + icon; - } - } - }; - } - - Zotero.CreatorTypes = new function() { - this.schemaType = "creatorTypes"; - Zotero.CachedTypes.call(this); - - this.getTypesForItemType = function(idOrName) { - var itemType = itemTypes[idOrName]; - if (!itemType) return false; - - var itemCreatorTypes = itemType[3]; // creatorTypes - if (!itemCreatorTypes - // TEMP: 'note' and 'attachment' have an array containing false - || - (itemCreatorTypes.length == 1 && !itemCreatorTypes[0])) { - return []; - } - var n = itemCreatorTypes.length; - var outputTypes = new Array(n); - - for (var i = 0; i < n; i++) { - var creatorType = creatorTypes[itemCreatorTypes[i]]; - outputTypes[i] = { - "id": creatorType[0] /* id */ , - "name": creatorType[1] /* name */ - }; - } - return outputTypes; - }; - - this.getPrimaryIDForType = function(idOrName) { - var itemType = itemTypes[idOrName]; - if (!itemType) return false; - return itemType[3] /* creatorTypes */ [0]; - }; - - this.isValidForItemType = function(creatorTypeID, itemTypeID) { - let itemType = itemTypes[itemTypeID]; - return itemType[3] /* creatorTypes */ .includes(creatorTypeID); - }; - }; - - Zotero.ItemFields = new function() { - this.schemaType = "fields"; - Zotero.CachedTypes.call(this); - - this.isValidForType = function(fieldIdOrName, typeIdOrName) { - var field = fields[fieldIdOrName], - itemType = itemTypes[typeIdOrName]; - - // mimics itemFields.js - if (!field || !itemType) return false; - - /* fields */ - /* id */ - return itemType[4].indexOf(field[0]) !== -1; - }; - - this.isBaseField = function(fieldID) { - return fields[fieldID][2]; - }; - - this.getFieldIDFromTypeAndBase = function(typeIdOrName, fieldIdOrName) { - var baseField = fields[fieldIdOrName], - itemType = itemTypes[typeIdOrName]; - - if (!baseField || !itemType) return false; - - // get as ID - baseField = baseField[0] /* id */ ; - - // loop through base fields for item type - var baseFields = itemType[5]; - for (var i in baseFields) { - if (baseFields[i] === baseField) { - return i; - } - } - - return false; - }; - - this.getBaseIDFromTypeAndField = function(typeIdOrName, fieldIdOrName) { - var field = fields[fieldIdOrName], - itemType = itemTypes[typeIdOrName]; - if (!field || !itemType) { - throw new Error("Invalid field or type ID"); - } - - var baseField = itemType[5] /* baseFields */ [field[0] /* id */ ]; - return baseField ? baseField : false; - }; - - this.getItemTypeFields = function(typeIdOrName) { - return itemTypes[typeIdOrName][4] /* fields */ .slice(); - }; - } - }; - - /** - * Passes schema to a callback - */ - this.getSchema = async function() { - return TypeSchema; - }; -} \ No newline at end of file diff --git a/external-scripts/connectorTypeSchemaData.js b/external-scripts/connectorTypeSchemaData.js deleted file mode 100644 index f27056ba..00000000 --- a/external-scripts/connectorTypeSchemaData.js +++ /dev/null @@ -1,331 +0,0 @@ -Zotero.Connector_Types.schema = { - "itemTypes": { - "1": ["note", "Note", [false], - [], {}, "treeitem-note.png" - ], - "2": ["book", "Book", [1, 2, 3, 5, 4], - [110, 90, 3, 30, 4, 45, 6, 7, 8, 14, 118, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-book.png" - ], - "3": ["bookSection", "Book Section", [1, 29, 2, 3, 5, 4], - [110, 90, 115, 3, 30, 4, 45, 6, 7, 8, 14, 10, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "115": 12 - }, "treeitem-bookSection.png" - ], - "4": ["journalArticle", "Journal Article", [1, 2, 3, 27, 4], - [110, 90, 12, 4, 5, 10, 14, 3, 28, 29, 25, 87, 26, 13, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-journalArticle.png" - ], - "5": ["magazineArticle", "Magazine Article", [1, 2, 27, 4], - [110, 90, 12, 4, 5, 14, 10, 87, 13, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-magazineArticle.png" - ], - "6": ["newspaperArticle", "Newspaper Article", [1, 2, 27, 4], - [110, 90, 12, 7, 6, 14, 15, 10, 87, 116, 13, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-newspaperArticle.png" - ], - "7": ["thesis", "Thesis", [1, 2], - [110, 90, 69, 89, 7, 14, 118, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "69": 108, - "89": 8 - }, "treeitem-thesis.png" - ], - "8": ["letter", "Letter", [1, 2, 16], - [110, 90, 65, 14, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "65": 108 - }, "treeitem-letter.png" - ], - "9": ["manuscript", "Manuscript", [1, 2, 4], - [110, 90, 66, 7, 14, 118, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "66": 108 - }, "treeitem-manuscript.png" - ], - "10": ["interview", "Interview", [6, 2, 7, 4], - [110, 90, 14, 64, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "64": 109 - }, "treeitem-interview.png" - ], - "11": ["film", "Film", [8, 2, 10, 9], - [110, 90, 21, 14, 122, 63, 77, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "21": 8, - "63": 109, - "122": 108 - }, "treeitem-film.png" - ], - "12": ["artwork", "Artwork", [22, 2], - [110, 90, 59, 61, 14, 87, 116, 123, 19, 62, 18, 1, 27, 2, 22], { - "59": 109 - }, "treeitem-artwork.png" - ], - "13": ["webpage", "Web Page", [1, 2, 4], - [110, 90, 91, 70, 14, 116, 1, 27, 87, 2, 22], { - "70": 108, - "91": 12 - }, "treeitem-webpage.png" - ], - "14": ["attachment", "Attachment", [false], - [110, 27, 1], {}, "treeitem.png" - ], - "15": ["report", "Report", [1, 2, 5, 4], - [110, 90, 92, 32, 28, 7, 31, 14, 10, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "31": 8, - "32": 108, - "92": 60 - }, "treeitem-report.png" - ], - "16": ["bill", "Bill", [12, 2, 28], - [110, 90, 93, 36, 94, 15, 95, 41, 40, 42, 14, 87, 1, 27, 116, 2, 22], { - "93": 60, - "94": 4, - "95": 10 - }, "treeitem-bill.png" - ], - "17": ["case", "Case", [1, 2, 13], - [111, 90, 44, 96, 117, 43, 97, 98, 42, 87, 116, 1, 27, 2, 22], { - "96": 14, - "97": 4, - "98": 10, - "111": 110, - "117": 60 - }, "treeitem-case.png" - ], - "18": ["hearing", "Hearing", [2], - [110, 90, 46, 7, 8, 45, 99, 10, 41, 40, 42, 14, 87, 116, 1, 27, 2, 22], { - "99": 60 - }, "treeitem-hearing.png" - ], - "19": ["patent", "Patent", [14, 15, 2], - [110, 90, 7, 102, 48, 120, 50, 121, 10, 103, 51, 52, 53, 54, 87, 116, 1, 27, 2, 22], { - "50": 60, - "52": 14 - }, "treeitem-patent.png" - ], - "20": ["statute", "Statute", [1, 2], - [112, 90, 36, 55, 101, 100, 10, 15, 40, 42, 87, 116, 1, 27, 2, 22], { - "100": 14, - "101": 60, - "112": 110 - }, "treeitem-statute.png" - ], - "21": ["email", "E-mail", [1, 2, 16], - [113, 90, 14, 116, 1, 27, 87, 2, 22], { - "113": 110 - }, "treeitem-email.png" - ], - "22": ["map", "Map", [20, 2, 5], - [110, 90, 67, 68, 28, 6, 7, 8, 14, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "67": 108 - }, "treeitem-map.png" - ], - "23": ["blogPost", "Blog Post", [1, 23, 2], - [110, 90, 107, 70, 14, 1, 27, 87, 116, 2, 22], { - "70": 108, - "107": 12 - }, "treeitem-blogPost.png" - ], - "24": ["instantMessage", "Instant Message", [1, 2, 16], - [110, 90, 14, 87, 116, 1, 27, 2, 22], {}, "treeitem-instantMessage.png" - ], - "25": ["forumPost", "Forum Post", [1, 2], - [110, 90, 104, 79, 14, 87, 116, 1, 27, 2, 22], { - "79": 108, - "104": 12 - }, "treeitem-forumPost.png" - ], - "26": ["audioRecording", "Audio Recording", [17, 18, 2, 19], - [110, 90, 71, 28, 4, 45, 7, 72, 14, 77, 87, 11, 116, 123, 19, 62, 18, 1, 27, 2, 22], { - "71": 109, - "72": 8 - }, "treeitem-audioRecording.png" - ], - "27": ["presentation", "Presentation", [24, 2], - [110, 90, 74, 14, 7, 75, 1, 27, 87, 116, 2, 22], { - "74": 108 - }, "treeitem-presentation.png" - ], - "28": ["videoRecording", "Video Recording", [8, 11, 2, 10, 9], - [110, 90, 63, 28, 4, 45, 7, 76, 14, 77, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "63": 109, - "76": 8 - }, "treeitem-videoRecording.png" - ], - "29": ["tvBroadcast", "TV Broadcast", [8, 11, 2, 25, 10, 9], - [110, 90, 119, 105, 63, 7, 78, 14, 77, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "63": 109, - "78": 8, - "105": 60, - "119": 12 - }, "treeitem-tvBroadcast.png" - ], - "30": ["radioBroadcast", "Radio Broadcast", [8, 11, 2, 25, 10, 9], - [110, 90, 119, 105, 71, 7, 78, 14, 77, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "71": 109, - "78": 8, - "105": 60, - "119": 12 - }, "treeitem-radioBroadcast.png" - ], - "31": ["podcast", "Podcast", [26, 2, 25], - [110, 90, 28, 105, 80, 77, 1, 27, 87, 116, 2, 22], { - "80": 109, - "105": 60 - }, "treeitem-podcast.png" - ], - "32": ["computerProgram", "Computer Program", [21, 2], - [110, 90, 28, 81, 14, 82, 7, 83, 88, 11, 116, 1, 2, 123, 19, 62, 18, 27, 22], { - "83": 8 - }, "treeitem-computerProgram.png" - ], - "33": ["conferencePaper", "Conference Paper", [1, 2, 3, 5, 4], - [110, 90, 14, 114, 84, 7, 8, 4, 10, 3, 87, 26, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "114": 12 - }, "treeitem-conferencePaper.png" - ], - "34": ["document", "Document", [1, 2, 3, 27, 4], - [110, 90, 8, 14, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem.png" - ], - "35": ["encyclopediaArticle", "Encyclopedia Article", [1, 2, 3, 5, 4], - [110, 90, 85, 3, 30, 4, 45, 6, 7, 8, 14, 10, 11, 116, 1, 27, 87, 123, 19, 62, 18, 2, 22], { - "85": 12 - }, "treeitem-encyclopediaArticle.png" - ], - "36": ["dictionaryEntry", "Dictionary Entry", [1, 2, 3, 5, 4], - [110, 90, 86, 3, 30, 4, 45, 6, 7, 8, 14, 10, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "86": 12 - }, "treeitem-dictionaryEntry.png" - ] - }, - "creatorTypes": { - "1": ["author", "Author"], - "2": ["contributor", "Contributor"], - "3": ["editor", "Editor"], - "4": ["translator", "Translator"], - "5": ["seriesEditor", "Series Editor"], - "6": ["interviewee", "Interview With"], - "7": ["interviewer", "Interviewer"], - "8": ["director", "Director"], - "9": ["scriptwriter", "Scriptwriter"], - "10": ["producer", "Producer"], - "11": ["castMember", "Cast Member"], - "12": ["sponsor", "Sponsor"], - "13": ["counsel", "Counsel"], - "14": ["inventor", "Inventor"], - "15": ["attorneyAgent", "Attorney/Agent"], - "16": ["recipient", "Recipient"], - "17": ["performer", "Performer"], - "18": ["composer", "Composer"], - "19": ["wordsBy", "Words By"], - "20": ["cartographer", "Cartographer"], - "21": ["programmer", "Programmer"], - "22": ["artist", "Artist"], - "23": ["commenter", "Commenter"], - "24": ["presenter", "Presenter"], - "25": ["guest", "Guest"], - "26": ["podcaster", "Podcaster"], - "27": ["reviewedAuthor", "Reviewed Author"], - "28": ["cosponsor", "Cosponsor"], - "29": ["bookAuthor", "Book Author"] - }, - "fields": { - "1": ["url", "url", true], - "2": ["rights", "rights", true], - "3": ["series", "series", true], - "4": ["volume", "volume", true], - "5": ["issue", "issue", true], - "6": ["edition", "edition", true], - "7": ["place", "place", true], - "8": ["publisher", "publisher", true], - "10": ["pages", "pages", true], - "11": ["ISBN", "ISBN", true], - "12": ["publicationTitle", "publicationTitle", true], - "13": ["ISSN", "ISSN", true], - "14": ["date", "date", true], - "15": ["section", "section", true], - "18": ["callNumber", "callNumber", true], - "19": ["archiveLocation", "archiveLocation", true], - "21": ["distributor", "distributor", false], - "22": ["extra", "extra", true], - "25": ["journalAbbreviation", "journalAbbreviation", true], - "26": ["DOI", "DOI", true], - "27": ["accessDate", "accessDate", true], - "28": ["seriesTitle", "seriesTitle", true], - "29": ["seriesText", "seriesText", true], - "30": ["seriesNumber", "seriesNumber", true], - "31": ["institution", "institution", false], - "32": ["reportType", "reportType", false], - "36": ["code", "code", true], - "40": ["session", "session", true], - "41": ["legislativeBody", "legislativeBody", true], - "42": ["history", "history", true], - "43": ["reporter", "reporter", true], - "44": ["court", "court", true], - "45": ["numberOfVolumes", "numberOfVolumes", true], - "46": ["committee", "committee", true], - "48": ["assignee", "assignee", true], - "50": ["patentNumber", "patentNumber", false], - "51": ["priorityNumbers", "priorityNumbers", true], - "52": ["issueDate", "issueDate", false], - "53": ["references", "references", true], - "54": ["legalStatus", "legalStatus", true], - "55": ["codeNumber", "codeNumber", true], - "59": ["artworkMedium", "artworkMedium", false], - "60": ["number", "number", true], - "61": ["artworkSize", "artworkSize", true], - "62": ["libraryCatalog", "libraryCatalog", true], - "63": ["videoRecordingFormat", "videoRecordingFormat", false], - "64": ["interviewMedium", "interviewMedium", false], - "65": ["letterType", "letterType", false], - "66": ["manuscriptType", "manuscriptType", false], - "67": ["mapType", "mapType", false], - "68": ["scale", "scale", true], - "69": ["thesisType", "thesisType", false], - "70": ["websiteType", "websiteType", false], - "71": ["audioRecordingFormat", "audioRecordingFormat", false], - "72": ["label", "label", false], - "74": ["presentationType", "presentationType", false], - "75": ["meetingName", "meetingName", true], - "76": ["studio", "studio", false], - "77": ["runningTime", "runningTime", true], - "78": ["network", "network", false], - "79": ["postType", "postType", false], - "80": ["audioFileType", "audioFileType", false], - "81": ["versionNumber", "versionNumber", true], - "82": ["system", "system", true], - "83": ["company", "company", false], - "84": ["conferenceName", "conferenceName", true], - "85": ["encyclopediaTitle", "encyclopediaTitle", false], - "86": ["dictionaryTitle", "dictionaryTitle", false], - "87": ["language", "language", true], - "88": ["programmingLanguage", "programmingLanguage", true], - "89": ["university", "university", false], - "90": ["abstractNote", "abstractNote", true], - "91": ["websiteTitle", "websiteTitle", false], - "92": ["reportNumber", "reportNumber", false], - "93": ["billNumber", "billNumber", false], - "94": ["codeVolume", "codeVolume", false], - "95": ["codePages", "codePages", false], - "96": ["dateDecided", "dateDecided", false], - "97": ["reporterVolume", "reporterVolume", false], - "98": ["firstPage", "firstPage", false], - "99": ["documentNumber", "documentNumber", false], - "100": ["dateEnacted", "dateEnacted", false], - "101": ["publicLawNumber", "publicLawNumber", false], - "102": ["country", "country", true], - "103": ["applicationNumber", "applicationNumber", true], - "104": ["forumTitle", "forumTitle", false], - "105": ["episodeNumber", "episodeNumber", false], - "107": ["blogTitle", "blogTitle", false], - "108": ["type", "type", true], - "109": ["medium", "medium", true], - "110": ["title", "title", true], - "111": ["caseName", "caseName", false], - "112": ["nameOfAct", "nameOfAct", false], - "113": ["subject", "subject", false], - "114": ["proceedingsTitle", "proceedingsTitle", false], - "115": ["bookTitle", "bookTitle", false], - "116": ["shortTitle", "shortTitle", true], - "117": ["docketNumber", "docketNumber", false], - "118": ["numPages", "numPages", true], - "119": ["programTitle", "programTitle", false], - "120": ["issuingAuthority", "issuingAuthority", true], - "121": ["filingDate", "filingDate", true], - "122": ["genre", "genre", false], - "123": ["archive", "archive", true] - } -} \ No newline at end of file diff --git a/external-scripts/date.js b/external-scripts/date.js deleted file mode 100644 index 9b5febae..00000000 --- a/external-scripts/date.js +++ /dev/null @@ -1,969 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - - var Utilities_Date = new function() { - this.isSQLDate = isSQLDate; - this.isSQLDateTime = isSQLDateTime; - this.sqlHasYear = sqlHasYear; - this.sqlHasMonth = sqlHasMonth; - this.sqlHasDay = sqlHasDay; - this.getUnixTimestamp = getUnixTimestamp; - this.toUnixTimestamp = toUnixTimestamp; - this.getFileDateString = getFileDateString; - this.getFileTimeString = getFileTimeString; - this.getLocaleDateOrder = getLocaleDateOrder; - - var _localeDateOrder = null; - var _months; - var _monthsWithEnglish; - - /** - * Initializes localized months for strToDate month parsing - * @param dateFormatsJSON {Object} the JSON from resource/dateFormats.json - */ - this.init = function(dateFormatsJSON) { - if ((Zotero.isFx || Zotero.isElectron) && !dateFormatsJSON) { - dateFormatsJSON = Zotero.File.getResource('resource://zotero/schema/dateFormats.json'); - } - if (!dateFormatsJSON) { - throw new Error("Zotero.Date.init() must be called with dateFormats.json"); - } - if (typeof dateFormatsJSON == 'string') { - dateFormatsJSON = JSON.parse(dateFormatsJSON); - } - - var locale = Zotero.locale; - var english = locale.startsWith('en'); - // If no exact match, try first two characters ('de') - if (!dateFormatsJSON[locale]) { - locale = locale.substr(0, 2); - } - // Try first two characters repeated ('de-DE') - if (!dateFormatsJSON[locale]) { - locale = locale + "-" + locale.toUpperCase(); - } - // Look for another locale with same first two characters - if (!dateFormatsJSON[locale]) { - let sameLang = Object.keys(dateFormatsJSON).filter(l => l.startsWith(locale.substr(0, 2))); - if (sameLang.length) { - locale = sameLang[0]; - } - } - // If all else fails, use English - if (!dateFormatsJSON[locale]) { - locale = 'en-US'; - english = true; - } - _months = dateFormatsJSON[locale]; - - // Add English versions if not already added - if (english) { - _monthsWithEnglish = _months; - } else { - _monthsWithEnglish = {}; - for (let key in _months) { - _monthsWithEnglish[key] = _months[key].concat(dateFormatsJSON['en-US'][key]); - } - } - }; - - - /** - * @param {Boolean} [withEnglish = false] - Include English months - * @return {Object} - Object with 'short' and 'long' arrays - */ - this.getMonths = function(withEnglish) { - if (withEnglish) { - if (_monthsWithEnglish) return _monthsWithEnglish; - } else { - if (_months) return _months; - } - - throw new Error("Zotero.Date: Zotero.Date.init() not called with resource/dateFormats.json"); - } - - /** - * Convert an SQL date in the form '2006-06-13 11:03:05' into a JS Date object - * - * Can also accept just the date part (e.g. '2006-06-13') - **/ - this.sqlToDate = function(sqldate, isUTC) { - try { - if (!this.isSQLDate(sqldate) && - !this.isSQLDateTime(sqldate) && - !this.isSQLDateTimeWithoutSeconds(sqldate)) { - throw new Error("Invalid date"); - } - - var datetime = sqldate.split(' '); - var dateparts = datetime[0].split('-'); - if (datetime[1]) { - var timeparts = datetime[1].split(':'); - } else { - timeparts = [false, false, false]; - } - - // Invalid date part - if (dateparts.length == 1) { - throw new Error("Invalid date part"); - } - // Allow missing seconds - if (timeparts.length == 2) { - timeparts[2] = '00'; - } - - if (isUTC) { - return new Date(Date.UTC(dateparts[0], dateparts[1] - 1, dateparts[2], - timeparts[0], timeparts[1], timeparts[2])); - } - - return new Date(dateparts[0], dateparts[1] - 1, dateparts[2], - timeparts[0], timeparts[1], timeparts[2]); - } catch (e) { - Zotero.debug(sqldate + ' is not a valid SQL date', 2) - return false; - } - } - - - /** - * Convert a JS Date object to an SQL date in the form '2006-06-13 11:03:05' - * - * If _toUTC_ is true, creates a UTC date - **/ - this.dateToSQL = function(date, toUTC) { - try { - if (toUTC) { - var year = date.getUTCFullYear(); - var month = date.getUTCMonth(); - var day = date.getUTCDate(); - var hours = date.getUTCHours(); - var minutes = date.getUTCMinutes(); - var seconds = date.getUTCSeconds(); - } else { - var year = date.getFullYear(); - var month = date.getMonth(); - var day = date.getDate(); - var hours = date.getHours(); - var minutes = date.getMinutes(); - var seconds = date.getSeconds(); - } - - year = Zotero.Utilities.lpad(year, '0', 4); - month = Zotero.Utilities.lpad(month + 1, '0', 2); - day = Zotero.Utilities.lpad(day, '0', 2); - hours = Zotero.Utilities.lpad(hours, '0', 2); - minutes = Zotero.Utilities.lpad(minutes, '0', 2); - seconds = Zotero.Utilities.lpad(seconds, '0', 2); - - return year + '-' + month + '-' + day + ' ' + - hours + ':' + minutes + ':' + seconds; - } catch (e) { - Zotero.debug(date + ' is not a valid JS date', 2); - return ''; - } - } - - - /** - * Convert a JS Date object to an ISO 8601 UTC date/time - * - * @param {Date} date JS Date object - * @return {String} ISO 8601 UTC date/time - * e.g. 2008-08-15T20:00:00Z - */ - this.dateToISO = function(date) { - var year = date.getUTCFullYear(); - var month = date.getUTCMonth(); - var day = date.getUTCDate(); - var hours = date.getUTCHours(); - var minutes = date.getUTCMinutes(); - var seconds = date.getUTCSeconds(); - - year = Zotero.Utilities.lpad(year, '0', 4); - month = Zotero.Utilities.lpad(month + 1, '0', 2); - day = Zotero.Utilities.lpad(day, '0', 2); - hours = Zotero.Utilities.lpad(hours, '0', 2); - minutes = Zotero.Utilities.lpad(minutes, '0', 2); - seconds = Zotero.Utilities.lpad(seconds, '0', 2); - - return year + '-' + month + '-' + day + 'T' + - hours + ':' + minutes + ':' + seconds + 'Z'; - } - - - var _re8601 = /^([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/; - - /** - * @return {Boolean} - True if string is an ISO 8601 date, false if not - */ - this.isISODate = function(str) { - return _re8601.test(str); - } - - /** - * Convert an ISO 8601–formatted date/time to a JS Date - * - * @param {String} isoDate ISO 8601 date - * @return {Date|False} - JS Date, or false if not a valid date - */ - this.isoToDate = function(isoDate) { - var d = isoDate.match(_re8601); - if (!d) return false; - return new Date(isoDate); - } - - - this.isoToSQL = function(isoDate) { - return Utilities_Date.dateToSQL(Utilities_Date.isoToDate(isoDate), true); // no 'this' for translator sandbox - } - - - /* - * converts a string to an object containing: - * day: integer form of the day - * month: integer form of the month (indexed from 0, not 1) - * year: 4 digit year (or, year + BC/AD/etc.) - * part: anything that does not fall under any of the above categories - * (e.g., "Summer," etc.) - * - * Note: the returned object is *not* a JS Date object - */ - var _slashRe = /^(.*?)\b([0-9]{1,4})(?:([\-\/\.\u5e74])([0-9]{1,2}))?(?:([\-\/\.\u6708])([0-9]{1,4}))?((?:\b|[^0-9]).*?)$/ - var _yearRe = /^(.*?)\b((?:circa |around |about |c\.? ?)?[0-9]{1,4}(?: ?B\.? ?C\.?(?: ?E\.?)?| ?C\.? ?E\.?| ?A\.? ?D\.?)|[0-9]{3,4})\b(.*?)$/i; - var _monthRe = null; - var _dayRe = null; - - this.strToDate = function(string) { - var date = { - order: '' - }; - - if (typeof string == 'string' || typeof string == 'number') { - string = Zotero.Utilities.trimInternal(string.toString()); - } - - // skip empty things - if (!string) { - return date; - } - - var parts = []; - - // first, directly inspect the string - var m = _slashRe.exec(string); - if (m && - ((!m[5] || !m[3]) || m[3] == m[5] || (m[3] == "\u5e74" && m[5] == "\u6708")) && // require sane separators - ((m[2] && m[4] && m[6]) || (!m[1] && !m[7]))) { // require that either all parts are found, - // or else this is the entire date field - // figure out date based on parts - if (m[2].length == 3 || m[2].length == 4 || m[3] == "\u5e74") { - // ISO 8601 style date (big endian) - date.year = m[2]; - date.month = m[4]; - date.day = m[6]; - date.order += m[2] ? 'y' : ''; - date.order += m[4] ? 'm' : ''; - date.order += m[6] ? 'd' : ''; - } else if (m[2] && !m[4] && m[6]) { - date.month = m[2]; - date.year = m[6]; - date.order += m[2] ? 'm' : ''; - date.order += m[6] ? 'y' : ''; - } else { - // local style date (middle or little endian) - var country = Zotero.locale ? Zotero.locale.substr(3) : "US"; - if (country == "US" || // The United States - country == "FM" || // The Federated States of Micronesia - country == "PW" || // Palau - country == "PH") { // The Philippines - date.month = m[2]; - date.day = m[4]; - date.order += m[2] ? 'm' : ''; - date.order += m[4] ? 'd' : ''; - } else { - date.month = m[4]; - date.day = m[2]; - date.order += m[2] ? 'd' : ''; - date.order += m[4] ? 'm' : ''; - } - date.year = m[6]; - if (m[6] !== undefined) { - date.order += 'y'; - } - } - - var longYear = date.year && date.year.toString().length > 2; - if (date.year) date.year = parseInt(date.year, 10); - if (date.day) date.day = parseInt(date.day, 10); - if (date.month) { - date.month = parseInt(date.month, 10); - - if (date.month > 12) { - // swap day and month - var tmp = date.day; - date.day = date.month - date.month = tmp; - date.order = date.order.replace('m', 'D') - .replace('d', 'M') - .replace('D', 'd') - .replace('M', 'm'); - } - } - - if ((!date.month || date.month <= 12) && (!date.day || date.day <= 31)) { - // Parse pre-100 years with leading zeroes (001, 0001, 012, 0012, 0123, but not 08) - if (date.year && date.year < 100 && !longYear) { - var today = new Date(); - var year = today.getFullYear(); - var twoDigitYear = year % 100; - var century = year - twoDigitYear; - - if (date.year <= twoDigitYear) { - // assume this date is from our century - date.year = century + date.year; - } else { - // assume this date is from the previous century - date.year = century - 100 + date.year; - } - } - - if (date.month) date.month--; // subtract one for JS style - else delete date.month; - - //Zotero.debug("DATE: retrieved with algorithms: "+JSON.stringify(date)); - - parts.push({ - part: m[1], - before: true - }, { - part: m[7] - }); - } else { - // give up; we failed the sanity check - Zotero.debug("DATE: algorithms failed sanity check"); - var date = { - order: '' - }; - parts.push({ - part: string - }); - } - } else { - //Zotero.debug("DATE: could not apply algorithms"); - parts.push({ - part: string - }); - } - - // couldn't find something with the algorithms; use regexp - // YEAR - if (!date.year) { - for (var i in parts) { - var m = _yearRe.exec(parts[i].part); - if (m) { - date.year = m[2]; - date.order = _insertDateOrderPart(date.order, 'y', parts[i]); - parts.splice( - i, 1, { - part: m[1], - before: true - }, { - part: m[3] - } - ); - //Zotero.debug("DATE: got year (" + date.year + ", " + JSON.stringify(parts) + ")"); - break; - } - } - } - - // MONTH - if (date.month === undefined) { - // compile month regular expression - let months = Utilities_Date.getMonths(true); // no 'this' for translator sandbox - months = months.short.map(m => m.toLowerCase()) - .concat(months.long.map(m => m.toLowerCase())); - - if (!_monthRe) { - _monthRe = new RegExp("^(.*)\\b(" + months.join("|") + ")[^ ]*(?: (.*)$|$)", "i"); - } - - for (var i in parts) { - var m = _monthRe.exec(parts[i].part); - if (m) { - // Modulo 12 in case we have multiple languages - date.month = months.indexOf(m[2].toLowerCase()) % 12; - date.order = _insertDateOrderPart(date.order, 'm', parts[i]); - parts.splice( - i, 1, { - part: m[1], - before: "m" - }, { - part: m[3], - after: "m" - } - ); - //Zotero.debug("DATE: got month (" + date.month + ", " + JSON.stringify(parts) + ")"); - break; - } - } - } - - // DAY - if (!date.day) { - // compile day regular expression - if (!_dayRe) { - var daySuffixes = Zotero.isClient ? Zotero.getString("date.daySuffixes").replace(/, ?/g, "|") : ""; - _dayRe = new RegExp("\\b([0-9]{1,2})(?:" + daySuffixes + ")?\\b(.*)", "i"); - } - - for (var i in parts) { - var m = _dayRe.exec(parts[i].part); - if (m) { - var day = parseInt(m[1], 10); - // Sanity check - if (day <= 31) { - date.day = day; - date.order = _insertDateOrderPart(date.order, 'd', parts[i]); - if (m.index > 0) { - var part = parts[i].part.substr(0, m.index); - if (m[2]) { - part += " " + m[2];; - } - } else { - var part = m[2]; - } - parts.splice( - i, 1, { - part: part - } - ); - //Zotero.debug("DATE: got day (" + date.day + ", " + JSON.stringify(parts) + ")"); - break; - } - } - } - } - - // Concatenate date parts - date.part = ''; - for (var i in parts) { - date.part += parts[i].part + ' '; - } - - // clean up date part - if (date.part) { - date.part = date.part.replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g, ""); - } - - if (date.part === "" || date.part == undefined) { - delete date.part; - } - - //make sure year is always a string - if (date.year || date.year === 0) date.year += ''; - - return date; - } - - this.isHTTPDate = function(str) { - var dayNames = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; - var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", - "Oct", "Nov", "Dec" - ]; - str = str.trim(); - var temp = str.split(','); - if (temp.length > 1) { - var dayOfWeek = temp[0]; - if (dayNames.indexOf(dayOfWeek) == -1) { - return false; - } - - str = temp[1].trim(); - } - temp = str.split(' '); - temp = temp.filter((t) => !t.match(/^\s*$/)); - if (temp.length < 5) { - return false; - } - if (!temp[0].trim().match(/[0-3]\d/)) { - return false; - } - if (monthNames.indexOf(temp[1].trim()) == -1) { - return false; - } - if (!temp[2].trim().match(/\d\d\d\d/)) { - return false; - } - temp.splice(0, 3); - var time = temp[0].trim().split(':'); - if (time.length < 2) { - return false; - } - for (let t of time) { - if (!t.match(/\d\d/)) { - return false; - } - } - temp.splice(0, 1); - var zone = temp.join(' ').trim(); - return !!zone.match(/([+-]\d\d\d\d|UTC?|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT)/) - }; - - - function _insertDateOrderPart(dateOrder, part, partOrder) { - if (!dateOrder) { - return part; - } - if (partOrder.before === true) { - return part + dateOrder; - } - if (partOrder.after === true) { - return dateOrder + part; - } - if (partOrder.before) { - var pos = dateOrder.indexOf(partOrder.before); - if (pos == -1) { - return dateOrder; - } - return dateOrder.replace(new RegExp("(" + partOrder.before + ")"), part + '$1'); - } - if (partOrder.after) { - var pos = dateOrder.indexOf(partOrder.after); - if (pos == -1) { - return dateOrder + part; - } - return dateOrder.replace(new RegExp("(" + partOrder.after + ")"), '$1' + part); - } - return dateOrder + part; - } - - - - /** - * does pretty formatting of a date object returned by strToDate() - * - * @param {Object} date A date object, as returned from strToDate() - * @param {Boolean} shortFormat Whether to return a short (12/1/95) date - * @return A formatted date string - * @type String - **/ - this.formatDate = function(date, shortFormat) { - if (shortFormat) { - var localeDateOrder = getLocaleDateOrder(); - var string = localeDateOrder[0] + "/" + localeDateOrder[1] + "/" + localeDateOrder[2]; - return string.replace("y", (date.year !== undefined ? date.year : "00")) - .replace("m", (date.month !== undefined ? 1 + date.month : "0")) - .replace("d", (date.day !== undefined ? date.day : "0")); - } else { - var string = ""; - - if (date.part) { - string += date.part + " "; - } - - var months = Utilities_Date.getMonths().long; // no 'this' for translator sandbox - if (date.month != undefined && months[date.month]) { - // get short month strings from CSL interpreter - string += months[date.month]; - if (date.day) { - string += " " + date.day + ", "; - } else { - string += " "; - } - } - - if (date.year) { - string += date.year; - } - } - - return string; - } - - this.strToISO = function(str) { - var date = this.strToDate(str); - - if (date.year) { - var dateString = Zotero.Utilities.lpad(date.year, "0", 4); - if (parseInt(date.month) == date.month) { - dateString += "-" + Zotero.Utilities.lpad(date.month + 1, "0", 2); - if (date.day) { - dateString += "-" + Zotero.Utilities.lpad(date.day, "0", 2); - } - } - return dateString; - } - return false; - } - - - this.sqlToISO8601 = function(sqlDate) { - var date = sqlDate.substr(0, 10); - var matches = date.match(/^([0-9]{4})\-([0-9]{2})\-([0-9]{2})/); - if (!matches) { - return false; - } - date = matches[1]; - // Drop parts for reduced precision - if (matches[2] !== "00") { - date += "-" + matches[2]; - if (matches[3] !== "00") { - date += "-" + matches[3]; - } - } - var time = sqlDate.substr(11); - // TODO: validate times - if (time) { - date += "T" + time + "Z"; - } - return date; - } - - this.strToMultipart = function(str) { - if (!str) { - return ''; - } - - var parts = this.strToDate(str); - - // FIXME: Until we have a better BCE date solution, - // remove year value if not between 1 and 9999 - if (parts.year) { - var year = parts.year + ''; - if (!year.match(/^[0-9]{1,4}$/)) { - delete parts.year; - } - } - - parts.month = typeof parts.month != "undefined" ? parts.month + 1 : ''; - - var multi = (parts.year ? Zotero.Utilities.lpad(parts.year, '0', 4) : '0000') + '-' + - Zotero.Utilities.lpad(parts.month, '0', 2) + '-' + - (parts.day ? Zotero.Utilities.lpad(parts.day, '0', 2) : '00') + - ' ' + - str; - return multi; - } - - // Regexes for multipart and SQL dates - // Allow zeroes in multipart dates - // TODO: Allow negative multipart in DB and here with \-? - var _multipartRE = /^[0-9]{4}\-(0[0-9]|10|11|12)\-(0[0-9]|[1-2][0-9]|30|31) /; - var _sqldateRE = /^\-?[0-9]{4}\-(0[1-9]|10|11|12)\-(0[1-9]|[1-2][0-9]|30|31)$/; - var _sqldateWithZeroesRE = /^\-?[0-9]{4}\-(0[0-9]|10|11|12)\-(0[0-9]|[1-2][0-9]|30|31)$/; - var _sqldatetimeRE = /^\-?[0-9]{4}\-(0[1-9]|10|11|12)\-(0[1-9]|[1-2][0-9]|30|31) ([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$/; - var _sqlDateTimeWithoutSecondsRE = /^\-?[0-9]{4}\-(0[1-9]|10|11|12)\-(0[1-9]|[1-2][0-9]|30|31) ([0-1][0-9]|[2][0-3]):([0-5][0-9])$/; - - /** - * Tests if a string is a multipart date string - * e.g. '2006-11-03 November 3rd, 2006' - */ - this.isMultipart = function(str) { - if (this.isSQLDateTime(str) || this.isSQLDateTimeWithoutSeconds(str)) { - return false; - } - return _multipartRE.test(str); - } - - - /** - * Returns the SQL part of a multipart date string - * (e.g. '2006-11-03 November 3rd, 2006' returns '2006-11-03') - */ - this.multipartToSQL = function(multi) { - if (!multi) { - return ''; - } - - if (!this.isMultipart(multi)) { - return '0000-00-00'; - } - - return multi.substr(0, 10); - } - - - /** - * Returns the user part of a multipart date string - * (e.g. '2006-11-03 November 3rd, 2006' returns 'November 3rd, 2006') - */ - this.multipartToStr = function(multi) { - if (!multi) { - return ''; - } - - if (!this.isMultipart(multi)) { - return multi; - } - - return multi.substr(11); - } - - - /** - * Convert 'yesterday'/'today'/'tomorrow' to SQL date, or else return original string - * - * @param {String} str - * @return {String} - */ - this.parseDescriptiveString = function(str) { - // Parse 'yesterday'/'today'/'tomorrow' and convert to dates, - // since it doesn't make sense for those to be actual metadata values - var lc = str.toLowerCase().trim(); - if (lc == 'yesterday' || lc == Zotero.getString('date.yesterday')) { - str = Utilities_Date.dateToSQL(new Date(new Date().getTime() - 86400000)).substr(0, 10); - } else if (lc == 'today' || lc == Zotero.getString('date.today')) { - str = Utilities_Date.dateToSQL(new Date()).substr(0, 10); - } else if (lc == 'tomorrow' || lc == Zotero.getString('date.tomorrow')) { - str = Utilities_Date.dateToSQL(new Date(new Date().getTime() + 86400000)).substr(0, 10); - } - return str; - }; - - - function isSQLDate(str, allowZeroes) { - if (allowZeroes) { - return _sqldateWithZeroesRE.test(str); - } - return _sqldateRE.test(str); - } - - - function isSQLDateTime(str) { - return _sqldatetimeRE.test(str); - } - - - this.isSQLDateTimeWithoutSeconds = function(str) { - return _sqlDateTimeWithoutSecondsRE.test(str); - } - - - function sqlHasYear(sqldate) { - return isSQLDate(sqldate, true) && sqldate.substr(0, 4) != '0000'; - } - - - function sqlHasMonth(sqldate) { - return isSQLDate(sqldate, true) && sqldate.substr(5, 2) != '00'; - } - - - function sqlHasDay(sqldate) { - return isSQLDate(sqldate, true) && sqldate.substr(8, 2) != '00'; - } - - - function getUnixTimestamp() { - return Math.round(Date.now() / 1000); - } - - - function toUnixTimestamp(date) { - if (date === null || typeof date != 'object' || - date.constructor.name != 'Date') { - throw new Error(`'${date}' is not a valid date`); - } - return Math.round(date.getTime() / 1000); - } - - - /** - * Convert a JS Date to a relative date (e.g., "5 minutes ago") - * - * Adapted from http://snipplr.com/view/10290/javascript-parse-relative-date/ - * - * @param {Date} date - * @return {String} - */ - this.toRelativeDate = function(date) { - var str; - var now = new Date(); - var timeSince = now.getTime() - date; - var inSeconds = timeSince / 1000; - var inMinutes = timeSince / 1000 / 60; - var inHours = timeSince / 1000 / 60 / 60; - var inDays = timeSince / 1000 / 60 / 60 / 24; - var inYears = timeSince / 1000 / 60 / 60 / 24 / 365; - - var n; - - // in seconds - if (Math.round(inSeconds) == 1) { - var key = "secondsAgo"; - } else if (inMinutes < 1.01) { - var key = "secondsAgo"; - n = Math.round(inSeconds); - } - - // in minutes - else if (Math.round(inMinutes) == 1) { - var key = "minutesAgo"; - } else if (inHours < 1.01) { - var key = "minutesAgo"; - n = Math.round(inMinutes); - } - - // in hours - else if (Math.round(inHours) == 1) { - var key = "hoursAgo"; - } else if (inDays < 1.01) { - var key = "hoursAgo"; - n = Math.round(inHours); - } - - // in days - else if (Math.round(inDays) == 1) { - var key = "daysAgo"; - } else if (inYears < 1.01) { - var key = "daysAgo"; - n = Math.round(inDays); - } - - // in years - else if (Math.round(inYears) == 1) { - var key = "yearsAgo"; - } else { - var key = "yearsAgo"; - var n = Math.round(inYears); - } - - return Zotero.getString("date.relative." + key + "." + (n ? "multiple" : "one"), n); - } - - - this.toFriendlyDate = function(date) { - // 6:14:36 PM - if (isToday(date)) { - return date.toLocaleString(false, { - hour: 'numeric', - minute: 'numeric' - }) - } - // 'Thursday' - if (isThisWeek(date)) { - return date.toLocaleString(false, { - weekday: 'long' - }); - } - return date.toLocaleDateString(false, { - year: '2-digit', - month: 'numeric', - day: 'numeric' - }); - }; - - - function isToday(date) { - var d = new Date(); - return d.getDate() == date.getDate() && - d.getMonth() == d.getMonth() && - d.getFullYear() == d.getFullYear(); - } - - - function isThisWeek(date) { - var d = new Date(); - return d.getFullYear() == date.getFullYear() && getWeekNumber(d) == getWeekNumber(date); - } - - - // https://stackoverflow.com/a/27125580 - function getWeekNumber(date) { - let onejan = new Date(date.getFullYear(), 0, 1); - return Math.ceil((((date.getTime() - onejan.getTime()) / 86400000) + onejan.getDay() + 1) / 7); - } - - - function getFileDateString(file) { - var date = new Date(); - date.setTime(file.lastModifiedTime); - return date.toLocaleDateString(); - } - - - function getFileTimeString(file) { - var date = new Date(); - date.setTime(file.lastModifiedTime); - return date.toLocaleTimeString(); - } - - /** - * Get the order of the date components based on the current locale - * - * Returns a string with y, m, and d (e.g. 'ymd', 'mdy') - */ - function getLocaleDateOrder() { - if (!_localeDateOrder) { - switch (Zotero.locale ? Zotero.locale.substr(3) : "US") { - // middle-endian - case 'US': // The United States - case 'BZ': // Belize - case 'FM': // The Federated States of Micronesia - case 'PA': // Panama - case 'PH': // The Philippines - case 'PW': // Palau - case 'ZW': // Zimbabwe - _localeDateOrder = 'mdy'; - break; - - // big-endian - case 'fa': // Persian - case 'AL': // Albania - case 'CA': // Canada - case 'CN': // China - case 'HU': // Hungary - case 'JP': // Japan - case 'KE': // Kenya - case 'KR': // Korea - case 'LT': // Lithuania - case 'LV': // Latvia - case 'MN': // Mongolia - case 'SE': // Sweden - case 'TW': // Taiwan - case 'ZA': // South Africa - _localeDateOrder = 'ymd'; - break; - - // little-endian - default: - _localeDateOrder = 'dmy'; - } - } - return _localeDateOrder; - } - } - - if (typeof module != 'undefined') { - module.exports = Utilities_Date; - } else if (typeof Zotero != 'undefined') { - Zotero.Date = Utilities_Date; - } - -})(); \ No newline at end of file diff --git a/external-scripts/debug.js b/external-scripts/debug.js deleted file mode 100644 index ba0f9745..00000000 --- a/external-scripts/debug.js +++ /dev/null @@ -1,186 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.Debug = new function() { - var _console, _store, _level, _lastTime, _output = []; - var _slowTime = false; - var _consoleViewer = false; - - /** - * Initialize debug logging - */ - this.init = function(enabled = true) { - this.enabled = enabled; - } - - this.log = function(message, level, maxDepth, stack) { - if (!this.enabled) { - return; - } - - if (typeof message != 'string') { - message = Zotero.Utilities.varDump(message, 0, maxDepth); - } - - if (!level) { - level = 3; - } - - // If level above debug.level value, don't display - if (level > _level) { - return; - } - - var deltaStr = ''; - var deltaStrStore = ''; - var delta = 0; - var d = new Date(); - if (_lastTime) { - delta = d - _lastTime; - } - _lastTime = d; - var slowPrefix = ""; - var slowSuffix = ""; - if (_slowTime && delta > _slowTime) { - slowPrefix = "\x1b[31;40m"; - slowSuffix = "\x1b[0m"; - } - - delta = ("" + delta).padStart(7, "0"); - - deltaStr = "(" + slowPrefix + "+" + delta + slowSuffix + ")"; - if (_store) { - deltaStrStore = "(+" + delta + ")"; - } - - if (stack === true) { - stack = new Error().stack.substr('Error'.length); - } - - if (stack) { - message += '\n' + this.stackToString(stack); - } - - var output = '(' + level + ')' + deltaStr + ': ' + message; - console.log(output + "\n"); - - if (_store) { - if (Math.random() < 1 / 1000) { - // Remove initial lines if over limit - var overage = this.count() - Zotero.Prefs.get('debug.store.limit'); - if (overage > 0) { - _output.splice(0, Math.abs(overage)); - } - } - _output.push('(' + level + ')' + deltaStrStore + ': ' + message); - } - } - - - this.get = Zotero.Promise.method(function(maxChars, maxLineLength) { - var output = _output; - var total = output.length; - - if (total == 0) { - return ""; - } - - if (maxLineLength) { - for (var i = 0, len = output.length; i < len; i++) { - if (output[i].length > maxLineLength) { - output[i] = Zotero.Utilities.ellipsize(output[i], maxLineLength, false, true); - } - } - } - - output = output.join('\n\n'); - - if (maxChars) { - output = output.substr(maxChars * -1); - // Cut at two newlines - let matches = output.match(/^[\n]*\n\n/); - if (matches) { - output = output.substr(matches[0].length); - } - } - - return output; - }); - - - this.setStore = function(enable) { - if (enable) { - this.clear(); - } - _store = enable; - this.updateEnabled(); - this.storing = _store; - } - - - this.updateEnabled = function() { - this.enabled = _console || _consoleViewer || _store; - }; - - - this.count = function() { - return _output.length; - } - - - this.clear = function() { - _output = []; - } - - /** - * Format a stack trace for output in the same way that Error.stack does - * @param {Components.stack} stack - * @param {Integer} [lines=5] Number of lines to format - */ - this.stackToString = function(stack, lines) { - if (!lines) lines = 5; - var str = ''; - while (stack && lines--) { - str += '\n ' + (stack.name || '') + '@' + stack.filename + - ':' + stack.lineNumber; - stack = stack.caller; - } - return this.filterStack(str).substr(1); - }; - - - /** - * Strip Bluebird lines from a stack trace - * - * @param {String} stack - */ - this.filterStack = function(stack) { - return stack.split(/\n/).filter(line => line.indexOf('zotero/bluebird') == -1).join('\n'); - } -} - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = Zotero.Debug; -} \ No newline at end of file diff --git a/external-scripts/errors_webkit.js b/external-scripts/errors_webkit.js deleted file mode 100644 index bf12fbc7..00000000 --- a/external-scripts/errors_webkit.js +++ /dev/null @@ -1,101 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.Errors = new function() { - var _output = []; - - /** - * Error handler - * @param {String} string Error string - * @param {String} url URL of error - * @param {Number} line Line where error occurred - */ - this.log = function(string, url, line) { - var err = ['[JavaScript Error: "', string, '"']; - if (url || line) { - var info = []; - if (url) info.push('file: "' + url + '"'); - if (line) info.push('line: ' + line); - err.push(" {" + info.join(" ") + "}"); - } - err.push("]"); - err = err.join(""); - _output.push(err); - } - - /** - * Gets errors as an array of strings - */ - this.getErrors = async function() { - return _output.slice(); - } - - /** - * Sends an error report to the server - * NB: Runs on the prefs injected page on Safari - * since responseXML or DOMParser are unavailable - * in the global page - */ - this.sendErrorReport = async function() { - var info = await Zotero.getSystemInfo(); - var parts = { - error: "true", - errorData: (await this.getErrors()).join('\n'), - extraData: '', - diagnostic: info - }; - - var body = ''; - for (var key in parts) { - body += key + '=' + encodeURIComponent(parts[key]) + '&'; - } - body = body.substr(0, body.length - 1); - let headers = { - 'Content-Type': 'application/x-www-form-urlencoded' - }; - let options = { - body, - headers - }; - var xmlhttp = await Zotero.HTTP.request("POST", "https://www.zotero.org/repo/report", options); - let responseXML; - try { - let parser = new DOMParser(); - responseXML = parser.parseFromString(xmlhttp.responseText, "text/xml"); - } catch (e) { - throw new Error('Invalid response from repository'); - } - var reported = responseXML.getElementsByTagName('reported'); - if (reported.length != 1) { - throw new Error('Invalid response from repository'); - } - return reported[0].getAttribute('reportID'); - } -} - -if (typeof Zotero.Debug != "undefined") { - // Remove access to Zotero.Debug - //Zotero.Debug.bgInit = Zotero.Debug.init; -} \ No newline at end of file diff --git a/external-scripts/http.js b/external-scripts/http.js deleted file mode 100644 index 6275f44f..00000000 --- a/external-scripts/http.js +++ /dev/null @@ -1,324 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Functions for performing HTTP requests, both via XMLHTTPRequest and using a hidden browser - * @namespace - */ -Zotero.HTTP = new function() { - this.StatusError = function(xmlhttp, url) { - this.message = `HTTP request to ${url} rejected with status ${xmlhttp.status}`; - this.status = xmlhttp.status; - try { - this.responseText = typeof xmlhttp.responseText == 'string' ? xmlhttp.responseText : undefined; - } catch (e) {} - }; - this.StatusError.prototype = Object.create(Error.prototype); - - this.TimeoutError = function(url, ms) { - this.message = `HTTP request to ${url} has timed out after ${ms}ms`; - }; - this.TimeoutError.prototype = Object.create(Error.prototype); - - /** - * Get a promise for a HTTP request - * - * @param {String} method The method of the request ("GET", "POST", "HEAD", or "OPTIONS") - * @param {String} url URL to request - * @param {Object} [options] Options for HTTP request:
      - *
    • body - The body of a POST request
    • - *
    • headers - Object of HTTP headers to send with the request
    • - *
    • debug - Log response text and status code
    • - *
    • logBodyLength - Length of request body to log
    • - *
    • timeout - Request timeout specified in milliseconds [default 15000]
    • - *
    • responseType - The response type of the request from the XHR spec
    • - *
    • responseCharset - The charset the response should be interpreted as
    • - *
    • successCodes - HTTP status codes that are considered successful, or FALSE to allow all
    • - *
    - * @return {Promise} A promise resolved with the XMLHttpRequest object if the - * request succeeds, or rejected if the browser is offline or a non-2XX status response - * code is received (or a code not in options.successCodes if provided). - */ - this.request = async function(method, url, options = {}) { - // Default options - options = Object.assign({ - body: null, - headers: {}, - debug: false, - logBodyLength: 1024, - timeout: 15000, - responseType: '', - responseCharset: null, - successCodes: null - }, options); - - var useContentXHR = false; - - if (Zotero.isInject) { - // The privileged XHR that Firefox makes available to content scripts so that they - // can make cross-domain requests doesn't include the Referer header in requests [1], - // so sites that check for it don't work properly. As long as we're not making a - // cross-domain request, we can use the content XHR that it provides, which does - // include Referer. Chrome's XHR in content scripts includes Referer by default. - // - // [1] https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#XHR_and_Fetch - if (Zotero.HTTP.isSameOrigin(url) && !(Zotero.isSafari && options.headers['User-Agent'])) { - if (typeof content != 'undefined' && content.XMLHttpRequest) { - Zotero.debug("Using content XHR"); - useContentXHR = true; - } - } else { - if (Zotero.isBookmarklet) { - Zotero.debug("HTTP: Attempting cross-site request from bookmarklet; this may fail"); - } else { - // Make a cross-origin request via the background page, parsing the responseText with - // DOMParser and returning a Proxy with 'response' set to the parsed document - let isDocRequest = options.responseType == 'document'; - let coOptions = Object.assign({}, options); - if (isDocRequest) { - coOptions.responseType = 'text'; - } - if (Zotero.isSafari && options.headers['User-Agent']) { - coOptions.headers['Cookie'] = document.cookie; - } - return Zotero.COHTTP.request(method, url, coOptions).then(function(xmlhttp) { - if (!isDocRequest) return xmlhttp; - - Zotero.debug("Parsing cross-origin response for " + url); - let parser = new DOMParser(); - let contentType = xmlhttp.getResponseHeader("Content-Type"); - if (contentType != 'application/xml' && contentType != 'text/xml') { - contentType = 'text/html'; - } - let doc = parser.parseFromString(xmlhttp.responseText, contentType); - - return new Proxy(xmlhttp, { - get: function(target, name) { - return name == 'response' ? doc : target[name]; - } - }); - }); - } - } - } - - let logBody = ''; - if (['GET', 'HEAD'].includes(method)) { - if (options.body != null) { - throw new Error(`HTTP ${method} cannot have a request body (${options.body})`) - } - } else if (options.body) { - if (options.headers["Content-Type"] !== 'multipart/form-data') { - options.body = typeof options.body == 'string' ? options.body : JSON.stringify(options.body); - - logBody = `: ${options.body.substr(0, options.logBodyLength)}` + - options.body.length > options.logBodyLength ? '...' : ''; - // TODO: make sure below does its job in every API call instance - // Don't display password or session id in console - logBody = logBody.replace(/password":"[^"]+/, 'password":"********'); - logBody = logBody.replace(/password=[^&]+/, 'password=********'); - } - - if (!options.headers) options.headers = {}; - if (!options.headers["Content-Type"]) { - options.headers["Content-Type"] = "application/x-www-form-urlencoded"; - } else if (options.headers["Content-Type"] == 'multipart/form-data') { - // Allow XHR to set Content-Type with boundary for multipart/form-data - delete options.headers["Content-Type"]; - } - } - if (options.headers['User-Agent'] && Zotero.isBrowserExt) { - await Zotero.WebRequestIntercept.replaceUserAgent(url, options.headers['User-Agent']); - delete options.headers['User-Agent']; - } - Zotero.debug(`HTTP ${method} ${url}${logBody}`); - - var xmlhttp = useContentXHR ? new content.XMLHttpRequest() : new XMLHttpRequest(); - xmlhttp.timeout = options.timeout; - var promise = Zotero.HTTP._attachHandlers(url, xmlhttp, options); - - xmlhttp.open(method, url, true); - - for (let header in options.headers) { - xmlhttp.setRequestHeader(header, options.headers[header]); - } - - xmlhttp.responseType = options.responseType || ''; - - // Maybe should provide "mimeType" option instead. This is xpcom legacy, where responseCharset - // could be controlled manually - if (options.responseCharset) { - xmlhttp.overrideMimeType("text/plain; charset=" + options.responseCharset); - } - - xmlhttp.send(options.body); - - return promise.then(function(xmlhttp) { - if (options.debug) { - if (xmlhttp.responseType == '' || xmlhttp.responseType == 'text') { - Zotero.debug(`HTTP ${xmlhttp.status} response: ${xmlhttp.responseText}`); - } else { - Zotero.debug(`HTTP ${xmlhttp.status} response`); - } - } - - let invalidDefaultStatus = options.successCodes === null && - (xmlhttp.status < 200 || xmlhttp.status >= 300); - let invalidStatus = Array.isArray(options.successCodes) && !options.successCodes.includes(xmlhttp.status); - if (invalidDefaultStatus || invalidStatus) { - throw new Zotero.HTTP.StatusError(xmlhttp, url); - } - return xmlhttp; - }); - }; - /** - * Send an HTTP GET request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} responseCharset - * @param {N/A} cookieSandbox Not used in Connector - * @param {Object} headers HTTP headers to include with the request - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doGet = function(url, onDone, responseCharset, cookieSandbox, headers) { - Zotero.debug('Zotero.HTTP.doGet is deprecated. Use Zotero.HTTP.request'); - this.request('GET', url, { - responseCharset, - headers - }) - .then(onDone, function(e) { - onDone({ - status: e.status, - responseText: e.responseText - }); - throw (e); - }); - return true; - }; - - /** - * Send an HTTP POST request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {String|Object[]} body Request body - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} headers Request HTTP headers - * @param {String} responseCharset - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doPost = function(url, body, onDone, headers, responseCharset) { - Zotero.debug('Zotero.HTTP.doPost is deprecated. Use Zotero.HTTP.request'); - this.request('POST', url, { - body, - responseCharset, - headers - }) - .then(onDone, function(e) { - onDone({ - status: e.status, - responseText: e.responseText - }); - throw (e); - }); - return true; - }; - - - /** - * Adds a ES6 Proxied location attribute - * @param doc - * @param docUrl - */ - this.wrapDocument = function(doc, docURL) { - // CHANGED: No idea what's the purpose of this require('url').parse stuff, but it's not working; so emulate it - //let url = require('url'); - //docURL = url.parse(docURL); - url = docURL - docURL = { - toString: () => url, - href: url, - } - var wrappedDoc = new Proxy(doc, { - get: function(t, prop) { - if (prop === 'location') { - return docURL; - } else if (prop == 'evaluate') { - // If you pass the document itself into doc.evaluate as the second argument - // it fails, because it receives a proxy, which isn't of type `Node` for some reason. - // Native code magic. - return function() { - if (arguments[1] == wrappedDoc) { - arguments[1] = t; - } - return t.evaluate.apply(t, arguments) - } - } else { - if (typeof t[prop] == 'function') { - return t[prop].bind(t); - } - return t[prop]; - } - } - }); - return wrappedDoc; - }; - - - /** - * Adds request handlers to the XMLHttpRequest and returns a promise that resolves when - * the request is complete. xmlhttp.send() still needs to be called, this just attaches the - * handler - * - * See {@link Zotero.HTTP.request} for parameters - * @private - */ - this._attachHandlers = function(url, xmlhttp, options) { - var deferred = Zotero.Promise.defer(); - xmlhttp.onload = () => deferred.resolve(xmlhttp); - xmlhttp.onerror = xmlhttp.onabort = function() { - var e = new Zotero.HTTP.StatusError(xmlhttp, url); - if (options.successCodes === false) { - deferred.resolve(xmlhttp); - } else { - deferred.reject(e); - } - }; - xmlhttp.ontimeout = function() { - var e = new Zotero.HTTP.TimeoutError(url, xmlhttp.timeout); - Zotero.logError(e); - deferred.reject(e); - }; - return deferred.promise; - }; -} - -// Alias as COHTTP = Cross-origin HTTP; this is how we will call it from children -// For injected scripts, this get overwritten in messaging.js (see messages.js) -Zotero.COHTTP = { - request: Zotero.HTTP.request -}; \ No newline at end of file diff --git a/external-scripts/http_inject.js b/external-scripts/http_inject.js deleted file mode 100644 index cac9ed89..00000000 --- a/external-scripts/http_inject.js +++ /dev/null @@ -1,146 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Functions for performing HTTP requests, both via XMLHTTPRequest and using a hidden browser - * @namespace - */ -if (!Zotero.HTTP) Zotero.HTTP = {}; - -/** - * Determines whether the page to be loaded has the same origin as the current page - */ -Zotero.HTTP.isSameOrigin = function(url) { - // Hack to deal with cross-origin redirect on Nature until we swit - if (url.includes('www.nature.com/') || url.includes('www-nature-com.')) { - return false; - } - - const hostPortRe = /^([^:\/]+:)\/\/([^\/]+)/i; - var m = hostPortRe.exec(url); - if (!m) { - return true; - } else { - var location = Zotero.isBookmarklet ? window.parent.location : window.location; - return m[1].toLowerCase() === location.protocol.toLowerCase() && - m[2].toLowerCase() === location.host.toLowerCase(); - } -} - -/** - * Determing if trying to load non-HTTPs URLs from HTTPS pages - */ -Zotero.HTTP.isLessSecure = function(url) { - if (url.substr(0, 8).toLowerCase() == 'https://') return false; - - var location = Zotero.isBookmarklet ? window.parent.location : window.location; - return location.protocol.toLowerCase() == 'https:'; -} - -/** - * Load one or more documents via XMLHttpRequest - * - * This should stay in sync with the equivalent function in the client - * - * @param {String|String[]} urls - URL(s) of documents to load - * @param {Function} processor - Callback to be executed for each document loaded - * @return {Promise} - A promise for an array of results from the processor runs - */ -Zotero.HTTP.processDocuments = async function(urls, processor, options = {}) { - // Handle old signature: urls, processor, onDone, onError - if (typeof arguments[2] == 'function' || typeof arguments[3] == 'function') { - Zotero.debug("Zotero.HTTP.processDocuments() no longer takes onDone or onError -- update your code"); - var onDone = arguments[2]; - var onError = arguments[3]; - } - - if (typeof urls == "string") urls = [urls]; - var funcs = urls.map(url => () => { - return Zotero.HTTP.request( - "GET", - url, { - responseType: 'document' - } - ) - .then((xhr) => { - var doc = Zotero.HTTP.wrapDocument(xhr.response, url); - return processor(doc, url); - }); - }); - - // Run processes serially - // TODO: Add some concurrency? - var f; - var results = []; - while (f = funcs.shift()) { - try { - results.push(await f()); - } catch (e) { - if (onError) { - onError(e); - } - throw e; - } - } - - // Deprecated - if (onDone) { - onDone(); - } - - return results; -} - -Zotero.Browser = { - createHiddenBrowser: function() { - var hiddenBrowser = document.createElement("iframe"); - if (!Zotero.isBookmarklet) { - hiddenBrowser.style.display = "none"; - } - if (document.domain == document.location.hostname) { - // Since sandboxed iframes cannot set document.domain, if - // document.domain is set on this page, then SOP will - // definitely prevent us from accessing the document - // in a sandboxed iframe. On the other hand, if we don't - // sandbox the iframe, it is possible it will navigate the - // top-level page. So we set the sandbox attribute only if - // we are not certain that document.domain has been set. - // This is not perfect, since if a page sets - // document.domain = document.domain, it is still a - // different origin and we will not be able to access pages - // loaded in the iframe. Additionally, if a page sets - // document.domain to a different hostname, since we don't - // sandbox, it is possible that it will navigate the - // top-level page. - // TODO: consider HTML XHR - hiddenBrowser.sandbox = "allow-same-origin allow-forms allow-scripts"; - } - document.body.appendChild(hiddenBrowser); - return hiddenBrowser; - }, - deleteHiddenBrowser: function(hiddenBrowser) { - document.body.removeChild(hiddenBrowser); - } -}; \ No newline at end of file diff --git a/external-scripts/inject.js b/external-scripts/inject.js deleted file mode 100644 index 84e9c373..00000000 --- a/external-scripts/inject.js +++ /dev/null @@ -1,792 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -var isTopWindow = false; -if (window.top) { - try { - isTopWindow = window.top == window; - } catch (e) {}; -} -var instanceID = isTopWindow ? 0 : (new Date()).getTime(); - -if (isTopWindow) { - Zotero.Messaging.addMessageListener("confirm", function(props) { - return Zotero.Inject.confirm(props); - }); - - Zotero.Messaging.addMessageListener("notify", (args) => Zotero.Inject.notify.apply(this, args)); - - Zotero.Messaging.addMessageListener("ping", function() { - // Respond to indicate that script is injected - return 'pong'; - }); -} - -/** - * @namespace - */ -Zotero.Inject = new function() { - var _translate; - var _noteImgSrc; - // Used to display a different message for failing translations on pages - // with site-access limits - const siteAccessLimitsTranslators = new Set([ - "57a00950-f0d1-4b41-b6ba-44ff0fc30289" // GoogleScholar - ]); - this.sessionDetails = {}; - this.translators = []; - - /** - * Initializes the translate machinery and determines whether this page can be translated - */ - this.init = function(force) { - // On OAuth completion, close window and call completion listener - if (document.location.href.substr(0, ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length + 1) === ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL + "?") { - Zotero.API.onAuthorizationComplete(document.location.href.substr(ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length + 1)); - } else if (document.location.href.substr(0, ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length + 1) === ZOTERO_CONFIG.OAUTH.GOOGLE_DOCS.CALLBACK_URL + "#") { - Zotero.GoogleDocs_API.onAuthComplete(document.location.href); - } - - // Reset session on every init so a new save is triggered after JS-based changes - // (monitorDOMChanges/ZoteroItemUpdated) - this.sessionDetails = {}; - - _noteImgSrc = Zotero.isSafari ? - `${safari.extension.baseURI}safari/` + "images/treeitem-note.png" : - browser.runtime.getURL('images/treeitem-note.png'); - - // wrap this in try/catch so that errors will reach logError - try { - if (this.translators.length) { - if (force) { - this.translators = []; - } else { - return; - } - } - if (document.location == "about:blank") return; - - if (!_translate) { - _translate = this.initTranslation(document); - _translate.setHandler("pageModified", function() { - Zotero.Connector_Browser.onPageLoad(document.location.href); - Zotero.Messaging.sendMessage("pageModified", null); - }); - document.addEventListener("ZoteroItemUpdated", function() { - Zotero.debug("Inject: ZoteroItemUpdated event received"); - Zotero.Connector_Browser.onPageLoad(document.location.href); - Zotero.Messaging.sendMessage("pageModified", null); - }, false); - } else { - _translate.setDocument(document); - } - return _translate.getTranslators(true).then(function(translators) { - if (!translators.length && Zotero.isSafari) { - if (!isTopWindow && document.contentType == 'application/pdf') { - return Zotero.Connector_Browser.onPDFFrame(document.location.href, instanceID); - } - } - this.translators = translators; - - translators = translators.map(function(translator) { - return translator.serialize(TRANSLATOR_PASSING_PROPERTIES) - }); - Zotero.Connector_Browser.onTranslators(translators, instanceID, document.contentType); - }.bind(this)); - } catch (e) { - Zotero.logError(e); - } - }; - - this.initTranslation = function(document, sessionID) { - var translate = new Zotero.Translate.Web(); - translate.setDocument(document); - if (sessionID) { - translate.setHandler("select", function(obj, items, callback) { - // Close the progress window before displaying Select Items - Zotero.Messaging.sendMessage("progressWindow.close", null); - - // If the handler returns a non-undefined value then it is passed - // back to the callback due to backwards compat code in translate.js - (async function() { - // We don't want to show a select dialog -> always choose all items - /* - try { - let response = await Zotero.Connector.callMethod("getSelectedCollection", {}); - if (response.libraryEditable === false) { - return callback([]); - } - } catch (e) { - // Zotero is online but an error occured anyway, so let's log it and display - // the dialog just in case - if (e.status != 0) { - Zotero.logError(e); - } - } - - if (Zotero.isBrowserExt) { - var returnItems = await Zotero.Connector_Browser.onSelect(items); - } else { - returnItems = await Zotero.Inject.onSafariSelect(items); - } - - // If items were selected, reopen the save popup - if (returnItems && !Zotero.Utilities.isEmpty(returnItems)) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - } - */ - callback(items); - }.bind(this))(); - }.bind(this)); - translate.setHandler("itemSaving", function(obj, item) { - // this relays an item from this tab to the top level of the window - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title - } - ); - }); - translate.setHandler("itemDone", function(obj, dbItem, item) { - // this relays an item from this tab to the top level of the window - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title, - progress: 100 - } - ); - for (var i = 0; i < item.attachments.length; i++) { - var attachment = item.attachments[i]; - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", { - sessionID, - id: attachment.id, - iconSrc: determineAttachmentIcon(attachment), - title: attachment.title, - parentItem: item.id - } - ); - } - if (item.notes) { - for (let note of item.notes) { - Zotero.Messaging.sendMessage( - 'progressWindow.itemProgress', { - sessionID, - id: null, - iconSrc: _noteImgSrc, - title: Zotero.Utilities.cleanTags(note.note), - parentItem: item.id, - progress: 100 - } - ) - } - } - }); - translate.setHandler("attachmentProgress", function(obj, attachment, progress, err) { - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", { - sessionID, - id: attachment.id, - iconSrc: determineAttachmentIcon(attachment), - title: attachment.title, - parentItem: attachment.parentItem, - progress - } - ); - }); - } - return translate; - } - - function determineAttachmentIcon(attachment) { - if (attachment.linkMode === "linked_url") { - return Zotero.ItemTypes.getImageSrc("attachment-web-link"); - } - var contentType = attachment.contentType || attachment.mimeType; - return Zotero.ItemTypes.getImageSrc( - contentType === "application/pdf" ? "attachment-pdf" : "attachment-snapshot" - ); - } - - /** - * Check if React and components are loaded and if not - load into page. - * - * This is a performance optimization - we want to avoid loading React into every page. - * - * @param components {Object[]} an array of component names to load - * @return {Promise} resolves when components are injected - */ - this.loadReactComponents = async function(components = []) { - if (Zotero.isSafari) return; - var toLoad = []; - if (typeof ReactDOM === "undefined" || typeof React === "undefined" || - !React.useState) { - toLoad = [ - 'lib/react.js', - 'lib/react-dom.js', - 'lib/prop-types.js' - ]; - } - for (let component of components) { - if (!Zotero.UI || !Zotero.UI[component]) { - toLoad.push(`ui/${component}.js`) - } - } - if (toLoad.length) { - return Zotero.Connector_Browser.injectScripts(toLoad); - } - } - - this.confirm = function(props) { - return Zotero.ModalPrompt.confirm(props); - }; - - /** - * Display an old-school firefox notification by injecting HTML directly into DOM. - * - * @param {String} text - * @param {String[]} buttons - labels for buttons - * @param {Number} timeout - notification gets removed after this timeout - * @param {String} tabStatus - available on chrome.Tab.status in background scripts - * @returns {Number} button pressed - */ - this.notify = new function() { - var lastChainedPromise = Zotero.Promise.resolve(); - return function(text, buttons, timeout, tabStatus) { - // This is a little awkward, because the tab status is passed from the background script to - // the content script, but chrome.tabs is unavailable in content scripts. - // - // If we're navigating somewhere don't display the notification, because it looks dumb. - // The navigation will re-trigger this method from the background script. - if (tabStatus != 'complete') return; - - let showNotificationPrompt = async function() { - await Zotero.Promise.delay(500); - await Zotero.Inject.loadReactComponents(['Notification']); - - var notification = new Zotero.UI.Notification(text, buttons); - if (timeout) setTimeout(notification.dismiss.bind(notification, null, 0), timeout); - return notification.show(); - }.bind(this); - - // Sequentialize notification display - lastChainedPromise = lastChainedPromise.then(showNotificationPrompt); - return lastChainedPromise; - } - }; - - this.firstUsePrompt = function() { - var clientName = ZOTERO_CONFIG.CLIENT_NAME; - return this.confirm({ - title: Zotero.getString('firstRun_title', clientName), - button1Text: Zotero.getString('firstRun_acceptButton'), - button2Text: "", - message: Zotero.getString( - 'firstRun_text1', - [ - clientName, - "https://www.zotero.org/support/adding_items_to_zotero" - ] - ) + - '

    ' + - Zotero.getString( - 'firstRun_text2', - [ - clientName, - // TODO: Make download URL configurable (instead of just base URL + "download") - ZOTERO_CONFIG.WWW_BASE_URL + "download/" - ] - ) - }); - }; - - this.firstSaveToServerPrompt = async function() { - var clientName = ZOTERO_CONFIG.CLIENT_NAME; - - var result = await this.confirm({ - button1Text: Zotero.getString('general_tryAgain'), - button2Text: Zotero.getString('general_cancel'), - button3Text: Zotero.getString('error_connection_enableSavingToOnlineLibrary'), - title: Zotero.getString('error_connection_isAppRunning', clientName), - message: Zotero.getString( - 'error_connection_save', - [ - Zotero.getString('appConnector', clientName), - clientName, - ZOTERO_CONFIG.DOMAIN_NAME - ] - ) + - '

    ' + - Zotero.Inject.getConnectionErrorTroubleshootingString() - }); - - switch (result.button) { - case 1: - return 'retry'; - - case 3: - return 'server'; - - default: - return 'cancel'; - } - }; - - - this.getConnectionErrorTroubleshootingString = function() { - var clientName = ZOTERO_CONFIG.CLIENT_NAME; - var connectorName = Zotero.getString('appConnector', ZOTERO_CONFIG.CLIENT_NAME); - var downloadLink = 'https://www.zotero.org/download/'; - var troubleshootLink = 'https://www.zotero.org/support/kb/connector_zotero_unavailable'; - return Zotero.getString( - 'error_connection_downloadOrTroubleshoot', - [downloadLink, clientName, troubleshootLink] - ); - }; - - /** - * If Zotero is offline and attempting action fallback to zotero.org for first time: prompts about it - * Prompt only available on BrowserExt which supports programmatic injection - * Otherwise just resolves to true - * - * return {Promise} whether the action should proceed - */ - this.checkActionToServer = async function() { - // Pretend that zotero is online - return true; - - /* - var [firstSaveToServer, zoteroIsOnline] = await Zotero.Promise.all([ - Zotero.Prefs.getAsync('firstSaveToServer'), - Zotero.Connector.checkIsOnline() - ]); - if (zoteroIsOnline || !firstSaveToServer) { - return true; - } - var result = await this.firstSaveToServerPrompt(); - if (result == 'server') { - Zotero.Prefs.set('firstSaveToServer', false); - return true; - } else if (result == 'retry') { - // If we perform the retry immediately and Zotero is still unavailable the prompt returns instantly - // making the user interaction confusing so we wait a bit first - await Zotero.Promise.delay(500); - return this.checkActionToServer(); - } - return false; - */ - }; - - this.translate = async function(translatorID, options = {}) { - let result = await Zotero.Inject.checkActionToServer(); - if (!result) return; - var translator = this.translators.find((t) => t.translatorID == translatorID); - - // We always want to save again - options.resave = true; - - // In some cases, we just reopen the popup instead of saving again - if (this.sessionDetails.id - // Same page (no history push) - && - document.location.href == this.sessionDetails.url - // Same translator - && - translatorID == this.sessionDetails.translatorID - // Not a multiple page - && - translator.itemType != 'multiple' - // Not "Create Zotero Item and Note from Selection" - && - !options.note - // Not from the context menu, which always triggers a resave - && - !options.resave) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - return; - } - - var sessionID = Zotero.Utilities.randomString(); - Zotero.Messaging.sendMessage( - "progressWindow.show", - [ - sessionID, - null, - false, - // If we're likely to show the Select Items window, delay the opening of the - // popup until we've had a chance to hide it (which happens in the 'select' - // callback in progressWindow_inject.js). - translator.itemType == 'multiple' ? 100 : null - ] - ); - - this.sessionDetails = { - id: sessionID, - url: document.location.href, - translatorID, - saveOptions: options - }; - - var translate = this.initTranslation(document, sessionID); - var translators = [...this.translators]; - while (translators[0].translatorID != translatorID) { - translators.shift(); - } - while (true) { - translator = translators.shift(); - translate.setTranslator(translator); - try { - let items = await translate.translate({ - sessionID - }); - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return items; - } catch (e) { - // TEMP: Remove once client switches automatically (added in 5.0.46) - if (e.value && e.value.libraryEditable == false) { - // Allow another attempt to save again - this.sessionDetails = {}; - return; - } - if (translator.itemType != 'multiple') { - if (options.fallbackOnFailure && translators.length) { - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, translators[0].label]); - } else { - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, "Save as Webpage"]); - return await this._saveAsWebpage({ - sessionID, - snapshot: true - }); - } - } else { - // Clear session details on failure, so another save click tries again - this.sessionDetails = {}; - // We delay opening the progressWindow for multiple items so we don't have to flash it - // for the select dialog. But it comes back to bite us in the butt if a translation - // error occurs immediately since the below command will execute before the progressWindow show, - // and then the delayed progressWindow.show will pop up another empty progress window. - // Cannot have that! - await Zotero.Promise.delay(500); - const isAccessLimitingTranslator = siteAccessLimitsTranslators.has(translator.translatorID); - try { - var statusCode = typeof e == 'string' && e.match(/status code ([0-9]{3})/)[1]; - } catch (e) {} - const isHTTPErrorForbidden = statusCode == '403'; - const isHTTPErrorTooManyRequests = statusCode == '429'; - if ((isAccessLimitingTranslator && isHTTPErrorForbidden) || isHTTPErrorTooManyRequests) { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'siteAccessLimits', translator.label]); - } else { - Zotero.Messaging.sendMessage("progressWindow.done", [false]); - } - return; - } - } - } - }; - - this.saveAsWebpage = async function(args) { - var title = args[0] || document.title, - options = args[1] || {}; - var result = await Zotero.Inject.checkActionToServer(); - if (!result) return; - - var translatorID = 'webpage' + (options.snapshot ? 'WithSnapshot' : ''); - // Reopen if popup instead of resaving - if (this.sessionDetails.id - // Same page (no history push) - && - document.location.href == this.sessionDetails.url - // Same translator - && - translatorID == this.sessionDetails.translatorID - // Not from the context menu, which always triggers a resave - && - !options.resave) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - return; - } - - var sessionID = Zotero.Utilities.randomString(); - return await this._saveAsWebpage({ - sessionID, - title, - snapshot: options.snapshot - }); - }; - - this._saveAsWebpage = async function(options = {}) { - var sessionID = options.sessionID; - var title = options.title || document.title; - var translatorID = 'webpage' + (options.snapshot ? 'WithSnapshot' : ''); - if (!sessionID) { - throw new Error("Trying to save as webpage without session ID"); - } - var data = { - sessionID, - url: document.location.toString(), - cookie: document.cookie, - title: title, - html: document.documentElement.innerHTML, - skipSnapshot: !options.snapshot, - singleFile: true - }; - - var image; - if (document.contentType == 'application/pdf') { - data.pdf = true; - image = "attachment-pdf"; - } else { - image = "webpage"; - } - - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", { - sessionID, - id: 1, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title: title - } - ); - - try { - var result = await Zotero.Connector.callMethodWithCookies("saveSnapshot", data); - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { - sessionID - }); - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", { - sessionID, - id: 1, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - - // Once snapshot item is created, if requested, run SingleFile - if (!data.pdf && result && result.saveSingleFile) { - let progressItem = { - sessionID, - id: 2, - iconSrc: Zotero.ItemTypes.getImageSrc("attachment-snapshot"), - title: "Snapshot", - parentItem: 1, - progress: 0 - }; - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", progressItem); - - try { - data.snapshotContent = await Zotero.SingleFile.retrievePageData(); - } catch (e) { - // Swallow error, will fallback to save in client - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { - ...progressItem, - ...{ - progress: false - } - }); - } - - try { - result = await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: { - "Content-Type": "application/json" - } - }, - data - ); - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { - ...progressItem, - ...{ - progress: 100 - } - }); - } catch (e) { - if (e.status === 400 && e.value === 'Endpoint does not support content-type\n') { - let snapshotContent = data.snapshotContent; - delete data.snapshotContent; - - data.pageData = { - content: snapshotContent, - resources: {} - }; - - // This means a Zotero client that expects SingleFileZ. We can just feed - // it a payload it is expecting with no resources. - result = await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: { - "Content-Type": "multipart/form-data" - } - }, { - payload: JSON.stringify(data) - }); - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { - ...progressItem, - ...{ - progress: 100 - } - }); - } else { - throw e; - } - } - } - - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - Object.assign(this.sessionDetails, { - id: sessionID, - url: document.location.href, - translatorID - }); - return result; - } catch (e) { - // Client unavailable - if (e.status === 0) { - // Attempt saving to server if not pdf - if (document.contentType != 'application/pdf') { - let itemSaver = new Zotero.Translate.ItemSaver({}); - let items = await itemSaver.saveAsWebpage(); - if (items.length) { - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", { - id: title, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - } - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return; - } else { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'clientRequired']); - } - } - // Unexpected error, including a timeout (which we don't want to - // result in a save to the server, because it's possible the request - // will still be processed) - else if (!e.value || e.value.libraryEditable != false) { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'unexpectedError']); - } - throw e; - } - } - - this.addKeyboardShortcut = function(eventDescriptor, fn, elem) { - elem = elem || document; - elem.addEventListener('keydown', function ZoteroKeyboardShortcut(event) { - for (let prop in eventDescriptor) { - if (event[prop] != eventDescriptor[prop]) return; - } - event.stopPropagation(); - event.preventDefault(); - fn(); - }); - } -}; - -// check whether this is a hidden browser window being used for scraping -var isHiddenIFrame = false; -try { - isHiddenIFrame = !isTopWindow && window.frameElement && window.frameElement.style.display === "none"; -} catch (e) {} - -const isWeb = window.location.protocol === "http:" || window.location.protocol === "https:"; -const isTestPage = Zotero.isBrowserExt && window.location.href.startsWith(browser.runtime.getURL('test')); -// don't try to scrape on hidden frames -if (!isHiddenIFrame) { - var doInject = async function() { - await Zotero.initInject(); - - if (Zotero.isSafari && isTopWindow) { - Zotero.Connector_Browser.onPageLoad(document.location.href); - } - - // Do not run on non-web pages (file://), test pages, safari extension pages (i.e. safari prefs) - // or non-top Safari pages - if (!isWeb && !isTestPage) return; - // add listener for translate message from extension - Zotero.Messaging.addMessageListener("translate", function(data) { - if (data.shift() !== instanceID) return; - return Zotero.Inject.translate.apply(Zotero.Inject, data); - }); - // add a listener to save as webpage when translators unavailable - Zotero.Messaging.addMessageListener("saveAsWebpage", function(data) { - if (Zotero.isSafari) { - if (data[0] !== instanceID) return; - Zotero.Inject.saveAsWebpage(data[1]) - } else { - Zotero.Inject.saveAsWebpage(data); - } - }); - // add listener to rerun detection on page modifications - Zotero.Messaging.addMessageListener("pageModified", function() { - Zotero.Inject.init(true); - }); - Zotero.Messaging.addMessageListener('historyChanged', function() { - Zotero.Inject.init(true); - }); - - Zotero.Messaging.addMessageListener("firstUse", function() { - return Zotero.Inject.firstUsePrompt(); - }); - - if (document.readyState !== "complete") { - window.addEventListener("pageshow", function(e) { - if (e.target !== document) return; - Zotero.Inject.init(true); - }, false); - } else { - Zotero.Inject.init(); - } - }; - - // Wait until pages in prerender state become visible before injecting - if (document.visibilityState == 'prerender') { - var handler = function() { - doInject(); - document.removeEventListener("visibilitychange", handler); - }; - document.addEventListener("visibilitychange", handler); - } else { - doInject(); - } -} \ No newline at end of file diff --git a/external-scripts/inject.jsx b/external-scripts/inject.jsx deleted file mode 100644 index 8544c5b6..00000000 --- a/external-scripts/inject.jsx +++ /dev/null @@ -1,768 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -var isTopWindow = false; -if(window.top) { - try { - isTopWindow = window.top == window; - } catch(e) {}; -} -var instanceID = isTopWindow ? 0 : (new Date()).getTime(); - -if (isTopWindow) { - Zotero.Messaging.addMessageListener("confirm", function (props) { - return Zotero.Inject.confirm(props); - }); - - Zotero.Messaging.addMessageListener("notify", (args) => Zotero.Inject.notify.apply(this, args)); - - Zotero.Messaging.addMessageListener("ping", function () { - // Respond to indicate that script is injected - return 'pong'; - }); -} - -/** - * @namespace - */ -Zotero.Inject = new function() { - var _translate; - var _noteImgSrc; - // Used to display a different message for failing translations on pages - // with site-access limits - const siteAccessLimitsTranslators = new Set([ - "57a00950-f0d1-4b41-b6ba-44ff0fc30289" // GoogleScholar - ]); - this.sessionDetails = {}; - this.translators = []; - - /** - * Initializes the translate machinery and determines whether this page can be translated - */ - this.init = function(force) { - // On OAuth completion, close window and call completion listener - if(document.location.href.substr(0, ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length+1) === ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL+"?") { - Zotero.API.onAuthorizationComplete(document.location.href.substr(ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length+1)); - } else if (document.location.href.substr(0, ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length+1) === ZOTERO_CONFIG.OAUTH.GOOGLE_DOCS.CALLBACK_URL+"#") { - Zotero.GoogleDocs_API.onAuthComplete(document.location.href); - } - - // Reset session on every init so a new save is triggered after JS-based changes - // (monitorDOMChanges/ZoteroItemUpdated) - this.sessionDetails = {}; - - _noteImgSrc = Zotero.isSafari - ? `${safari.extension.baseURI}safari/`+"images/treeitem-note.png" - : browser.runtime.getURL('images/treeitem-note.png'); - - // wrap this in try/catch so that errors will reach logError - try { - if(this.translators.length) { - if(force) { - this.translators = []; - } else { - return; - } - } - if(document.location == "about:blank") return; - - if (!_translate) { - _translate = this.initTranslation(document); - _translate.setHandler("pageModified", function() { - Zotero.Connector_Browser.onPageLoad(document.location.href); - Zotero.Messaging.sendMessage("pageModified", null); - }); - document.addEventListener("ZoteroItemUpdated", function() { - Zotero.debug("Inject: ZoteroItemUpdated event received"); - Zotero.Connector_Browser.onPageLoad(document.location.href); - Zotero.Messaging.sendMessage("pageModified", null); - }, false); - } else { - _translate.setDocument(document); - } - return _translate.getTranslators(true).then(function(translators) { - if (!translators.length && Zotero.isSafari) { - if (!isTopWindow && document.contentType == 'application/pdf') { - return Zotero.Connector_Browser.onPDFFrame(document.location.href, instanceID); - } - } - this.translators = translators; - - translators = translators.map(function(translator) {return translator.serialize(TRANSLATOR_PASSING_PROPERTIES)}); - Zotero.Connector_Browser.onTranslators(translators, instanceID, document.contentType); - }.bind(this)); - } catch(e) { - Zotero.logError(e); - } - }; - - this.initTranslation = function (document, sessionID) { - var translate = new Zotero.Translate.Web(); - translate.setDocument(document); - if (sessionID) { - translate.setHandler("select", function(obj, items, callback) { - // Close the progress window before displaying Select Items - Zotero.Messaging.sendMessage("progressWindow.close", null); - - // If the handler returns a non-undefined value then it is passed - // back to the callback due to backwards compat code in translate.js - (async function() { - // We don't want to show a select dialog -> always choose all items - /* - try { - let response = await Zotero.Connector.callMethod("getSelectedCollection", {}); - if (response.libraryEditable === false) { - return callback([]); - } - } catch (e) { - // Zotero is online but an error occured anyway, so let's log it and display - // the dialog just in case - if (e.status != 0) { - Zotero.logError(e); - } - } - - if (Zotero.isBrowserExt) { - var returnItems = await Zotero.Connector_Browser.onSelect(items); - } else { - returnItems = await Zotero.Inject.onSafariSelect(items); - } - - // If items were selected, reopen the save popup - if (returnItems && !Zotero.Utilities.isEmpty(returnItems)) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - } - */ - callback(items); - }.bind(this))(); - }.bind(this)); - translate.setHandler("itemSaving", function(obj, item) { - // this relays an item from this tab to the top level of the window - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title - } - ); - }); - translate.setHandler("itemDone", function(obj, dbItem, item) { - // this relays an item from this tab to the top level of the window - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title, - progress: 100 - } - ); - for(var i=0; i
    ' - + Zotero.getString( - 'firstRun_text2', - [ - clientName, - // TODO: Make download URL configurable (instead of just base URL + "download") - ZOTERO_CONFIG.WWW_BASE_URL + "download/" - ] - ) - }); - }; - - this.firstSaveToServerPrompt = async function() { - var clientName = ZOTERO_CONFIG.CLIENT_NAME; - - var result = await this.confirm({ - button1Text: Zotero.getString('general_tryAgain'), - button2Text: Zotero.getString('general_cancel'), - button3Text: Zotero.getString('error_connection_enableSavingToOnlineLibrary'), - title: Zotero.getString('error_connection_isAppRunning', clientName), - message: Zotero.getString( - 'error_connection_save', - [ - Zotero.getString('appConnector', clientName), - clientName, - ZOTERO_CONFIG.DOMAIN_NAME - ] - ) - + '

    ' - + Zotero.Inject.getConnectionErrorTroubleshootingString() - }); - - switch (result.button) { - case 1: - return 'retry'; - - case 3: - return 'server'; - - default: - return 'cancel'; - } - }; - - - this.getConnectionErrorTroubleshootingString = function () { - var clientName = ZOTERO_CONFIG.CLIENT_NAME; - var connectorName = Zotero.getString('appConnector', ZOTERO_CONFIG.CLIENT_NAME); - var downloadLink = 'https://www.zotero.org/download/'; - var troubleshootLink = 'https://www.zotero.org/support/kb/connector_zotero_unavailable'; - return Zotero.getString( - 'error_connection_downloadOrTroubleshoot', - [downloadLink, clientName, troubleshootLink] - ); - }; - - /** - * If Zotero is offline and attempting action fallback to zotero.org for first time: prompts about it - * Prompt only available on BrowserExt which supports programmatic injection - * Otherwise just resolves to true - * - * return {Promise} whether the action should proceed - */ - this.checkActionToServer = async function() { - // Pretend that zotero is online - return true; - - /* - var [firstSaveToServer, zoteroIsOnline] = await Zotero.Promise.all([ - Zotero.Prefs.getAsync('firstSaveToServer'), - Zotero.Connector.checkIsOnline() - ]); - if (zoteroIsOnline || !firstSaveToServer) { - return true; - } - var result = await this.firstSaveToServerPrompt(); - if (result == 'server') { - Zotero.Prefs.set('firstSaveToServer', false); - return true; - } else if (result == 'retry') { - // If we perform the retry immediately and Zotero is still unavailable the prompt returns instantly - // making the user interaction confusing so we wait a bit first - await Zotero.Promise.delay(500); - return this.checkActionToServer(); - } - return false; - */ - }; - - this.translate = async function(translatorID, options={}) { - let result = await Zotero.Inject.checkActionToServer(); - if (!result) return; - var translator = this.translators.find((t) => t.translatorID == translatorID); - - // We always want to save again - options.resave = true; - - // In some cases, we just reopen the popup instead of saving again - if (this.sessionDetails.id - // Same page (no history push) - && document.location.href == this.sessionDetails.url - // Same translator - && translatorID == this.sessionDetails.translatorID - // Not a multiple page - && translator.itemType != 'multiple' - // Not "Create Zotero Item and Note from Selection" - && !options.note - // Not from the context menu, which always triggers a resave - && !options.resave) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - return; - } - - var sessionID = Zotero.Utilities.randomString(); - Zotero.Messaging.sendMessage( - "progressWindow.show", - [ - sessionID, - null, - false, - // If we're likely to show the Select Items window, delay the opening of the - // popup until we've had a chance to hide it (which happens in the 'select' - // callback in progressWindow_inject.js). - translator.itemType == 'multiple' ? 100 : null - ] - ); - - this.sessionDetails = { - id: sessionID, - url: document.location.href, - translatorID, - saveOptions: options - }; - - var translate = this.initTranslation(document, sessionID); - var translators = [...this.translators]; - while (translators[0].translatorID != translatorID) { - translators.shift(); - } - while (true) { - translator = translators.shift(); - translate.setTranslator(translator); - try { - let items = await translate.translate({ sessionID }); - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return items; - } catch (e) { - // TEMP: Remove once client switches automatically (added in 5.0.46) - if (e.value && e.value.libraryEditable == false) { - // Allow another attempt to save again - this.sessionDetails = {}; - return; - } - if (translator.itemType != 'multiple') { - if (options.fallbackOnFailure && translators.length) { - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, translators[0].label]); - } - else { - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, "Save as Webpage"]); - return await this._saveAsWebpage({sessionID, snapshot: true}); - } - } - else { - // Clear session details on failure, so another save click tries again - this.sessionDetails = {}; - // We delay opening the progressWindow for multiple items so we don't have to flash it - // for the select dialog. But it comes back to bite us in the butt if a translation - // error occurs immediately since the below command will execute before the progressWindow show, - // and then the delayed progressWindow.show will pop up another empty progress window. - // Cannot have that! - await Zotero.Promise.delay(500); - const isAccessLimitingTranslator = siteAccessLimitsTranslators.has(translator.translatorID); - try { - var statusCode = typeof e == 'string' && e.match(/status code ([0-9]{3})/)[1]; - } catch (e) {} - const isHTTPErrorForbidden = statusCode == '403'; - const isHTTPErrorTooManyRequests = statusCode == '429'; - if ((isAccessLimitingTranslator && isHTTPErrorForbidden) || isHTTPErrorTooManyRequests) { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'siteAccessLimits', translator.label]); - } - else { - Zotero.Messaging.sendMessage("progressWindow.done", [false]); - } - return; - } - } - } - }; - - this.saveAsWebpage = async function (args) { - var title = args[0] || document.title, options = args[1] || {}; - var result = await Zotero.Inject.checkActionToServer(); - if (!result) return; - - var translatorID = 'webpage' + (options.snapshot ? 'WithSnapshot' : ''); - // Reopen if popup instead of resaving - if (this.sessionDetails.id - // Same page (no history push) - && document.location.href == this.sessionDetails.url - // Same translator - && translatorID == this.sessionDetails.translatorID - // Not from the context menu, which always triggers a resave - && !options.resave) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - return; - } - - var sessionID = Zotero.Utilities.randomString(); - return await this._saveAsWebpage({sessionID, title, snapshot: options.snapshot}); - }; - - this._saveAsWebpage = async function(options={}) { - var sessionID = options.sessionID; - var title = options.title || document.title; - var translatorID = 'webpage' + (options.snapshot ? 'WithSnapshot' : ''); - if (!sessionID) { - throw new Error("Trying to save as webpage without session ID"); - } - var data = { - sessionID, - url: document.location.toString(), - cookie: document.cookie, - title: title, - html: document.documentElement.innerHTML, - skipSnapshot: !options.snapshot, - singleFile: true - }; - - var image; - if (document.contentType == 'application/pdf') { - data.pdf = true; - image = "attachment-pdf"; - } else { - image = "webpage"; - } - - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: 1, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title: title - } - ); - - try { - var result = await Zotero.Connector.callMethodWithCookies("saveSnapshot", data); - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { sessionID }); - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: 1, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - - // Once snapshot item is created, if requested, run SingleFile - if (!data.pdf && result && result.saveSingleFile) { - let progressItem = { - sessionID, - id: 2, - iconSrc: Zotero.ItemTypes.getImageSrc("attachment-snapshot"), - title: "Snapshot", - parentItem: 1, - progress: 0 - }; - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", progressItem); - - try { - data.snapshotContent = await Zotero.SingleFile.retrievePageData(); - } - catch (e) { - // Swallow error, will fallback to save in client - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { ...progressItem, ...{ progress: false } }); - } - - try { - result = await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: {"Content-Type": "application/json"} - }, - data - ); - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { ...progressItem, ...{ progress: 100 } }); - } - catch (e) { - if (e.status === 400 && e.value === 'Endpoint does not support content-type\n') { - let snapshotContent = data.snapshotContent; - delete data.snapshotContent; - - data.pageData = { - content: snapshotContent, - resources: {} - }; - - // This means a Zotero client that expects SingleFileZ. We can just feed - // it a payload it is expecting with no resources. - result = await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: {"Content-Type": "multipart/form-data"} - }, - { - payload: JSON.stringify(data) - } - ); - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { ...progressItem, ...{ progress: 100 } }); - } - else { - throw e; - } - } - } - - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - Object.assign(this.sessionDetails, { - id: sessionID, - url: document.location.href, - translatorID - }); - return result; - } catch (e) { - // Client unavailable - if (e.status === 0) { - // Attempt saving to server if not pdf - if (document.contentType != 'application/pdf') { - let itemSaver = new Zotero.Translate.ItemSaver({}); - let items = await itemSaver.saveAsWebpage(); - if (items.length) { - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - id: title, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - } - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return; - } else { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'clientRequired']); - } - } - // Unexpected error, including a timeout (which we don't want to - // result in a save to the server, because it's possible the request - // will still be processed) - else if (!e.value || e.value.libraryEditable != false) { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'unexpectedError']); - } - throw e; - } - } - - this.addKeyboardShortcut = function(eventDescriptor, fn, elem) { - elem = elem || document; - elem.addEventListener('keydown', function ZoteroKeyboardShortcut(event) { - for (let prop in eventDescriptor) { - if (event[prop] != eventDescriptor[prop]) return; - } - event.stopPropagation(); - event.preventDefault(); - fn(); - }); - } -}; - -// check whether this is a hidden browser window being used for scraping -var isHiddenIFrame = false; -try { - isHiddenIFrame = !isTopWindow && window.frameElement && window.frameElement.style.display === "none"; -} catch(e) {} - -const isWeb = window.location.protocol === "http:" || window.location.protocol === "https:"; -const isTestPage = Zotero.isBrowserExt && window.location.href.startsWith(browser.runtime.getURL('test')); -// don't try to scrape on hidden frames -if(!isHiddenIFrame) { - var doInject = async function () { - await Zotero.initInject(); - - if (Zotero.isSafari && isTopWindow) { - Zotero.Connector_Browser.onPageLoad(document.location.href); - } - - // Do not run on non-web pages (file://), test pages, safari extension pages (i.e. safari prefs) - // or non-top Safari pages - if (!isWeb && !isTestPage) return; - // add listener for translate message from extension - Zotero.Messaging.addMessageListener("translate", function(data) { - if(data.shift() !== instanceID) return; - return Zotero.Inject.translate.apply(Zotero.Inject, data); - }); - // add a listener to save as webpage when translators unavailable - Zotero.Messaging.addMessageListener("saveAsWebpage", function(data) { - if (Zotero.isSafari) { - if (data[0] !== instanceID) return; - Zotero.Inject.saveAsWebpage(data[1]) - } else { - Zotero.Inject.saveAsWebpage(data); - } - }); - // add listener to rerun detection on page modifications - Zotero.Messaging.addMessageListener("pageModified", function() { - Zotero.Inject.init(true); - }); - Zotero.Messaging.addMessageListener('historyChanged', function() { - Zotero.Inject.init(true); - }); - - Zotero.Messaging.addMessageListener("firstUse", function () { - return Zotero.Inject.firstUsePrompt(); - }); - - if(document.readyState !== "complete") { - window.addEventListener("pageshow", function(e) { - if(e.target !== document) return; - Zotero.Inject.init(true); - }, false); - } else { - Zotero.Inject.init(); - } - }; - - // Wait until pages in prerender state become visible before injecting - if (document.visibilityState == 'prerender') { - var handler = function() { - doInject(); - document.removeEventListener("visibilitychange", handler); - }; - document.addEventListener("visibilitychange", handler); - } else { - doInject(); - } -} - diff --git a/external-scripts/messages.js b/external-scripts/messages.js deleted file mode 100644 index d34b2192..00000000 --- a/external-scripts/messages.js +++ /dev/null @@ -1,303 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * The MESSAGES array contains two levels. The first level is the NAMESPACE. The second level is the - * METHOD. This sets up messaging so that a call to Zotero.NAMESPACE.METHOD(...) in the - * injected script calls the same function on the global script. - * - * In Chrome, the message passing takes place according to the following sequence: - * 1. Injected script calls Zotero.NAMESPACE.METHOD(...ARGS) - * 2. Injected script sends [NAMESPACE+MESSAGE_SEPARATOR+METHOD, [...ARGS]] - * 3. Global script receives message - * 4. Global script executes Zotero.NAMESPACE.METHOD(...ARGS, TAB, FRAME) - * 5. Zotero.NAMESPACE.METHOD returns a value or promise RESPONSE - * 6. If MESSAGES[NAMESPACE][METHOD] has a preSend function, the RESPONSE is processed - * with the preSend function before sending the response off to injected page - * 7. Global script responds with the RESPONSE - * 8. Injected script receives message - * 9. If MESSAGES[NAMESPACE][METHOD] has a postReceive function, this gets passed RESPONSE - * and returns some result, which is used as the RESPONSE below - * 10. Injected script call Zotero.NAMESPACE.METHOD(...ARGS) resolves with RESPONSE - * - * In Safari, the following takes place: - * 1. Injected script calls Zotero.NAMESPACE.METHOD(ARGS, CALLBACK) - * 2. Injected script generates a REQUESTID from the current time, and adds CALLBACK to - * _safariCallbacks indexed by REQUESTID - * 3. Injected script sends message with name NAMESPACE+MESSAGE_SEPARATOR+METHOD and message - * [TABID, REQUESTID, [ARGS]] - * 4. Global script receives message - * 5. Global script executes Zotero.NAMESPACE.METHOD(ARGS, NEWCALLBACK, TABID) - * 6. Zotero.NAMESPACE.METHOD returns a value or promise RESPONSE - * 7. If MESSAGES[NAMESPACE][METHOD] has a preSend function, the RESPONSE is processed - * with the preSend function before sending the response off to injected page - * 8. Global script sends a message with name - * NAMESPACE+MESSAGE_SEPARATOR+METHOD+MESSAGE_SEPARATOR+"Response" and message - * [REQUESTID, RESPONSE] - * 9. Injected script receives message - * 10. If MESSAGES[NAMESPACE][METHOD] has a postReceive function, this gets passed RESPONSE - * and returns some result, which is used as the RESPONSE below - * 11. Injected script call Zotero.NAMESPACE.METHOD(...ARGS) resolves with RESPONSE - * - * See other messaging scripts for more details. - */ -const MESSAGE_SEPARATOR = "."; -var MESSAGES = { - Translators: { - get: { - background: { - preSend: async function(translators) { - return Zotero.Translators.serialize(translators, TRANSLATOR_PASSING_PROPERTIES); - } - }, - inject: { - postReceive: async function(translator) { - return new Zotero.Translator(translator); - } - } - }, - getAllForType: { - background: { - preSend: async function(translators) { - return Zotero.Translators.serialize(translators, TRANSLATOR_PASSING_PROPERTIES); - }, - }, - inject: { - postReceive: async function(translators) { - return translators.map(function(translator) { - return new Zotero.Translator(translator) - }); - } - } - }, - getWebTranslatorsForLocation: { - background: { - preSend: async function(data) { - return [Zotero.Translators.serialize(data[0], TRANSLATOR_PASSING_PROPERTIES), data[1]]; - } - }, - inject: { - postReceive: async function(data) { - // Deserialize to class objects - data[0] = data[0].map((translator) => new Zotero.Translator(translator)); - data[1] = data[1].map((proxy) => proxy && new Zotero.Proxy(proxy)); - return [data[0], data[1]]; - } - } - }, - getCodeForTranslator: { - inject: { - preSend: async function(args) { - const translator = args[0]; - return [{ - translatorID: translator.translatorID - }]; - } - }, - background: { - postReceive: async function(args) { - let translatorInfo = args[0] - return [await Zotero.Translators.getWithoutCode(translatorInfo.translatorID)]; - } - } - } - }, - Debug: { - bgInit: false, - clear: false, - log: { - response: false, - background: { - minArgs: 4 - } - }, - setStore: false - }, - Connector: { - checkIsOnline: true, - callMethod: true, - callMethodWithCookies: true, - getClientVersion: true, - reportActiveURL: false, - getPref: true - }, - Connector_Browser: { - onSelect: true, - onPageLoad: false, - onTranslators: false, - injectScripts: true, - injectSingleFile: true, - isIncognito: true, - newerVersionRequiredPrompt: true, - openTab: false, - openConfigEditor: false, - openPreferences: false, - bringToFront: true - }, - Connector_Debug: { - storing: true, - get: true, - count: true, - submitReport: true - }, - Errors: { - log: false, - getErrors: true, - sendErrorReport: true - }, - Messaging: { - sendMessage: { - background: { - postReceive: async function(args, tab, frameId) { - // Ensure arg[2] is the current tab - if (args.length > 2) { - args[2] = tab; - } else { - args.push(tab); - } - // If frameId not set then use the top frame - if (args.length <= 3) { - args.push(0); - } - return args; - } - }, - } - }, - API: { - authorize: true, - onAuthorizationComplete: false, - clearCredentials: false, - getUserInfo: true, - run: true, - uploadAttachment: { - inject: { - preSend: async function(args) { - args[0].data = packArrayBuffer(args[0].data); - return args; - } - }, - background: { - postReceive: async function(args) { - args[0].data = await unpackArrayBuffer(args[0].data); - return args; - } - } - } - }, - GoogleDocs_API: { - onAuthComplete: false, - run: { - background: { - minArgs: 4 - } - }, - getDocument: true, - batchUpdateDocument: true - }, - GoogleDocsPluginManager: { - injectUI: true - }, - Prefs: { - set: false, - getAll: true, - getAsync: true, - clear: false - }, - Proxies: { - loadPrefs: false, - save: false, - remove: false - }, - Repo: { - getTranslatorCode: { - response: true, - background: { - minArgs: 2 - } - }, - update: false - }, - WebRequestIntercept: { - replaceUserAgent: true, - } -}; - -MESSAGES.COHTTP = { - request: { - background: { - // avoid trying to post responseXML - preSend: async function(xhr) { - let result = { - response: xhr.response, - status: xhr.status, - statusText: xhr.statusText, - responseHeaders: xhr.getAllResponseHeaders() - }; - if (result.response instanceof ArrayBuffer) { - result.response = packArrayBuffer(xhr.response); - } - return result; - }, - }, - inject: { - postReceive: async function(xhr) { - xhr.getAllResponseHeaders = () => xhr.responseHeaders; - xhr.getResponseHeader = function(name) { - let match = xhr.responseHeaders.match(new RegExp(`^${name}: (.*)$`, 'mi')); - return match ? match[1] : null; - }; - if (xhr.response.startsWith && xhr.response.startsWith('blob:')) { - xhr.response = await unpackArrayBuffer(xhr.response); - } else { - xhr.responseText = xhr.response; - } - return xhr; - } - } - } -}; - -// Chrome does not support passing arrayBuffers via the message -// passing protocol, so we convert it to a blob url and then unconvert it -// on the receiving end. -// There's been an open bug on the chrome bugtracker to fix this since -// 2013: https://bugs.chromium.org/p/chromium/issues/detail?id=248548 -function packArrayBuffer(arrayBuffer) { - if (Zotero.isFirefox) return arrayBuffer; - return URL.createObjectURL(new Blob([arrayBuffer])); -} - -async function unpackArrayBuffer(blobURL) { - if (Zotero.isFirefox) return blobURL; - let blob = await (await fetch(blobURL)).blob(); - return new Promise((resolve) => { - var fileReader = new FileReader(); - fileReader.onload = function(event) { - resolve(event.target.result); - }; - fileReader.readAsArrayBuffer(blob); - }); -} \ No newline at end of file diff --git a/external-scripts/messaging.js b/external-scripts/messaging.js deleted file mode 100644 index a1edbd62..00000000 --- a/external-scripts/messaging.js +++ /dev/null @@ -1,215 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @namespace - * See messages.js for an overview of the message handling process. - */ -Zotero.Messaging = new function() { - var _messageListeners = { - "structuredCloneTest": function() {} - }, - _nextTabIndex = 1; - - /** - * Add a message listener - */ - this.addMessageListener = function(messageName, callback) { - _messageListeners[messageName] = callback; - } - - /** - * Handles a message to the global process received from the injected script in Chrome or Safari - * @param {String} messageName The name of the message received - * @param {Array} args Arguments for to be passed to the function corresponding to this message - * @param {TabObject} tab - * @param {Number} frameId not available in safari - */ - this.receiveMessage = async function(messageName, args, tab, frameId) { - console.log("Messaging: Received message: %s, %s", messageName, args); - if (!Array.isArray(args)) { - args = [args]; - } - - // first see if there is a message listener - if (_messageListeners[messageName]) { - return _messageListeners[messageName](args, tab, frameId); - } - - var messageParts = messageName.split(MESSAGE_SEPARATOR); - try { - var fn = Zotero[messageParts[0]][messageParts[1]]; - if (!fn) { - throw new Error(); - } - } catch (e) { - throw new Error("Zotero." + messageParts[0] + "." + messageParts[1] + " is not defined"); - } - var messageConfig = MESSAGES[messageParts[0]][messageParts[1]]; - - if (messageConfig && messageConfig.background && messageConfig.background.minArgs) { - while (messageConfig.background.minArgs > args.length) { - args.push(undefined); - } - } - - if (messageConfig.background && messageConfig.background.postReceive) { - args = await messageConfig.background.postReceive(args, tab, frameId); - } else { - args.push(tab); - args.push(frameId); - } - - var promise = fn.apply(Zotero[messageParts[0]], args); - if (typeof promise != "object" || typeof promise.then !== "function") promise = Zotero.Promise.resolve(promise); - var shouldRespond = messageConfig && messageConfig.response !== false; - if (shouldRespond) { - return promise.then(async function(response) { - if (messageConfig.background && messageConfig.background.preSend) { - response = await messageConfig.background.preSend(response); - } - return response; - }); - } - }; - - /** - * Sends a message to a tab - */ - this.sendMessage = async function(messageName, args, tab, frameId = 0) { - var response; - if (Zotero.isBookmarklet) { - window.parent.postMessage([messageName, args], "*"); - } - // Use the promise or response callback in BrowserExt for advanced functionality - else if (Zotero.isBrowserExt) { - // Get current tab if not provided - if (!tab) { - tab = (await browser.tabs.query({ - active: true, - lastFocusedWindow: true - }))[0] - } - let options = {}; - if (typeof frameId == 'number') options = { - frameId - }; - - try { - response = await browser.tabs.sendMessage(tab.id, [messageName, args], options); - } catch (e) {} - if (response && response[0] == 'error') { - response[1] = JSON.parse(response[1]); - let e = new Error(response[1].message); - for (let key in response[1]) e[key] = response[1][key]; - throw e; - } - return response; - } //else if(Zotero.isSafari) { } - // Safari handled in safari/messaging_global.js - } - - /** - * Adds messaging listener - */ - this.init = function() { - if (Zotero.isBookmarklet) { - async function listener(event) { - var data = event.data, - source = event.source; - - // Ensure this message was sent by Zotero - if (event.source !== window.parent && event.source !== window) return; - - try { - let response = await Zotero.Messaging.receiveMessage(data[1], data[2]); - var message = [data[0], data[1], response]; - source.postMessage(message, "*"); - } catch (err) { - // Zotero.logError(err); - err = JSON.stringify(Object.assign({ - name: err.name, - message: err.message, - stack: err.stack - }, err)); - var message = [data[0], data[1], - ['error', err] - ]; - source.postMessage(message, "*"); - } - }; - - if (window.addEventListener) { - window.addEventListener("message", listener, false); - } else { - window.attachEvent("onmessage", function() { - listener(event) - }); - } - } else if (Zotero.isBrowserExt) { - browser.runtime.onMessage.addListener(function(request, sender) { - // All Zotero messages are arrays so we ignore everything else - // SingleFile will pass an object in the message so this ignores those. - if (!Array.isArray(request)) { - return; - } - - return Zotero.Messaging.receiveMessage(request[0], request[1], sender.tab, sender.frameId) - .catch(function(err) { - // Zotero.logError(err); - err = JSON.stringify(Object.assign({ - name: err.name, - message: err.message, - stack: err.stack - }, err)); - return ['error', err]; - }); - }); - } else if (Zotero.isSafari) { - // Safari handled in safari/messaging_global.js - Zotero.Messaging.initialized = true; - } - } - - /** - * Gets the ID of a given tab in Safari - * Inspired by port.js from adblockforchrome by Michael Gundlach - */ - function _ensureSafariTabID(tab) { - // if tab already has an ID, don't set a new one - if (tab.id) return; - - // set tab ID - tab.id = _nextTabIndex++; - - // remove old tabs that no longer exist from _safariTabs - _safariTabs = _safariTabs.filter(function(t) { - return t.browserWindow != null; - }); - - // add tab to _safariTabs so that it doesn't get garbage collected and we can keep ID - _safariTabs.push(tab); - } -} \ No newline at end of file diff --git a/external-scripts/messaging_inject.js b/external-scripts/messaging_inject.js deleted file mode 100644 index d42d81c9..00000000 --- a/external-scripts/messaging_inject.js +++ /dev/null @@ -1,137 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @namespace - * See messages.js for an overview of the message handling process. - */ -Zotero.Messaging = new function() { - var _messageListeners = {}; - - /** - * Add a message listener - */ - this.addMessageListener = function(messageName, callback) { - _messageListeners[messageName] = callback; - } - - /** - * Adds messaging functions to injected script. This adds Zotero.xxx.yyy functions for all - * entries in MESSAGES. These will send a message to the global script and return a promise. - * When a message is received, they will resolve the promise and call the callback function, - * which can be passed as the last argument to Zotero.xxx.yyy. - */ - this.init = function() { - for (var ns in MESSAGES) { - if (!Zotero[ns]) Zotero[ns] = {}; - for (var meth in MESSAGES[ns]) { - Zotero[ns][meth] = new function() { - var messageName = ns + MESSAGE_SEPARATOR + meth; - var messageConfig = MESSAGES[ns][meth]; - return async function() { - // see if last argument is a callback - var callback, callbackArg = null; - if (messageConfig) { - callbackArg = (messageConfig.callbackArg ? - messageConfig.callbackArg : arguments.length - 1); - callback = arguments[callbackArg]; - if (typeof callback !== "function") { - // Zotero.debug("Message `"+messageName+"` has no callback arg. It should use the returned promise", 5); - callbackArg = null; - } - } - - // copy arguments to newArgs - var newArgs = new Array(arguments.length); - for (var i = 0; i < arguments.length; i++) { - newArgs[i] = i === callbackArg ? undefined : arguments[i]; - } - if (messageConfig.inject && messageConfig.inject.preSend) { - newArgs = await messageConfig.inject.preSend(newArgs); - } - - // send message - return browser.runtime.sendMessage([messageName, newArgs]).then(async function(response) { - if (response && response[0] == 'error') { - response[1] = JSON.parse(response[1]); - let e = new Error(response[1].message); - for (let key in response[1]) e[key] = response[1][key]; - throw e; - } - try { - if (messageConfig.inject && messageConfig.inject.postReceive) { - response = await messageConfig.inject.postReceive(response); - } - if (callbackArg !== null) callback(response); - return response; - } catch (e) { - Zotero.logError(e); - throw e; - } - }, - function(e) { - // Unclear what to do with these. Chrome doesn't have error instance defined - // and these could be simply messages saying that no response was received for - // calls that didn't expect a resposne either. - // Either way, if we should be at least expecting a response and get an error we - // throw - if (messageConfig && messageConfig.response !== false) { - Zotero.logError(e); - throw e; - } - }); - }; - }; - } - } - - // NOTE: Do not convert to `browser.` API! - // If there are message listeners on multiple frames (or multiple listeners on the same frame) - // and you need to respond from a specific one, Firefox does not respect the `undefined` - // return value and will resolve the `undefined` back to the background page - // from whichever listener returns undefined first. - // There is also extended discussion on what's going to be the final API, - // e.g. on the browser-polyfill github https://github.com/mozilla/webextension-polyfill/pull/97 - chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { - if (typeof request !== "object" || !request.length || !_messageListeners[request[0]]) return; - (async function messageListener() { - Zotero.debug(request[0] + " message received in injected page " + window.location.href); - var result; - try { - result = await _messageListeners[request[0]](request[1]) - } catch (err) { - // Zotero.logError(err); - result = ['error', JSON.stringify(Object.assign({ - name: err.name, - message: err.message, - stack: err.stack - }, err))]; - } - sendResponse(result); - })(); - return true; - }); - } -} \ No newline at end of file diff --git a/external-scripts/openurl.js b/external-scripts/openurl.js deleted file mode 100644 index 142240c7..00000000 --- a/external-scripts/openurl.js +++ /dev/null @@ -1,468 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - - var OpenURL = new function() { - this.createContextObject = createContextObject; - this.parseContextObject = parseContextObject; - - /* - * Generates an OpenURL ContextObject from an item - */ - function createContextObject(item, version, asObj) { - var entries = (asObj ? {} : []); - - function _mapTag(data, tag, dontAddPrefix) { - if (!data) return; - - if (version === "1.0" && !dontAddPrefix) tag = "rft." + tag; - - if (asObj) { - if (!entries[tag]) entries[tag] = []; - entries[tag].push(data); - } else { - entries.push(tag + "=" + encodeURIComponent(data)); - } - } - - if (item.toJSON) { - item = item.toJSON(); - } - - // find pmid - const pmidRe = /(?:\n|^)PMID:\s*(\d+)/g; - var pmid = pmidRe.exec(item.extra); - if (pmid) pmid = pmid[1]; - - // encode ctx_ver (if available) and encode identifiers - if (version == "0.1") { - _mapTag("Zotero:2", "sid", true); - if (item.DOI) _mapTag("doi:" + item.DOI, "id", true); - if (item.ISBN) _mapTag(item.ISBN, "isbn", true); - if (pmid) _mapTag("pmid:" + pmid, "id", true); - } else { - _mapTag("Z39.88-2004", "url_ver", true); - _mapTag("Z39.88-2004", "ctx_ver", true); - _mapTag("info:sid/zotero.org:2", "rfr_id", true); - if (item.DOI) _mapTag("info:doi/" + item.DOI, "rft_id", true); - if (item.ISBN) _mapTag("urn:isbn:" + item.ISBN, "rft_id", true); - if (pmid) _mapTag("info:pmid/" + pmid, "rft_id", true); - } - - // encode genre and item-specific data - if (item.itemType == "journalArticle") { - if (version === "1.0") { - _mapTag("info:ofi/fmt:kev:mtx:journal", "rft_val_fmt", true); - } - _mapTag("article", "genre"); - - _mapTag(item.title, "atitle"); - _mapTag(item.publicationTitle, (version == "0.1" ? "title" : "jtitle")); - _mapTag(item.journalAbbreviation, "stitle"); - _mapTag(item.volume, "volume"); - _mapTag(item.issue, "issue"); - } else if (item.itemType == "book" || item.itemType == "bookSection" || item.itemType == "conferencePaper" || item.itemType == "report") { - if (version === "1.0") { - _mapTag("info:ofi/fmt:kev:mtx:book", "rft_val_fmt", true); - } - - if (item.itemType == "book") { - _mapTag("book", "genre"); - _mapTag(item.title, (version == "0.1" ? "title" : "btitle")); - } else if (item.itemType == "conferencePaper") { - _mapTag("proceeding", "genre"); - _mapTag(item.title, "atitle"); - _mapTag(item.proceedingsTitle, (version == "0.1" ? "title" : "btitle")); - } else if (item.itemType == "report") { - _mapTag("report", "genre"); - _mapTag(item.seriesTitle, "series"); - _mapTag(item.title, (version == "0.1" ? "title" : "btitle")); - } else { - _mapTag("bookitem", "genre"); - _mapTag(item.title, "atitle"); - _mapTag(item.publicationTitle, (version == "0.1" ? "title" : "btitle")); - } - - _mapTag(item.place, "place"); - _mapTag(item.publisher, "publisher"); - _mapTag(item.edition, "edition"); - _mapTag(item.series, "series"); - } else if (item.itemType == "thesis" && version == "1.0") { - _mapTag("info:ofi/fmt:kev:mtx:dissertation", "rft_val_fmt", true); - - _mapTag(item.title, "title"); - _mapTag(item.publisher, "inst"); - _mapTag(item.type, "degree"); - } else if (item.itemType == "patent" && version == "1.0") { - _mapTag("info:ofi/fmt:kev:mtx:patent", "rft_val_fmt", true); - - _mapTag(item.title, "title"); - _mapTag(item.assignee, "assignee"); - _mapTag(item.patentNumber, "number"); - - if (item.issueDate) { - _mapTag(Zotero.Date.strToISO(item.issueDate), "date"); - } - } else { - //we map as much as possible to DC for all other types. This will export some info - //and work very nicely on roundtrip. All of these fields legal for mtx:dc according to - //http://alcme.oclc.org/openurl/servlet/OAIHandler/extension?verb=GetMetadata&metadataPrefix=mtx&identifier=info:ofi/fmt:kev:mtx:dc - _mapTag("info:ofi/fmt:kev:mtx:dc", "rft_val_fmt", true); - //lacking something better we use Zotero item types here; no clear alternative and this works for roundtrip - _mapTag(item.itemType, "type"); - _mapTag(item.title, "title"); - _mapTag(item.publicationTitle, "source"); - _mapTag(item.rights, "rights"); - _mapTag(item.publisher, "publisher"); - _mapTag(item.abstractNote, "description"); - if (item.DOI) { - _mapTag("urn:doi:" + item.DOI, "identifier"); - } else if (item.url) { - _mapTag(item.url, "identifier"); - } - } - - if (item.creators && item.creators.length) { - // encode first author as first and last - let firstCreator = Zotero.Utilities.Item.getFirstCreatorFromItemJSON(item); - if (item.itemType == "patent") { - _mapTag(firstCreator.firstName, "invfirst"); - _mapTag(firstCreator.lastName, "invlast"); - } else { - if (firstCreator.isInstitution) { - _mapTag(firstCreator.lastName, "aucorp"); - } else { - _mapTag(firstCreator.firstName, "aufirst"); - _mapTag(firstCreator.lastName, "aulast"); - } - } - - // encode subsequent creators as au - for (var i = 0; i < item.creators.length; i++) { - _mapTag((item.creators[i].firstName ? item.creators[i].firstName + " " : "") + - item.creators[i].lastName, (item.itemType == "patent" ? "inventor" : "au")); - } - } - - if (item.date) { - _mapTag(Zotero.Date.strToISO(item.date), (item.itemType == "patent" ? "appldate" : "date")); - } - if (item.pages) { - _mapTag(item.pages, "pages"); - var pages = item.pages.split(/[-–]/); - if (pages.length > 1) { - _mapTag(pages[0], "spage"); - if (pages.length >= 2) _mapTag(pages[1], "epage"); - } - } - _mapTag(item.numPages, "tpages"); - _mapTag(item.ISBN, "isbn"); - _mapTag(item.ISSN, "issn"); - _mapTag(item.language, "language"); - if (asObj) return entries; - return entries.join("&"); - } - - function _cloneIfNecessary(obj1, obj2) { - if (Zotero.isFx && !Zotero.isBookmarklet) { - return Components.utils.cloneInto(obj1, obj2); - } - return obj1; - } - - /* - * Generates an item in the format returned by item.fromArray() given an - * OpenURL version 1.0 contextObject - * - * accepts an item array to fill, or creates and returns a new item array - */ - function parseContextObject(co, item) { - if (!item) { - var item = new Array(); - item.creators = new Array(); - } - - var coParts = co.split("&"); - - // get type - for (var i = 0; i < coParts.length; i++) { - if (coParts[i].substr(0, 12) == "rft_val_fmt=") { - var format = decodeURIComponent(coParts[i].substr(12)); - if (format == "info:ofi/fmt:kev:mtx:journal") { - item.itemType = "journalArticle"; - break; - } else if (format == "info:ofi/fmt:kev:mtx:book") { - if (coParts.indexOf("rft.genre=bookitem") !== -1) { - item.itemType = "bookSection"; - } else if (coParts.indexOf("rft.genre=conference") !== -1 || coParts.indexOf("rft.genre=proceeding") !== -1) { - item.itemType = "conferencePaper"; - } else if (coParts.indexOf("rft.genre=report") !== -1) { - item.itemType = "report"; - } else if (coParts.indexOf("rft.genre=document") !== -1) { - item.itemType = "document"; - } else { - item.itemType = "book"; - } - break; - } else if (format == "info:ofi/fmt:kev:mtx:dissertation") { - item.itemType = "thesis"; - break; - } else if (format == "info:ofi/fmt:kev:mtx:patent") { - item.itemType = "patent"; - break; - } else if (format == "info:ofi/fmt:kev:mtx:dc") { - item.itemType = "webpage"; - break; - } - } - } - if (!item.itemType) { - return false; - } - - var pagesKey = ""; - - // keep track of "aucorp," "aufirst," "aulast" - var complexAu = new Array(); - - for (var i = 0; i < coParts.length; i++) { - var keyVal = coParts[i].split("="); - var key = keyVal[0]; - var value = decodeURIComponent(keyVal[1].replace(/\+|%2[bB]/g, " ")); - if (!value) { - continue; - } - - if (key == "rft_id") { - var firstEight = value.substr(0, 8).toLowerCase(); - if (firstEight == "info:doi") { - item.DOI = value.substr(9); - } else if (firstEight == "urn:isbn") { - item.ISBN = value.substr(9); - } else if (value.match(/^https?:\/\//)) { - item.url = value; - item.accessDate = ""; - } - } else if (key == "rft.btitle") { - if (item.itemType == "book" || item.itemType == "report") { - item.title = value; - } else if (item.itemType == "bookSection" || item.itemType == "conferencePaper") { - item.publicationTitle = value; - } - } else if (key == "rft.atitle" && - ["journalArticle", "bookSection", "conferencePaper"].indexOf(item.itemType) !== -1) { - item.title = value; - } else if (key == "rft.jtitle" && item.itemType == "journalArticle") { - item.publicationTitle = value; - } else if (key == "rft.stitle" && item.itemType == "journalArticle") { - item.journalAbbreviation = value; - } else if (key == "rft.title") { - if (["journalArticle", "bookSection", "conferencePaper"].indexOf(item.itemType) !== -1) { - item.publicationTitle = value; - } else { - item.title = value; - } - } else if (key == "rft.date") { - if (item.itemType == "patent") { - item.issueDate = value; - } else { - item.date = value; - } - } else if (key == "rft.volume") { - item.volume = value; - } else if (key == "rft.issue") { - item.issue = value; - } else if (key == "rft.pages") { - pagesKey = key; - item.pages = value; - } else if (key == "rft.spage") { - if (pagesKey != "rft.pages") { - // make pages look like start-end - if (pagesKey == "rft.epage") { - if (value != item.pages) { - item.pages = value + "-" + item.pages; - } - } else { - item.pages = value; - } - pagesKey = key; - } - } else if (key == "rft.epage") { - if (pagesKey != "rft.pages") { - // make pages look like start-end - if (pagesKey == "rft.spage") { - if (value != item.pages) { - item.pages = item.pages + "-" + value; - } - } else { - item.pages = value; - } - pagesKey = key; - } - } else if (key == "rft.issn" || (key == "rft.eissn" && !item.ISSN)) { - item.ISSN = value; - } else if (key == "rft.aulast" || key == "rft.invlast") { - var lastCreator = complexAu[complexAu.length - 1]; - if (complexAu.length && !lastCreator.lastName && !lastCreator.institutional) { - lastCreator.lastName = value; - } else { - complexAu.push(_cloneIfNecessary({ - lastName: value, - creatorType: (key == "rft.aulast" ? "author" : "inventor"), - offset: item.creators.length - }, item)); - } - } else if (key == "rft.aufirst" || key == "rft.invfirst") { - var lastCreator = complexAu[complexAu.length - 1]; - if (complexAu.length && !lastCreator.firstName && !lastCreator.institutional) { - lastCreator.firstName = value; - } else { - complexAu.push(_cloneIfNecessary({ - firstName: value, - creatorType: (key == "rft.aufirst" ? "author" : "inventor"), - offset: item.creators.length - }, item)); - } - } else if (key == "rft.au" || key == "rft.creator" || key == "rft.contributor" || key == "rft.inventor") { - if (key == "rft.contributor") { - var type = "contributor"; - } else if (key == "rft.inventor") { - var type = "inventor"; - } else { - var type = "author"; - } - - item.creators.push(_cloneIfNecessary(Zotero.Utilities.cleanAuthor(value, type, value.indexOf(",") !== -1), item)); - } else if (key == "rft.aucorp") { - complexAu.push(_cloneIfNecessary({ - lastName: value, - isInstitution: true - }, item)); - } else if (key == "rft.isbn" && !item.ISBN) { - item.ISBN = value; - } else if (key == "rft.pub" || key == "rft.publisher") { - item.publisher = value; - } else if (key == "rft.place") { - item.place = value; - } else if (key == "rft.tpages") { - item.numPages = value; - } else if (key == "rft.edition") { - item.edition = value; - } else if (key == "rft.series") { - if (item.itemType == "report") { - item.seriesTitle = value; - } else { - item.series = value; - } - } else if (item.itemType == "thesis") { - if (key == "rft.inst") { - item.publisher = value; - } else if (key == "rft.degree") { - item.type = value; - } - } else if (item.itemType == "patent") { - if (key == "rft.assignee") { - item.assignee = value; - } else if (key == "rft.number") { - item.patentNumber = value; - } else if (key == "rft.appldate") { - item.date = value; - } - } else { - // The following keys are technically only valid in Dublin Core - // (i.e., format == "info:ofi/fmt:kev:mtx:dc") but in practice - // 'format' is not always set - if (key == "rft.identifier") { - if (value.length > 8) { // we could check length separately for - // each type, but all of these identifiers - // must be > 8 characters - if (value.substr(0, 5) == "ISBN ") { - item.ISBN = value.substr(5); - } else if (value.substr(0, 5) == "ISSN ") { - item.ISSN = value.substr(5); - } else if (value.substr(0, 8) == "urn:doi:") { - item.DOI = value.substr(4); - } else if (value.substr(0, 7) == "http://" || value.substr(0, 8) == "https://") { - item.url = value; - } - } - } else if (key == "rft.description") { - item.abstractNote = value; - } else if (key == "rft.rights") { - item.rights = value; - } else if (key == "rft.language") { - item.language = value; - } else if (key == "rft.subject") { - item.tags.push(value); - } else if (key == "rft.type") { - if (Zotero.Utilities.Item.itemTypeExists(value)) item.itemType = value; - } else if (key == "rft.source") { - item.publicationTitle = value; - } - } - } - - // To maintain author ordering when complex and simple authors are combined, - // we remember where they were and the correct offsets - var inserted = 0; - - // combine two lists of authors, eliminating duplicates - for (var i = 0; i < complexAu.length; i++) { - var pushMe = true; - var offset = complexAu[i].offset; - delete complexAu[i].offset; - for (var j = 0; j < item.creators.length; j++) { - // if there's a plain author that is close to this author (the - // same last name, and the same first name up to a point), keep - // the plain author, since it might have a middle initial - if (item.creators[j].lastName == complexAu[i].lastName && - item.creators[j].firstName && - ((item.creators[j].firstName == "" && complexAu[i].firstName == "") || - (item.creators[j].firstName.length >= complexAu[i].firstName.length && - item.creators[j].firstName.substr(0, complexAu[i].firstName.length) == complexAu[i].firstName))) { - pushMe = false; - break; - } - } - // Splice in the complex creator at the correct location, - // accounting for previous insertions - if (pushMe) { - item.creators.splice(offset + inserted, 0, complexAu[i]); - inserted++; - } - } - - return item; - } - } - - if (typeof module != 'undefined') { - module.exports = OpenURL; - } else if (typeof Zotero != 'undefined') { - Zotero.OpenURL = OpenURL; - } - -})(); \ No newline at end of file diff --git a/external-scripts/prefs.js b/external-scripts/prefs.js deleted file mode 100644 index e7343469..00000000 --- a/external-scripts/prefs.js +++ /dev/null @@ -1,86 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * There's a limit of 5MB of locally stored data. - * https://developer.chrome.com/extensions/storage#property-local - */ -Zotero.Prefs = Object.assign(Zotero.Prefs, { - init: async function() { - await this.migrate(); - try { - this.syncStorage = await browser.storage.local.get(null); - } catch (e) { - Zotero.debug("Prefs initialization failed"); - Zotero.logError(e); - } - }, - - migrate: async function() { - try { - if (!localStorage.length) return; - let prefs = Object.assign({}, localStorage); - for (let k of Object.keys(prefs)) { - if (k.substr(0, 'pref-'.length) == 'pref-') { - prefs[k.substr('pref-'.length)] = JSON.parse(prefs[k]); - } - delete prefs[k]; - } - // If translator metadata migration fails then we need the fetching from repo to - // fetch the full list - delete prefs["connector.repo.lastCheck.repoTime"]; - delete prefs["connector.repo.lastCheck.localTime"]; - await browser.storage.local.set(prefs); - - if ('translatorMetadata' in localStorage) { - await browser.storage.local.set({ - translatorMetadata: JSON.parse(localStorage['translatorMetadata']) - }); - } - localStorage.clear() - } catch (e) { - Zotero.debug('Attempting to migrate prefs threw an error'); - // Let's not, since this will log on every start for firefox people with - // dom.storage.enabled: false - // Zotero.logError(e); - Zotero.debug(e.message); - } - }, - - set: function(pref, value) { - Zotero.debug("Setting " + pref + " to " + JSON.stringify(value).substr(0, 100)); - let prefs = {}; - prefs[pref] = value; - - this.syncStorage[pref] = value; - return browser.storage.local.set(prefs); - }, - - clear: function(pref) { - if (Array.isArray(pref)) return Zotero.Promise.all(pref.map((p) => this.clear(p))); - delete this.syncStorage[pref]; - return browser.storage.local.remove(pref); - } -}); \ No newline at end of file diff --git a/external-scripts/promise.js b/external-scripts/promise.js deleted file mode 100644 index 358adb9e..00000000 --- a/external-scripts/promise.js +++ /dev/null @@ -1,73 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/* - * Polyfill some of bluebirds methods to retain code readability in shared - * translator code. - */ - -Zotero.Promise = Promise; - -Zotero.Promise.method = function(fn) { - return function() { - try { - var val = fn.apply(this, arguments); - var promise; - let isResolved = false; - if (val && val.then) { - promise = val; - } else { - promise = Promise.resolve(val); - isResolved = true; - } - if (typeof promise.isResolved === 'undefined') { - promise.then(() => isResolved = true); - promise.isResolved = () => isResolved; - } - return promise; - } catch (e) { - return Promise.reject(e); - } - } -}; - -Zotero.Promise.defer = function() { - var deferred = {}; - deferred.promise = new Promise(function(resolve, reject) { - deferred.resolve = resolve; - deferred.reject = reject; - }); - return deferred; -} - -Zotero.Promise.delay = function(timeout) { - return new Promise(function(resolve) { - setTimeout(resolve, timeout); - }); -} - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = Zotero.Promise; -} \ No newline at end of file diff --git a/external-scripts/proxy.js b/external-scripts/proxy.js deleted file mode 100644 index fd062d47..00000000 --- a/external-scripts/proxy.js +++ /dev/null @@ -1,1115 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Intercepts web requests to detect and redirect proxies. Loosely based on Zotero for Firefox proxy code. - * - * Zotero.Proxies.Detectors specifies detector functions/objects, which run asynchronously for every - * request and add new proxies based on proxy specific rule match - * - * Zotero.Proxies.proxies defines a list of already known proxies (Zotero.Proxy), based on an URL match scheme. - * - * Each Zotero.Proxy holds a list of already recognized hosts (previously accessed via the proxy - * by the user) and automatically redirects the requests to these hosts via the proxy. - */ - -(function() { - - "use strict"; - - //var url = require('url'); - - /** - * A singleton to handle URL rewriting proxies - * @namespace - * @property transparent {Boolean} Whether transparent proxy functionality is enabled - * @property proxies {Zotero.Proxy[]} All loaded proxies - * @property hosts {Zotero.Proxy{}} Object mapping hosts to proxies - */ - Zotero.Proxies = new function() { - /** - * Initializes the proxy settings - * @returns Promise{boolean} proxy enabled/disabled status - */ - this.init = function() { - if (Zotero.isSafari) return; - this.transparent = false; - this.proxies = []; - this.hosts = {}; - this._ignoreURLs = new Set(); - - this.loadPrefs(); - - Zotero.Proxies.lastIPCheck = 0; - Zotero.Proxies.disabledByDomain = false; - - Zotero.Proxies.proxies = Zotero.Prefs.get('proxies.proxies').map(function(proxy) { - proxy = new Zotero.Proxy(proxy); - for (let host of proxy.hosts) { - Zotero.Proxies.hosts[host] = proxy; - } - return proxy; - }); - - if (this.transparent) { - Zotero.Proxies.loadFromClient(); - } - }; - - this.loadPrefs = function() { - Zotero.Proxies.transparent = Zotero.Prefs.get("proxies.transparent"); - Zotero.Proxies.autoRecognize = Zotero.isBrowserExt && - Zotero.Proxies.transparent && Zotero.Prefs.get("proxies.autoRecognize"); - - var disableByDomainPref = Zotero.Prefs.get("proxies.disableByDomain"); - Zotero.Proxies.disableByDomain = (Zotero.Proxies.transparent && disableByDomainPref ? Zotero.Prefs.get("proxies.disableByDomainString") : null); - Zotero.Proxies.showRedirectNotification = Zotero.Prefs.get("proxies.showRedirectNotification"); - - if (this.transparent) { - this.enable(); - this.updateDisabledByDomain(); - } else { - this.disable(); - } - }; - - this.enable = function() { - if (Zotero.isBrowserExt) { - Zotero.WebRequestIntercept.addListener('headersReceived', Zotero.Proxies.onWebRequest); - } else { - safari.application.addEventListener('beforeNavigate', this.onBeforeNavigateSafari, false); - } - }; - - - this.disable = function() { - if (Zotero.isBrowserExt) { - Zotero.WebRequestIntercept.removeListener('headersReceived', Zotero.Proxies.onWebRequest); - } else { - safari.application.removeEventListener('beforeNavigate', this.onBeforeNavigateSafari, false); - } - }; - - - this.updateDisabledByDomain = function() { - if (!Zotero.Proxies.disableByDomain) return; - let now = Date.now(); - if (now - this.lastIPCheck > 15 * 60 * 1000) { - this.lastIPCheck = now; - Zotero.Proxies.DNS.getHostnames().then(function(hosts) { - // if domains necessitate disabling, disable them - Zotero.Proxies.disabledByDomain = false; - for (var host of hosts) { - Zotero.Proxies.disabledByDomain = host.toLowerCase().indexOf(Zotero.Proxies.disableByDomain) != -1; - if (Zotero.Proxies.disabledByDomain) return; - } - - // IP update interval is every 15 minutes - }.bind(this)); - } - }; - - this.loadFromClient = function() { - if (Zotero.Prefs.get('proxies.clientChecked')) return; - return Zotero.Connector.callMethod('proxies', null).then(function(result) { - for (let proxy of result) { - if (proxy.scheme.includes('://')) { - proxy.scheme = proxy.scheme.substr(proxy.scheme.indexOf('://') + 3); - proxy.dotsToHyphens = true; - } - let existingProxy; - for (let p of Zotero.Proxies.proxies) { - if (proxy.scheme == p.scheme) { - existingProxy = p; - break; - } - } - if (existingProxy) { - // Copy hosts from the client if proxy already exists - existingProxy.hosts.push.apply(existingProxy.hosts, proxy.hosts); - existingProxy.hosts = Array.from(new Set(existingProxy.hosts)); - } else { - // Otherwise add the proxy - Zotero.Proxies.save(new Zotero.Proxy(proxy)); - } - } - - Zotero.Prefs.set('proxies.clientChecked', true); - return result; - }, () => 0); - } - - this.onBeforeNavigateSafari = function(e) { - // Safari calls onBeforeNavigate from default tab while typing the url - // so if you type a proxied url you immediatelly get redirected without pressing enter. - // Not cool. - if (!e.target.url) return; - let details = { - url: e.url || '', - originUrl: e.target.url, - type: 'main_frame', - requestHeadersObject: {}, - tabId: e.target - }; - - Zotero.Proxies.updateDisabledByDomain(); - if (Zotero.Proxies.disabledByDomain) return; - let redirect = Zotero.Proxies._maybeRedirect(details); - if (redirect) { - e.target.url = redirect.redirectUrl; - } - }; - - this.onPageLoadSafari = function(tab) { - let details = { - url: tab.url, - type: 'main_frame', - tabId: tab, - statusCode: 200 - }; - - Zotero.Proxies._maybeAddHost(details); - }; - - /** - * Observe method to capture and redirect page loads if they're going through an existing proxy. - * - * @param {Object} details - webRequest details object - */ - this.onWebRequest = function(details, meta) { - if (meta.proxyRedirected || Zotero.Proxies._ignoreURLs.has(details.url) || details.statusCode >= 400 || - details.frameId != 0) { - return; - } - - Zotero.Proxies._maybeAddHost(details); - - if (Zotero.Proxies.autoRecognize) { - Zotero.Proxies._recognizeProxy(details); - } - - Zotero.Proxies.updateDisabledByDomain(); - if (Zotero.Proxies.disabledByDomain) return; - - let redirect = Zotero.Proxies._maybeRedirect(details); - if (redirect) { - meta.proxyRedirected = true; - } - return redirect; - }; - - this._maybeAddHost = function(details) { - - // see if there is a proxy we already know - var m = false; - for (var proxy of Zotero.Proxies.proxies) { - if (proxy.regexp) { - m = proxy.regexp.exec(details.url); - if (m) break; - } - } - if (!m) return; - - let host = m[proxy.parameters.indexOf("%h") + 1]; - // Unhyphenate host before checking it - // - // DEBUG: If a site has a valid hyphen in it, we probably won't redirect it properly, - // because we'll add the host with a dot instead and won't match it when the original - // unproxied site is loaded with the hyphen. - if (!host.includes('.')) { - host = host.replace(/-/g, '.'); - } - - let shouldRemapHostToMatchedProxy = false; - let associatedProxy = Zotero.Proxies.hosts[host]; - if (associatedProxy && associatedProxy.scheme.substr(0, 5) != 'https') { - let secureAssociatedProxyScheme = associatedProxy.scheme.substr(0, 4) + 's' + associatedProxy.scheme.substr(4); - // I.e. if we matched a proxy with a scheme like https://%h.proxy.edu/%p - // (which means that we navigated to https://%h/%p) and the host was previously associated with a - // proxy with a scheme like http://%h.proxy.edu/%p, we remap this host to be mapped to the - // https proxy instead - shouldRemapHostToMatchedProxy = secureAssociatedProxyScheme == proxy.scheme - } - // add this host if we know a proxy - if (proxy.autoAssociate // if autoAssociate is on - && - details.statusCode < 300 // and query was successful - && - (!Zotero.Proxies.hosts[host] || shouldRemapHostToMatchedProxy) // and host is not saved - && - proxy.hosts.indexOf(host) === -1 && - !Zotero.Proxies._isBlacklisted(host) // and host is not blacklisted - ) { - if (shouldRemapHostToMatchedProxy) { - associatedProxy.hosts = associatedProxy.hosts.filter(h => h != host); - Zotero.Proxies.save(associatedProxy); - } - proxy.hosts.push(host); - Zotero.Proxies.save(proxy); - - _showNotification( - 'New Zotero Proxy Host', - `Zotero automatically associated ${host} with a previously defined proxy. Future requests to this site will be redirected through ${proxy.toDisplayName()}.`, - ["✕", "Proxy Settings", "Don’t Proxy This Site"], - details.tabId - ) - .then(function(response) { - if (response == 1) Zotero.Connector_Browser.openPreferences("proxies"); - if (response == 2) { - - proxy.hosts = proxy.hosts.filter((h) => h != host); - Zotero.Proxies.save(proxy); - return browser.tabs.update(details.tabId, { - url: proxy.toProper(details.url) - }) - } - }); - } - }; - - this._recognizeProxy = function(details) { - async function notifyNewProxy(proxy, proxiedHost) { - let response = await _showNotification( - 'New Zotero Proxy', - `Zotero detected that you are accessing ${proxy.hosts[proxy.hosts.length-1]} through a proxy. Would you like to automatically redirect future requests to ${proxy.hosts[proxy.hosts.length-1]} through ${proxy.toDisplayName()}?`, - ['✕', 'Proxy Settings', 'Accept'], - details.tabId - ); - if (response == 2) { - let result = await Zotero.Messaging.sendMessage('confirm', { - title: 'Only add proxies linked from your library, school, or corporate website', - message: 'Adding other proxies allows malicious sites to masquerade as sites you trust.

    ' + - 'Adding this proxy will allow Zotero to recognize items from proxied pages and will automatically ' + - `redirect future requests to ${proxy.hosts[proxy.hosts.length - 1]} through ${proxy.toDisplayName()}.`, - button1Text: 'Add Proxy', - button2Text: 'Cancel' - }); - if (result.button == 1) { - return Zotero.Proxies.save(proxy); - } - } - if (response == 1) { - Zotero.Connector_Browser.openPreferences("proxies"); - // This is a bit of a hack. - // Technically the notification can take an onClick handler, but we cannot - // pass functions from background to content scripts easily - // so to "keep the notification open" we display it agian - return notifyNewProxy(proxy, proxiedHost); - } - } - - // perform in the next event loop step to reduce impact of header processing in a blocking call - setTimeout(function() { - var proxy = false; - for (var detectorName in Zotero.Proxies.Detectors) { - var detector = Zotero.Proxies.Detectors[detectorName]; - try { - proxy = detector(details); - } catch (e) { - Zotero.logError(e); - } - - if (!proxy) continue; - let requestURI = url.parse(details.url); - Zotero.debug("Proxies: Detected " + detectorName + " proxy " + proxy.scheme + " for " + requestURI.host); - - notifyNewProxy(proxy, requestURI.host); - - break; - } - }); - }; - - this._maybeRedirect = function(details) { - var proxied = Zotero.Proxies.properToProxy(details.url, true); - if (!proxied - // Don't redirect https websites via http proxies - || - details.url.substr(0, 5) == 'https' && proxied.substr(0, 5) != 'https') return; - - var proxiedURI = url.parse(proxied); - if (details.requestHeadersObject['referer']) { - // If the referrer is a proxiable host, we already have access (e.g., we're - // on-campus) and shouldn't redirect - if (Zotero.Proxies.properToProxy(details.requestHeadersObject['referer'], true)) { - Zotero.debug("Proxies: skipping redirect; referrer was proxiable"); - return; - } - // If the referrer is the same host as we're about to redirect to, we shouldn't - // or we risk a loop - if (url.parse(details.requestHeadersObject['referer']).hostname == proxiedURI.hostname) { - Zotero.debug("Proxies: skipping redirect; redirect URI and referrer have same host"); - return; - } - } - - if (details.originUrl) { - // If the original URI was a proxied host, we also shouldn't redirect, since any - // links handed out by the proxy should already be proxied - if (Zotero.Proxies.proxyToProper(details.originUrl, true)) { - Zotero.debug("Proxies: skipping redirect; original URI was proxied"); - return; - } - // Finally, if the original URI is the same as the host we're about to redirect - // to, then we also risk a loop - if (url.parse(details.originUrl).hostname == proxiedURI.hostname) { - Zotero.debug("Proxies: skipping redirect; redirect URI and original URI have same host"); - return; - } - } - - // parse the original request's URL so that we can extract host, etc. - let uri = url.parse(details.url); - - // make sure that the top two domains (e.g. gmu.edu in foo.bar.gmu.edu) of the - // channel and the site to which we're redirecting don't match, to prevent loops. - const top2DomainsRe = /[^\.]+\.[^\.]+$/; - let top21 = top2DomainsRe.exec(uri.hostname); - let top22 = top2DomainsRe.exec(proxiedURI.hostname); - if (!top21 || !top22 || top21[0] == top22[0]) { - Zotero.debug("Proxies: skipping redirect; redirect URI and URI have same top 2 domains"); - return; - } - - // Otherwise, redirect. - if (Zotero.Proxies.showRedirectNotification && details.type === 'main_frame') { - let proxy = Zotero.Proxies.hosts[uri.host]; - _showNotification( - 'Zotero Proxy Redirection', - `Zotero automatically redirected your request to ${uri.host} through the proxy at ${proxy.toDisplayName()}.`, - ['✕', 'Proxy Settings', "Don’t Proxy This Site"], - details.tabId - ).then(function(response) { - if (response == 1) Zotero.Connector_Browser.openPreferences("proxies"); - if (response == 2) { - proxy.hosts = proxy.hosts.filter((h) => h != uri.host); - Zotero.Proxies.save(proxy); - // Don't redirect for hosts associated with frames - return browser.tabs.update(details.tabId, { - url: details.url - }) - } - }); - } - - return { - redirectUrl: proxied - }; - } - - - /** - * Update proxy and host maps and store proxy settings in storage - */ - this.save = function(proxy) { - proxy.scheme = proxy.scheme.trim(); - proxy.hosts = proxy.hosts.map(host => host.trim()).filter(host => host); - - // If empty or default scheme - var invalid = Zotero.Proxies.validate(proxy); - if (invalid) { - Zotero.debug(`Proxy ${proxy.scheme} invalid with reason ${JSON.stringify(invalid)}`); - return Zotero.Proxies.remove(proxy); - } - - // If no %h present, then only a single host can be supported and we drop all but the first one. - if (proxy.scheme.indexOf('%h') == -1) { - proxy.hosts = proxy.hosts.slice(0, 1); - } - proxy = new Zotero.Proxy(proxy); - - var existingProxyIndex = Zotero.Proxies.proxies.findIndex((p) => p.id == proxy.id); - if (existingProxyIndex == -1) { - Zotero.Proxies.proxies.push(proxy); - } else { - Zotero.Proxies.proxies[existingProxyIndex] = proxy; - } - if (!proxy.regexp) proxy.compileRegexp(); - - // delete hosts that point to this proxy if they no longer exist - for (let host in Zotero.Proxies.hosts) { - if (Zotero.Proxies.hosts[host].id == proxy.id && proxy.hosts.indexOf(host) == -1) { - delete Zotero.Proxies.hosts[host]; - } - } - - for (let host of proxy.hosts) { - Zotero.Proxies.hosts[host] = proxy; - } - - Zotero.Proxies.storeProxies(); - }; - - /** - * Ensures that the proxy scheme and host settings are valid for this proxy type - * - * @returns {Array{String}|Boolean} An error type if a validation error occurred, or "false" if there was - * no error. - */ - this.validate = function(proxy) { - if ( - // Scheme very short - proxy.scheme.length <= "%h.-.--/%p".length - // Unmodified - || - proxy.scheme == '%h.example.com/%p' - // Host is at the end of the domain part of the scheme - || - proxy.scheme.includes('%h/') - ) { - return ["scheme.invalid"]; - } - - for (let p of Zotero.Proxies.proxies) { - if (proxy.scheme == p.scheme && p.id != proxy.id) { - return ["scheme.alreadyExists"] - } - } - - if (!Zotero_Proxy_schemeParameterRegexps["%p"].test(proxy.scheme) && - (!Zotero_Proxy_schemeParameterRegexps["%d"].test(proxy.scheme) || - !Zotero_Proxy_schemeParameterRegexps["%f"].test(proxy.scheme))) { - return ["scheme.noPath"]; - } - - for (let host in proxy.hosts) { - host = host.trim(); - var oldProxy = Zotero.Proxies.hosts[host]; - if (oldProxy && oldProxy.proxyID != proxy.proxyID) { - return ["host.proxyExists", host]; - } - } - - return false; - }; - - this.remove = function(proxy) { - var existingProxyIndex = Zotero.Proxies.proxies.findIndex((p) => p.id == proxy.id); - if (existingProxyIndex != -1) { - Zotero.Proxies.proxies.splice(existingProxyIndex, 1); - Zotero.Proxies.storeProxies(); - } - Object.keys(Zotero.Proxies.hosts).filter(function(h) { - if (Zotero.Proxies.hosts[h]) { - delete Zotero.Proxies.hosts[h]; - } - }); - }; - - this.storeProxies = function() { - let proxies = Zotero.Proxies.proxies.map(function(p) { - return { - id: p.id, - autoAssociate: p.autoAssociate, - scheme: p.scheme, - hosts: p.hosts, - dotsToHyphens: p.dotsToHyphens - }; - }); - - Zotero.Prefs.set('proxies.proxies', proxies); - }; - - /** - * Returns a page's proper URL from a proxied URL. Uses both transparent and opaque proxies. - * @param {String} URL - * @param {Boolean} onlyReturnIfProxied Controls behavior if the given URL is not proxied. If - * it is false or unspecified, unproxied URLs are returned verbatim. If it is true, the - * function will return "false" if the given URL is unproxied. - * @type String - */ - this.proxyToProper = function(URL, onlyReturnIfProxied) { - for (var proxy of Zotero.Proxies.proxies) { - if (proxy.regexp) { - var m = proxy.regexp.exec(URL); - if (m) { - var toProper = proxy.toProper(m); - Zotero.debug("Proxies.proxyToProper: " + URL + " to " + toProper); - return toProper; - } - } - } - return (onlyReturnIfProxied ? false : URL); - }; - - /** - * Returns a page's proxied URL from the proper URL. Uses only transparent proxies. - * @param {String} URL - * @param {Boolean} onlyReturnIfProxied Controls behavior if the given URL is not proxied. If - * it is false or unspecified, unproxied URLs are returned verbatim. If it is true, the - * function will return "false" if the given URL is unproxied. - * @type String - */ - this.properToProxy = function(URL, onlyReturnIfProxied) { - var uri = url.parse(URL); - if (Zotero.Proxies.hosts[uri.host]) { - var toProxy = Zotero.Proxies.hosts[uri.host].toProxy(uri); - Zotero.debug("Proxies.properToProxy: " + URL + " to " + toProxy); - return toProxy; - } - return (onlyReturnIfProxied ? false : URL); - }; - - /** - * Check the url for potential proxies and deproxify, providing a schema to build - * a proxy object. - * - * NOTE: Keep in sync with bookmarklet Translators._getPotentialProxies() - * - * @param URL - * @returns {Object} Unproxied url to proxy object - */ - this.getPotentialProxies = function(URL) { - var urlToProxy = {}; - // If it's a known proxied URL just return it - if (Zotero.Proxies.transparent) { - for (var proxy of Zotero.Proxies.proxies) { - if (proxy.regexp) { - var m = proxy.regexp.exec(URL); - if (m) { - let proper = proxy.toProper(m); - urlToProxy[proper] = proxy.toJSON(); - return urlToProxy; - } - } - } - } - urlToProxy[URL] = null; - - // if there is a subdomain that is also a TLD, also test against URI with the domain - // dropped after the TLD - // (i.e., www.nature.com.mutex.gmu.edu => www.nature.com) - var m = /^(https?:\/\/)([^\/]+)/i.exec(URL); - if (m) { - // First, drop the 0- if it exists (this is an III invention) - var host = m[2]; - if (host.substr(0, 2) === "0-") host = host.substr(2); - var hostnameParts = [host.split(".")]; - if (m[1] == 'https://') { - // try replacing hyphens with dots for https protocol - // to account for EZProxy HttpsHypens mode - hostnameParts.push(host.split('.')); - hostnameParts[1].splice(0, 1, ...(hostnameParts[1][0].replace(/-/g, '.').split('.'))); - } - - for (let i = 0; i < hostnameParts.length; i++) { - let parts = hostnameParts[i]; - // If hostnameParts has two entries, then the second one is with replaced hyphens - let dotsToHyphens = i == 1; - // skip the lowest level subdomain, domain and TLD - for (let j = 1; j < parts.length - 2; j++) { - // if a part matches a TLD, everything up to it is probably the true URL - if (TLDS[parts[j].toLowerCase()]) { - var properHost = parts.slice(0, j + 1).join("."); - // protocol + properHost + /path - var properURL = m[1] + properHost + URL.substr(m[0].length); - var proxyHost = parts.slice(j + 1).join('.'); - urlToProxy[properURL] = { - scheme: '%h.' + proxyHost + '/%p', - dotsToHyphens - }; - } - } - } - } - return urlToProxy; - }; - - /** - * Determines whether a host is blacklisted, i.e., whether we should refuse to save transparent - * proxy entries for this host. This is necessary because EZProxy offers to proxy all Google and - * Wikipedia subdomains, but in practice, this would get really annoying. - * - * @type Boolean - * @private - */ - this._isBlacklisted = function(host) { - /** - * Regular expression patterns of hosts never to proxy - * @const - */ - const hostBlacklist = [ - /edu$/, - /doi\.org$/, - /google\.com$/, - /wikipedia\.org$/, - /^[^.]*$/, - /doubleclick\.net$/, - /^eutils.ncbi.nlm.nih.gov$/ - ]; - /** - * Regular expression patterns of hosts that should always be proxied, regardless of whether - * they're on the blacklist - * @const - */ - const hostWhitelist = [ - /^scholar\.google\.com$/, - /^muse\.jhu\.edu$/, - /^(www\.)?journals\.uchicago\.edu$/ - ] - - for (var blackPattern of hostBlacklist) { - if (blackPattern.test(host)) { - for (var whitePattern of hostWhitelist) { - if (whitePattern.test(host)) { - return false; - } - } - return true; - } - } - return false; - } - - /** - * Show a proxy-related notification - * @param {String} title - notification title (currently unused) - * @param {String} message - notification text - * @param {String[]} actions - * @param {Number} tabId - * @param {Number} timeout - */ - function _showNotification(title, message, actions, tabId, timeout) { - // browser.notifications.create({ - // type: 'basic', - // title, - // message, - // iconUrl: 'Icon-128.png' - // }); - Zotero.debug(`NOTIFICATION: ${message}`); - actions = actions && actions.map((a) => { - return { - title: a, - dismiss: true - } - }); - return Zotero.Connector_Browser.notify(message, actions, timeout, tabId); - } - - }; - - /** - * Creates a Zotero.Proxy object from a DB row - * - * @constructor - * @class A model for a http proxy server - */ - Zotero.Proxy = function(json = {}) { - this.id = json.id || Date.now(); - this.autoAssociate = json.autoAssociate == undefined ? true : !!json.autoAssociate; - this.scheme = json.scheme; - this.hosts = json.hosts || []; - this.dotsToHyphens = !!json.dotsToHyphens; - if (this.scheme) { - // Loading from storage or new - this.compileRegexp(); - } - }; - - /** - * Convert the proxy to JSON compatible object - * @returns {Object} - */ - Zotero.Proxy.prototype.toJSON = function() { - if (!this.scheme) { - throw Error('Cannot convert proxy to JSON - no scheme'); - } - return { - id: this.id, - scheme: this.scheme, - dotsToHyphens: this.dotsToHyphens - }; - }; - - - /** - * Regexps to match the URL contents corresponding to proxy scheme parameters - * @const - */ - const Zotero_Proxy_schemeParameters = { - "%p": "(.*?)", // path - "%d": "(.*?)", // directory - "%f": "(.*?)", // filename - "%a": "(.*?)", // anything - "%h": "([a-zA-Z0-9]+[.\\-][a-zA-Z0-9.\\-]+)" // hostname - }; - - /** - * Regexps to match proxy scheme parameters in the proxy scheme URL - * @const - */ - const Zotero_Proxy_schemeParameterRegexps = { - "%p": /([^%])%p/, - "%d": /([^%])%d/, - "%f": /([^%])%f/, - "%h": /([^%])%h/, - "%a": /([^%])%a/ - }; - - - /** - * Compiles the regular expression against which we match URLs to determine if this proxy is in use - * and saves it in this.regexp - */ - Zotero.Proxy.prototype.compileRegexp = function() { - var indices = this.indices = {}; - this.parameters = []; - for (var param in Zotero_Proxy_schemeParameters) { - var index = this.scheme.indexOf(param); - - // avoid escaped matches - while (this.scheme[index - 1] && (this.scheme[index - 1] == "%")) { - this.scheme = this.scheme.substr(0, index - 1) + this.scheme.substr(index); - index = this.scheme.indexOf(param, index + 1); - } - - if (index != -1) { - this.indices[param] = index; - this.parameters.push(param); - } - } - - // sort params by index - this.parameters = this.parameters.sort(function(a, b) { - return indices[a] - indices[b]; - }); - - // now replace with regexp fragment in reverse order - var re; - if (this.scheme.includes('://')) { - re = "^" + Zotero.Utilities.quotemeta(this.scheme) + "$"; - } else { - re = "^https?" + Zotero.Utilities.quotemeta('://' + this.scheme) + "$"; - } - for (var i = this.parameters.length - 1; i >= 0; i--) { - var param = this.parameters[i]; - re = re.replace(Zotero_Proxy_schemeParameterRegexps[param], "$1" + Zotero_Proxy_schemeParameters[param]); - } - - this.regexp = new RegExp(re); - } - - /** - * Converts a proxied URL to an unproxied URL using this proxy - * - * @param m {Array} The match from running this proxy's regexp against a URL spec - * @type String - */ - Zotero.Proxy.prototype.toProper = function(m) { - if (!Array.isArray(m)) { - let match = this.regexp.exec(m); - if (!match) { - return m - } else { - m = match; - } - } - let hostIdx = this.parameters.indexOf("%h"); - let scheme = m[0].indexOf('https') == 0 ? 'https://' : 'http://'; - if (hostIdx != -1) { - var properURL = scheme + m[hostIdx + 1] + "/"; - } else { - var properURL = scheme + this.hosts[0] + "/"; - } - - // Replace `-` with `.` in https to support EZProxy HttpsHyphens. - // Potentially troublesome with domains that contain dashes - if (this.dotsToHyphens || - (this.dotsToHyphens == undefined && scheme == "https://") || - !properURL.includes('.')) { - properURL = properURL.replace(/-/g, '.'); - } - - if (this.indices["%p"]) { - properURL += m[this.parameters.indexOf("%p") + 1]; - } else { - var dir = m[this.parameters.indexOf("%d") + 1]; - var file = m[this.parameters.indexOf("%f") + 1]; - if (dir !== "") properURL += dir + "/"; - properURL += file; - } - - return properURL; - } - - /** - * Converts an unproxied URL to a proxied URL using this proxy - * - * @param {Object|String} uri The URI corresponding to the unproxied URL - * @type String - */ - Zotero.Proxy.prototype.toProxy = function(uri) { - if (typeof uri == "string") { - // CHANGED: Use URL instead of undefined url - uri = new URL(uri); - // If there's no path it is set to null, but we need - // at least an empty string to avoid doing many checks - uri.path = (uri.pathname + uri.search) || ''; - } - if (this.regexp.exec(uri.href) || Zotero.Proxies._isBlacklisted(uri.host)) { - return uri.href; - } - var proxyURL = this.scheme; - - for (var i = this.parameters.length - 1; i >= 0; i--) { - var param = this.parameters[i]; - var value = ""; - if (param == "%h") { - value = (this.dotsToHyphens && uri.protocol == 'https:') ? uri.host.replace(/\./g, '-') : uri.host; - } else if (param == "%p") { - value = uri.path.substr(1); - } else if (param == "%d") { - value = uri.path.substr(0, uri.path.lastIndexOf("/")); - } else if (param == "%f") { - value = uri.path.substr(uri.path.lastIndexOf("/") + 1) - } - - proxyURL = proxyURL.substr(0, this.indices[param]) + value + proxyURL.substr(this.indices[param] + 2); - } - - if (proxyURL.includes('://')) { - return proxyURL; - } - return uri.protocol + '//' + proxyURL; - } - - /** - * Generate a display name for the proxy (e.g., "proxy.example.edu (HTTPS)") - * - * @return {String} - */ - Zotero.Proxy.prototype.toDisplayName = function() { - try { - var parts = this.scheme.match(/^(?:(?:[^:]+):\/\/)?([^\/]+)/); - var domain = parts[1] - // Include part after %h, if it's present - .split('%h').pop() - // Trim leading punctuation after the %h - .match(/\W(.+)/)[1]; - return domain; - } catch (e) { - Zotero.logError(`Invalid proxy ${this.scheme}: ${e}`); - return this.scheme; - } - } - - /** - * Detectors for various proxy systems - * @namespace - */ - Zotero.Proxies.Detectors = {}; - - /** - * Detector for OCLC EZProxy - * @param {Object} details - * @type Boolean|Zotero.Proxy - */ - Zotero.Proxies.Detectors.EZProxy = function(details) { - // Try to catch links from one proxy-by-port site to another - var uri = url.parse(details.url); - if (uri.port && [80, 443].indexOf(uri.port) == -1) { - // Two options here: we could have a redirect from an EZProxy site to another, or a link - // If it's a redirect, we'll have to catch the Location: header - var toProxy = false; - var fromProxy = false; - if ([301, 302, 303].indexOf(details.statusCode) !== -1) { - try { - toProxy = url.parse(details.responseHeadersObject["location"]); - fromProxy = uri; - } catch (e) {} - } else { - try { - toProxy = uri; - fromProxy = url.parse(details.requestHeadersObject["referer"]); - } catch (e) {} - } - - if (fromProxy && toProxy && fromProxy.hostname == toProxy.hostname && fromProxy.port != toProxy.port && - (!toProxy.port || [80, 443].indexOf(toProxy.port) == -1)) { - for (var proxy of Zotero.Proxies.proxies) { - if (proxy.regexp) { - var m = proxy.regexp.exec(fromProxy.href); - if (m) break; - } - } - if (m) { - // Make sure caught proxy is not multi-host and that we don't have this new proxy already - if (Zotero.Proxies.proxyToProper(toProxy.href, true)) return false; - - Zotero.debug("Proxies: Identified putative port-by-port EZProxy link from " + fromProxy.host + " to " + toProxy.host); - - // Figure out real URL by failing to send cookies, so we get back to the login page - new Zotero.Proxies.Detectors.EZProxy.Listener(toProxy.href); - let xhr = new XMLHttpRequest; - xhr.open('GET', toProxy.href, true); - xhr.send(); - - return false; - } - } - } - - // Now try to catch redirects - try { - var proxiedURI = url.parse(details.responseHeadersObject["location"]); - } catch (e) { - return false; - } - if (!proxiedURI.protocol || details.statusCode != 302 || details.responseHeadersObject["server"] != "EZproxy") return false; - return Zotero.Proxies.Detectors.EZProxy.learn(url.parse(details.url), proxiedURI); - } - - /** - * Learn about a mapping from an EZProxy to a normal proxy - * @param {nsIURI} loginURI The URL of the login page - * @param {nsIURI} proxiedURI The URI of the page - * @return {Zotero.Proxy | false} - */ - Zotero.Proxies.Detectors.EZProxy.learn = function(loginURI, proxiedURI) { - // look for query - var m = /(url|qurl)=([^&]+)/i.exec(loginURI.query); - if (!m) return false; - - // Ignore if we already know about it - if (Zotero.Proxies.proxyToProper(proxiedURI.href, true)) return false; - - // Found URL - var properURL = (m[1].toLowerCase() == "qurl" ? decodeURI(m[2]) : m[2]); - var properURI = url.parse(properURL); - if (!properURI.protocol) { - return false; - } - - let loginHostIsProxiedHost = loginURI.hostname == proxiedURI.hostname; - let proxiedAndLoginPortsDiffer = proxiedURI.port != loginURI.port; - - let proxiedHostContainsProperHost = (proxiedURI.host.indexOf(properURI.hostname) != -1); - // Account for dashed out URLs in https wildcard scenario - if (!proxiedHostContainsProperHost && properURI.protocol == 'https:') { - if (properURI.hostname != properURI.hostname.replace(/\./g, '-')) { - properURI.hostname = properURI.hostname.replace(/\./g, '-'); - } - proxiedHostContainsProperHost = (proxiedURI.host.indexOf(properURI.hostname) != -1); - } - - - var proxy = false; - if (loginHostIsProxiedHost && proxiedAndLoginPortsDiffer) { - // Proxy by port - proxy = new Zotero.Proxy({ - autoAssociate: false, - scheme: proxiedURI.host + "/%p", - hosts: [properURI.host], - dotsToHyphens: false - }); - } else if (!loginHostIsProxiedHost && proxiedHostContainsProperHost) { - // Proxy by host - proxy = new Zotero.Proxy({ - autoAssociate: true, - scheme: proxiedURI.host.replace(properURI.hostname, "%h") + "/%p", - hosts: [properURI.host], - dotsToHyphens: true - }); - } - return proxy; - } - - /** - * @class Observer to clear cookies on an HTTP request, then remove itself - */ - Zotero.Proxies.Detectors.EZProxy.Listener = function(requestURL) { - this.requestURL = requestURL; - this.listeners = { - beforeSendHeaders: this.onBeforeSendHeaders.bind(this), - headersReceived: this.onHeadersReceived.bind(this), - errorOccurred: this.deregister.bind(this) - }; - Zotero.Proxies._ignoreURLs.add(requestURL); - for (let listenerType in this.listeners) { - Zotero.WebRequestIntercept.addListener(listenerType, this.listeners[listenerType]); - } - }; - Zotero.Proxies.Detectors.EZProxy.Listener.prototype.deregister = function(details) { - if (details.url.indexOf(this.requestURL) == -1) return; - Zotero.Proxies._ignoreURLs.delete(this.requestURL); - for (let listenerType in this.listeners) { - Zotero.WebRequestIntercept.removeListener(listenerType, this.listeners[listenerType]); - } - }; - Zotero.Proxies.Detectors.EZProxy.Listener.prototype.onBeforeSendHeaders = function(details) { - if (details.url.indexOf(this.requestURL) == -1) return; - return { - requestHeaders: details.requestHeaders.filter((header) => header.name.toLowerCase() != 'cookie') - } - }; - Zotero.Proxies.Detectors.EZProxy.Listener.prototype.onHeadersReceived = function(details) { - if (details.url.indexOf(this.requestURL) == -1) return; - this.deregister(details); - // Make sure this is a redirect involving an EZProxy - try { - var loginURI = url.parse(details.responseHeadersObject["location"]); - } catch (e) { - return; - } - if (!loginURI.host || details.statusCode != 302 || details.responseHeadersObject["server"] != "EZproxy") return false; - - var proxy = Zotero.Proxies.Detectors.EZProxy.learn(url.parse(loginURI), url.parse(details.url)); - if (proxy) { - Zotero.debug("Proxies: Proxy-by-port EZProxy " + aSubject.URI.hostPort + " corresponds to " + proxy.hosts[0]); - Zotero.Proxies.save(proxy); - } - return { - cancel: true - }; - }; - - /** - * Detector for Juniper Networks WebVPN - * @param {Object} details - * @type Boolean|Zotero.Proxy - */ - Zotero.Proxies.Detectors.Juniper = function(details) { - const juniperRe = /^https?:\/\/([^\/:]+(?:\:[0-9]+)?)\/(.*),DanaInfo=([^+,]*)([^+]*)(?:\+(.*))?$/; - var m = juniperRe.exec(details.url); - if (!m) return false; - - return new Zotero.Proxy({ - autoAssociate: true, - scheme: m[1] + "/%d" + ",DanaInfo=%h%a+%f", - hosts: [m[3]] - }); - } - - - Zotero.Proxies.DNS = new function() { - this.getHostnames = function() { - return Zotero.Connector.callMethod('getClientHostnames', null).then(function(hostnames) { - Zotero.Proxies._clientHostnames = hostnames; - return hostnames; - }); - } - }; - -})(); \ No newline at end of file diff --git a/external-scripts/rdf/identity.js b/external-scripts/rdf/identity.js deleted file mode 100644 index dabd9415..00000000 --- a/external-scripts/rdf/identity.js +++ /dev/null @@ -1,507 +0,0 @@ -// Identity management and indexing for RDF -// -// This file provides IndexedFormula a formula (set of triples) which -// indexed by predicate, subject and object. -// -// It "smushes" (merges into a single node) things which are identical -// according to owl:sameAs or an owl:InverseFunctionalProperty -// or an owl:FunctionalProperty -// -// -// 2005-10 Written Tim Berners-Lee -// 2007 Changed so as not to munge statements from documents when smushing -// -// -/*jsl:option explicit*/ -// Turn on JavaScriptLint variable declaration checking - -if (typeof process === 'object' && process + '' === '[object process]') { - this.$rdf = require('./init'); -} - -$rdf.IndexedFormula = function() { - - var owl_ns = "http://www.w3.org/2002/07/owl#"; - // var link_ns = "http://www.w3.org/2007/ont/link#"; - /* hashString functions are used as array indeces. This is done to avoid - ** conflict with existing properties of arrays such as length and map. - ** See issue 139. - */ - $rdf.Literal.prototype.hashString = $rdf.Literal.prototype.toNT; - $rdf.Symbol.prototype.hashString = $rdf.Symbol.prototype.toNT; - $rdf.BlankNode.prototype.hashString = $rdf.BlankNode.prototype.toNT; - $rdf.Collection.prototype.hashString = $rdf.Collection.prototype.toNT; - - - //Stores an associative array that maps URIs to functions - $rdf.IndexedFormula = function(features) { - this.statements = []; // As in Formula - this.optional = []; - this.propertyActions = []; // Array of functions to call when getting statement with {s X o} - //maps to [f(F,s,p,o),...] - this.classActions = []; // Array of functions to call when adding { s type X } - this.redirections = []; // redirect to lexically smaller equivalent symbol - this.aliases = []; // reverse mapping to redirection: aliases for this - this.HTTPRedirects = []; // redirections we got from HTTP - this.subjectIndex = []; // Array of statements with this X as subject - this.predicateIndex = []; // Array of statements with this X as subject - this.objectIndex = []; // Array of statements with this X as object - this.whyIndex = []; // Array of statements with X as provenance - this.index = [this.subjectIndex, this.predicateIndex, this.objectIndex, this.whyIndex]; - this.namespaces = {} // Dictionary of namespace prefixes - if (features === undefined) features = ["sameAs", - "InverseFunctionalProperty", "FunctionalProperty" - ]; - // this.features = features - // Callbackify? - function handleRDFType(formula, subj, pred, obj, why) { - if (formula.typeCallback != undefined) - formula.typeCallback(formula, obj, why); - - var x = formula.classActions[obj.hashString()]; - var done = false; - if (x) { - for (var i = 0; i < x.length; i++) { - done = done || x[i](formula, subj, pred, obj, why); - } - } - return done; // statement given is not needed if true - } //handleRDFType - //If the predicate is #type, use handleRDFType to create a typeCallback on the object - this.propertyActions[''] = [handleRDFType]; - - // Assumption: these terms are not redirected @@fixme - if ($rdf.Util.ArrayIndexOf(features, "sameAs") >= 0) - this.propertyActions[''] = [ - function(formula, subj, pred, obj, why) { - // $rdf.log("Equating "+subj.uri+" sameAs "+obj.uri); //@@ - formula.equate(subj, obj); - return true; // true if statement given is NOT needed in the store - } - ]; //sameAs -> equate & don't add to index - if ($rdf.Util.ArrayIndexOf(features, "InverseFunctionalProperty") >= 0) - this.classActions["<" + owl_ns + "InverseFunctionalProperty>"] = [ - function(formula, subj, pred, obj, addFn) { - return formula.newPropertyAction(subj, handle_IFP); // yes subj not pred! - } - ]; //IFP -> handle_IFP, do add to index - if ($rdf.Util.ArrayIndexOf(features, "FunctionalProperty") >= 0) - this.classActions["<" + owl_ns + "FunctionalProperty>"] = [ - function(formula, subj, proj, obj, addFn) { - return formula.newPropertyAction(subj, handle_FP); - } - ]; //FP => handleFP, do add to index - function handle_IFP(formula, subj, pred, obj) { - var s1 = formula.any(undefined, pred, obj); - if (s1 == undefined) return false; // First time with this value - // $rdf.log("Equating "+s1.uri+" and "+subj.uri + " because IFP "+pred.uri); //@@ - formula.equate(s1, subj); - return true; - } //handle_IFP - function handle_FP(formula, subj, pred, obj) { - var o1 = formula.any(subj, pred, undefined); - if (o1 == undefined) return false; // First time with this value - // $rdf.log("Equating "+o1.uri+" and "+obj.uri + " because FP "+pred.uri); //@@ - formula.equate(o1, obj); - return true; - } //handle_FP - } /* end IndexedFormula */ - - $rdf.IndexedFormula.prototype = new $rdf.Formula(); - $rdf.IndexedFormula.prototype.constructor = $rdf.IndexedFormula; - $rdf.IndexedFormula.SuperClass = $rdf.Formula; - - $rdf.IndexedFormula.prototype.newPropertyAction = function newPropertyAction(pred, action) { - //$rdf.log("newPropertyAction: "+pred); - var hash = pred.hashString(); - if (this.propertyActions[hash] == undefined) - this.propertyActions[hash] = []; - this.propertyActions[hash].push(action); - // Now apply the function to to statements already in the store - var toBeFixed = this.statementsMatching(undefined, pred, undefined); - var done = false; - for (var i = 0; i < toBeFixed.length; i++) { // NOT optimized - sort toBeFixed etc - done = done || action(this, toBeFixed[i].subject, pred, toBeFixed[i].object); - } - return done; - } - - $rdf.IndexedFormula.prototype.setPrefixForURI = function(prefix, nsuri) { - //TODO:This is a hack for our own issues, which ought to be fixed post-release - //See http://dig.csail.mit.edu/cgi-bin/roundup.cgi/$rdf/issue227 - if (prefix == "tab" && this.namespaces["tab"]) { - return; - } - this.namespaces[prefix] = nsuri - } - - // Deprocated ... name too generic - $rdf.IndexedFormula.prototype.register = function(prefix, nsuri) { - this.namespaces[prefix] = nsuri - } - - - /** simplify graph in store when we realize two identifiers are equivalent - -We replace the bigger with the smaller. - -*/ - $rdf.IndexedFormula.prototype.equate = function(u1, u2) { - // $rdf.log("Equating "+u1+" and "+u2); // @@ - //@@JAMBO Must canonicalize the uris to prevent errors from a=b=c - //03-21-2010 - u1 = this.canon(u1); - u2 = this.canon(u2); - var d = u1.compareTerm(u2); - if (!d) return true; // No information in {a = a} - var big, small; - if (d < 0) { // u1 less than u2 - return this.replaceWith(u2, u1); - } else { - return this.replaceWith(u1, u2); - } - } - - // Replace big with small, obsoleted with obsoleting. - // - $rdf.IndexedFormula.prototype.replaceWith = function(big, small) { - //$rdf.log("Replacing "+big+" with "+small) // @@ - var oldhash = big.hashString(); - var newhash = small.hashString(); - - var moveIndex = function(ix) { - var oldlist = ix[oldhash]; - if (oldlist == undefined) return; // none to move - var newlist = ix[newhash]; - if (newlist == undefined) { - ix[newhash] = oldlist; - } else { - ix[newhash] = oldlist.concat(newlist); - } - delete ix[oldhash]; - } - - // the canonical one carries all the indexes - for (var i = 0; i < 4; i++) { - moveIndex(this.index[i]); - } - - this.redirections[oldhash] = small; - if (big.uri) { - //@@JAMBO: must update redirections,aliases from sub-items, too. - if (this.aliases[newhash] == undefined) - this.aliases[newhash] = []; - this.aliases[newhash].push(big); // Back link - if (this.aliases[oldhash]) { - for (var i = 0; i < this.aliases[oldhash].length; i++) { - this.redirections[this.aliases[oldhash][i].hashString()] = small; - this.aliases[newhash].push(this.aliases[oldhash][i]); - } - } - - //this.add(small, this.sym('http://www.w3.org/2007/ont/link#uri'), big.uri) - - // If two things are equal, and one is requested, we should request the other. - if (this.sf) { - this.sf.nowKnownAs(big, small) - } - } - - moveIndex(this.classActions); - moveIndex(this.propertyActions); - - $rdf.log("Equate done. " + big + " now links to " + small) - return true; // true means the statement does not need to be put in - }; - - // Return the symbol with canonical URI as smushed - $rdf.IndexedFormula.prototype.canon = function(term) { - if (term == undefined) return term; - var y = this.redirections[term.hashString()]; - if (y == undefined) return term; - return y; - } - - // Compare by canonical URI as smushed - $rdf.IndexedFormula.prototype.sameThings = function(x, y) { - if (x.sameTerm(y)) return true; - var x1 = this.canon(x); - // $rdf.log('x1='+x1); - if (x1 == undefined) return false; - var y1 = this.canon(y); - // $rdf.log('y1='+y1); //@@ - if (y1 == undefined) return false; - return (x1.uri == y1.uri); - } - - // A list of all the URIs by which this thing is known - $rdf.IndexedFormula.prototype.uris = function(term) { - var cterm = this.canon(term) - var terms = this.aliases[cterm.hashString()]; - if (!cterm.uri) return [] - var res = [cterm.uri] - if (terms != undefined) { - for (var i = 0; i < terms.length; i++) { - res.push(terms[i].uri) - } - } - return res - } - - // On input parameters, convert constants to terms - // - function RDFMakeTerm(formula, val, canonicalize) { - if (typeof val != 'object') { - if (typeof val == 'string') - return new $rdf.Literal(val); - if (typeof val == 'number') - return new $rdf.Literal(val); // @@ differet types - if (typeof val == 'boolean') - return new $rdf.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean); - if (typeof val == 'undefined') - return undefined; - else // @@ add converting of dates and numbers - throw "Can't make Term from " + val + " of type " + typeof val; - } - return val; - } - - // Add a triple to the store - // - // Returns the statement added - // (would it be better to return the original formula for chaining?) - // - $rdf.IndexedFormula.prototype.add = function(subj, pred, obj, why) { - var actions, st; - if (why == undefined) why = this.fetcher ? this.fetcher.appNode : this.sym("chrome:theSession"); //system generated - //defined in source.js, is this OK with identity.js only user? - subj = RDFMakeTerm(this, subj); - pred = RDFMakeTerm(this, pred); - obj = RDFMakeTerm(this, obj); - why = RDFMakeTerm(this, why); - - if (this.predicateCallback != undefined) - this.predicateCallback(this, pred, why); - - // Action return true if the statement does not need to be added - var actions = this.propertyActions[this.canon(pred).hashString()]; - var done = false; - if (actions) { - // $rdf.log('type: '+typeof actions +' @@ actions='+actions); - for (var i = 0; i < actions.length; i++) { - done = done || actions[i](this, subj, pred, obj, why); - } - } - - //If we are tracking provenanance, every thing should be loaded into the store - //if (done) return new Statement(subj, pred, obj, why); // Don't put it in the store - // still return this statement for owl:sameAs input - var hash = [this.canon(subj).hashString(), this.canon(pred).hashString(), - this.canon(obj).hashString(), this.canon(why).hashString() - ]; - var st = new $rdf.Statement(subj, pred, obj, why); - for (var i = 0; i < 4; i++) { - var ix = this.index[i]; - var h = hash[i]; - if (ix[h] == undefined) ix[h] = []; - ix[h].push(st); // Set of things with this as subject, etc - } - - //$rdf.log("ADDING {"+subj+" "+pred+" "+obj+"} "+why); - this.statements.push(st); - return st; - }; //add - // Find out whether a given URI is used as symbol in the formula - $rdf.IndexedFormula.prototype.mentionsURI = function(uri) { - var hash = '<' + uri + '>'; - return (!!this.subjectIndex[hash] || - !!this.objectIndex[hash] || - !!this.predicateIndex[hash]); - } - - // Find an unused id for a file being edited: return a symbol - // (Note: Slow iff a lot of them -- could be O(log(k)) ) - $rdf.IndexedFormula.prototype.nextSymbol = function(doc) { - for (var i = 0;; i++) { - var uri = doc.uri + '#n' + i; - if (!this.mentionsURI(uri)) return this.sym(uri); - } - } - - - $rdf.IndexedFormula.prototype.anyStatementMatching = function(subj, pred, obj, why) { - var x = this.statementsMatching(subj, pred, obj, why, true); - if (!x || x == []) return undefined; - return x[0]; - }; - - - // Return statements matching a pattern - // ALL CONVENIENCE LOOKUP FUNCTIONS RELY ON THIS! - $rdf.IndexedFormula.prototype.statementsMatching = function(subj, pred, obj, why, justOne) { - //$rdf.log("Matching {"+subj+" "+pred+" "+obj+"}"); - var pat = [subj, pred, obj, why]; - var pattern = []; - var hash = []; - var wild = []; // wildcards - var given = []; // Not wild - for (var p = 0; p < 4; p++) { - pattern[p] = this.canon(RDFMakeTerm(this, pat[p])); - if (pattern[p] == undefined) { - wild.push(p); - } else { - given.push(p); - hash[p] = pattern[p].hashString(); - } - } - if (given.length == 0) { - return this.statements; - } - if (given.length == 1) { // Easy too, we have an index for that - var p = given[0]; - var list = this.index[p][hash[p]]; - if (list && justOne) { - if (list.length > 1) - list = list.slice(0, 1); - } - return list == undefined ? [] : list; - } - - // Now given.length is 2, 3 or 4. - // We hope that the scale-free nature of the data will mean we tend to get - // a short index in there somewhere! - var best = 1e10; // really bad - var best_i; - for (var i = 0; i < given.length; i++) { - var p = given[i]; // Which part we are dealing with - var list = this.index[p][hash[p]]; - if (list == undefined) return []; // No occurrences - if (list.length < best) { - best = list.length; - best_i = i; // (not p!) - } - } - - // Ok, we have picked the shortest index but now we have to filter it - var best_p = given[best_i]; - var possibles = this.index[best_p][hash[best_p]]; - var check = given.slice(0, best_i).concat(given.slice(best_i + 1)) // remove best_i - var results = []; - var parts = ['subject', 'predicate', 'object', 'why']; - for (var j = 0; j < possibles.length; j++) { - var st = possibles[j]; - for (var i = 0; i < check.length; i++) { // for each position to be checked - var p = check[i]; - if (!this.canon(st[parts[p]]).sameTerm(pattern[p])) { - st = null; - break; - } - } - if (st != null) { - results.push(st); - if (justOne) - break; - } - } - return results; - }; // statementsMatching - /** remove a particular statement from the bank **/ - $rdf.IndexedFormula.prototype.remove = function(st) { - //$rdf.log("entering remove w/ st=" + st); - var term = [st.subject, st.predicate, st.object, st.why]; - for (var p = 0; p < 4; p++) { - var c = this.canon(term[p]); - var h = c.hashString(); - if (this.index[p][h] == undefined) { - //$rdf.log ("Statement removal: no index '+p+': "+st); - } else { - $rdf.Util.RDFArrayRemove(this.index[p][h], st); - } - } - $rdf.Util.RDFArrayRemove(this.statements, st); - }; //remove - /** remove all statements matching args (within limit) **/ - $rdf.IndexedFormula.prototype.removeMany = function(subj, pred, obj, why, limit) { - //$rdf.log("entering removeMany w/ subj,pred,obj,why,limit = " + subj +", "+ pred+", " + obj+", " + why+", " + limit); - var sts = this.statementsMatching(subj, pred, obj, why, false); - //This is a subtle bug that occcured in updateCenter.js too. - //The fact is, this.statementsMatching returns this.whyIndex instead of a copy of it - //but for perfromance consideration, it's better to just do that - //so make a copy here. - var statements = []; - for (var i = 0; i < sts.length; i++) statements.push(sts[i]); - if (limit) statements = statements.slice(0, limit); - for (var i = 0; i < statements.length; i++) this.remove(statements[i]); - }; //removeMany - /** Utility**/ - - /* @method: copyTo - @description: replace @template with @target and add appropriate triples (no triple removed) - one-direction replication -*/ - $rdf.IndexedFormula.prototype.copyTo = function(template, target, flags) { - if (!flags) flags = []; - var statList = this.statementsMatching(template); - if ($rdf.Util.ArrayIndexOf(flags, 'two-direction') != -1) - statList.concat(this.statementsMatching(undefined, undefined, template)); - for (var i = 0; i < statList.length; i++) { - var st = statList[i]; - switch (st.object.termType) { - case 'symbol': - this.add(target, st.predicate, st.object); - break; - case 'literal': - case 'bnode': - case 'collection': - this.add(target, st.predicate, st.object.copy(this)); - } - if ($rdf.Util.ArrayIndexOf(flags, 'delete') != -1) this.remove(st); - } - }; - //for the case when you alter this.value (text modified in userinput.js) - $rdf.Literal.prototype.copy = function() { - return new $rdf.Literal(this.value, this.lang, this.datatype); - }; - $rdf.BlankNode.prototype.copy = function(formula) { //depends on the formula - var bnodeNew = new $rdf.BlankNode(); - formula.copyTo(this, bnodeNew); - return bnodeNew; - } - /** Full N3 bits -- placeholders only to allow parsing, no functionality! **/ - - $rdf.IndexedFormula.prototype.newUniversal = function(uri) { - var x = this.sym(uri); - if (!this._universalVariables) this._universalVariables = []; - this._universalVariables.push(x); - return x; - } - - $rdf.IndexedFormula.prototype.newExistential = function(uri) { - if (!uri) return this.bnode(); - var x = this.sym(uri); - return this.declareExistential(x); - } - - $rdf.IndexedFormula.prototype.declareExistential = function(x) { - if (!this._existentialVariables) this._existentialVariables = []; - this._existentialVariables.push(x); - return x; - } - - $rdf.IndexedFormula.prototype.formula = function(features) { - return new $rdf.IndexedFormula(features); - } - - $rdf.IndexedFormula.prototype.close = function() { - return this; - } - - $rdf.IndexedFormula.prototype.hashString = $rdf.IndexedFormula.prototype.toNT; - - return $rdf.IndexedFormula; - -}(); - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = $rdf.IndexedFormula; -} \ No newline at end of file diff --git a/external-scripts/rdf/init.js b/external-scripts/rdf/init.js deleted file mode 100644 index 91f3a9bc..00000000 --- a/external-scripts/rdf/init.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Comment by Adomas 2018-06-01: - * The history of this RDF parser goes back to 2009. It appears to be cobbled together - * from a couple of libraries, including whatever has become out of - * http://dig.csail.mit.edu/2005/ajar/ajaw/js/rdf/serialize.js, - * which seems to now be https://github.com/linkeddata/rdflib.js - * as well as http://brondsema.net/blog/index.php/2006/11/25/javascript_rdfparser_from_tabulator - * - * We could maybe try to update it, but since 2009 there have been multiple bugfix commits - * https://github.com/zotero/zotero/commits/c9346d4caad8f0b94786408a2b0fb04ccd620fee/chrome/content/zotero/xpcom/rdf - * and we have no tests for those commits, to be able to ensure the library still works as intended - * for every usecase. - * - * I have cleaned this up a bit where possible, e.g. replacing the tabulator and alert log calls - * with $rdf.log (since that's what they linked to anyway), and made it commonjs modular, - * but otherwise we'll stick to this code as it works for our purposes - */ - -var $rdf = { - Util: { - ArrayIndexOf: function(arr, item, i) { - //supported in all browsers except IE<9 - return arr.indexOf(item, i); - }, - RDFArrayRemove: function(a, x) { //removes all statements equal to x from a - for (var i = 0; i < a.length; i++) { - //TODO: This used to be the following, which didnt always work..why - //if(a[i] == x) - if (a[i].subject.sameTerm(x.subject) && a[i].predicate.sameTerm(x.predicate) && a[i].object.sameTerm(x.object) && a[i].why.sameTerm(x.why)) { - a.splice(i, 1); - return; - } - } - throw "RDFArrayRemove: Array did not contain " + x; - } - }, - log: Zotero.debug -}; - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = $rdf; - $rdf.Util = require('./uri'); - $rdf = Object.assign($rdf, require('./term')); - $rdf.IndexedFormula = require('./identity'); - $rdf.N3Parser = require('./n3parser'); - $rdf.RDFParser = require('./rdfparser'); - $rdf.Serializer = require('./serialize'); -} else { - if (Zotero.RDF) { - Zotero.RDF.AJAW = $rdf; - } else { - Zotero.RDF = { - AJAW: $rdf - }; - } -} \ No newline at end of file diff --git a/external-scripts/rdf/rdfparser.js b/external-scripts/rdf/rdfparser.js deleted file mode 100644 index 111d5f4f..00000000 --- a/external-scripts/rdf/rdfparser.js +++ /dev/null @@ -1,578 +0,0 @@ -/** - * @fileoverview - * TABULATOR RDF PARSER - * - * Version 0.1 - * Parser believed to be in full positive RDF/XML parsing compliance - * with the possible exception of handling deprecated RDF attributes - * appropriately. Parser is believed to comply fully with other W3C - * and industry standards where appropriate (DOM, ECMAScript, &c.) - * - * Author: David Sheets - * SVN ID: $Id$ - * - * W3C® SOFTWARE NOTICE AND LICENSE - * http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - * This work (and included software, documentation such as READMEs, or - * other related items) is being provided by the copyright holders under - * the following license. By obtaining, using and/or copying this work, - * you (the licensee) agree that you have read, understood, and will - * comply with the following terms and conditions. - * - * Permission to copy, modify, and distribute this software and its - * documentation, with or without modification, for any purpose and - * without fee or royalty is hereby granted, provided that you include - * the following on ALL copies of the software and documentation or - * portions thereof, including modifications: - * - * 1. The full text of this NOTICE in a location viewable to users of - * the redistributed or derivative work. - * 2. Any pre-existing intellectual property disclaimers, notices, or terms and - * conditions. If none exist, the W3C Software Short Notice should be - * included (hypertext is preferred, text is permitted) within the body - * of any redistributed or derivative code. - * 3. Notice of any changes or modifications to the files, including the - * date changes were made. (We recommend you provide URIs to the location - * from which the code is derived.) - * - * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT - * HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS - * FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR - * DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, - * TRADEMARKS OR OTHER RIGHTS. - * - * COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL - * OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR - * DOCUMENTATION. - * - * The name and trademarks of copyright holders may NOT be used in - * advertising or publicity pertaining to the software without specific, - * written prior permission. Title to copyright in this software and any - * associated documentation will at all times remain with copyright - * holders. - */ - -if (typeof process === 'object' && process + '' === '[object process]') { - var $rdf = require('./init'); -} - -/** - * @class Class defining an RDFParser resource object tied to an RDFStore - * - * @author David Sheets - * @version 0.1 - * - * @constructor - * @param {RDFStore} store An RDFStore object - */ -$rdf.RDFParser = function(store) { - var RDFParser = {}; - - /** Standard namespaces that we know how to handle @final - * @member RDFParser - */ - RDFParser['ns'] = { - 'RDF': "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - 'RDFS': "http://www.w3.org/2000/01/rdf-schema#" - } - /** DOM Level 2 node type magic numbers @final - * @member RDFParser - */ - RDFParser['nodeType'] = { - 'ELEMENT': 1, - 'ATTRIBUTE': 2, - 'TEXT': 3, - 'CDATA_SECTION': 4, - 'ENTITY_REFERENCE': 5, - 'ENTITY': 6, - 'PROCESSING_INSTRUCTION': 7, - 'COMMENT': 8, - 'DOCUMENT': 9, - 'DOCUMENT_TYPE': 10, - 'DOCUMENT_FRAGMENT': 11, - 'NOTATION': 12 - } - - /** - * Frame class for namespace and base URI lookups - * Base lookups will always resolve because the parser knows - * the default base. - * - * @private - */ - this['frameFactory'] = function(parser, parent, element) { - return { - 'NODE': 1, - 'ARC': 2, - 'parent': parent, - 'parser': parser, - 'store': parser['store'], - 'element': element, - 'lastChild': 0, - 'base': null, - 'lang': null, - 'node': null, - 'nodeType': null, - 'listIndex': 1, - 'rdfid': null, - 'datatype': null, - 'collection': false, - - /** Terminate the frame and notify the store that we're done */ - 'terminateFrame': function() { - if (this['collection']) { - this['node']['close']() - } - }, - - /** Add a symbol of a certain type to the this frame */ - 'addSymbol': function(type, uri) { - uri = $rdf.Util.uri.join(uri, this['base']) - this['node'] = this['store']['sym'](uri) - this['nodeType'] = type - }, - - /** Load any constructed triples into the store */ - 'loadTriple': function() { - if (this['parent']['parent']['collection']) { - this['parent']['parent']['node']['append'](this['node']) - } else { - this['store']['add'](this['parent']['parent']['node'], - this['parent']['node'], - this['node'], - this['parser']['why']) - } - if (this['parent']['rdfid'] != null) { // reify - var triple = this['store']['sym']( - $rdf.Util.uri.join("#" + this['parent']['rdfid'], this['base'])) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "type"), - this['store']['sym'](RDFParser['ns']['RDF'] + "Statement"), - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "subject"), - this['parent']['parent']['node'], - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "predicate"), - this['parent']['node'], - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "object"), - this['node'], - this['parser']['why']) - } - }, - - /** Check if it's OK to load a triple */ - 'isTripleToLoad': function() { - return (this['parent'] != null && - this['parent']['parent'] != null && - this['nodeType'] == this['NODE'] && - this['parent']['nodeType'] == this['ARC'] && - this['parent']['parent']['nodeType'] == this['NODE']) - }, - - /** Add a symbolic node to this frame */ - 'addNode': function(uri) { - this['addSymbol'](this['NODE'], uri) - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add a collection node to this frame */ - 'addCollection': function() { - this['nodeType'] = this['NODE'] - this['node'] = this['store']['collection']() - this['collection'] = true - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add a collection arc to this frame */ - 'addCollectionArc': function() { - this['nodeType'] = this['ARC'] - }, - - /** Add a bnode to this frame */ - 'addBNode': function(id) { - if (id != null) { - if (this['parser']['bnodes'][id] != null) { - this['node'] = this['parser']['bnodes'][id] - } else { - this['node'] = this['parser']['bnodes'][id] = this['store']['bnode']() - } - } else { - this['node'] = this['store']['bnode']() - } - - this['nodeType'] = this['NODE'] - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add an arc or property to this frame */ - 'addArc': function(uri) { - if (uri == RDFParser['ns']['RDF'] + "li") { - uri = RDFParser['ns']['RDF'] + "_" + this['parent']['listIndex']++ - } - this['addSymbol'](this['ARC'], uri) - }, - - /** Add a literal to this frame */ - 'addLiteral': function(value) { - if (this['parent']['datatype']) { - this['node'] = this['store']['literal']( - value, "", this['store']['sym']( - this['parent']['datatype'])) - } else { - this['node'] = this['store']['literal']( - value, this['lang']) - } - this['nodeType'] = this['NODE'] - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - } - } - } - - //from the OpenLayers source .. needed to get around IE problems. - this['getAttributeNodeNS'] = function(node, uri, name) { - var attributeNode = null; - if (node.getAttributeNodeNS) { - attributeNode = node.getAttributeNodeNS(uri, name); - } else { - var attributes = node.attributes; - var potentialNode, fullName; - for (var i = 0; i < attributes.length; ++i) { - potentialNode = attributes[i]; - if (potentialNode.namespaceURI == uri) { - fullName = (potentialNode.prefix) ? (potentialNode.prefix + ":" + name) : name; - if (fullName == potentialNode.nodeName) { - attributeNode = potentialNode; - break; - } - } - } - } - return attributeNode; - } - - /** Our triple store reference @private */ - this['store'] = store - /** Our identified blank nodes @private */ - this['bnodes'] = {} - /** A context for context-aware stores @private */ - this['why'] = null - /** Reification flag */ - this['reify'] = false - - /** - * Build our initial scope frame and parse the DOM into triples - * @param {DOMTree} document The DOM to parse - * @param {String} base The base URL to use - * @param {Object} why The context to which this resource belongs - */ - this['parse'] = function(document, base, why) { - // $rdf.log('parse base:'+base); - var children = document['childNodes'] - - // clean up for the next run - this['cleanParser']() - - // figure out the root element - //var root = document.documentElement; //this is faster, I think, cross-browser issue? well, DOM 2 - if (document['nodeType'] == RDFParser['nodeType']['DOCUMENT']) { - for (var c = 0; c < children['length']; c++) { - if (children[c]['nodeType'] == RDFParser['nodeType']['ELEMENT']) { - var root = children[c] - break - } - } - } else if (document['nodeType'] == RDFParser['nodeType']['ELEMENT']) { - var root = document - } else { - throw new Error("RDFParser: can't find root in " + base + ". Halting. ") - return false - } - - this['why'] = why - - - // our topmost frame - var f = this['frameFactory'](this) - this['base'] = base - f['base'] = base - f['lang'] = '' - - this['parseDOM'](this['buildFrame'](f, root)) - return true - } - this['parseDOM'] = function(frame) { - // a DOM utility function used in parsing - var elementURI = function(el) { - var result = ""; - if (el['namespaceURI'] == null) { - throw new Error("RDF/XML syntax error: No namespace for " + - el['localName'] + " in " + this.base) - } - if (el['namespaceURI']) { - result = result + el['namespaceURI']; - } - if (el['localName']) { - result = result + el['localName']; - } else if (el['nodeName']) { - if (el['nodeName'].indexOf(":") >= 0) - result = result + el['nodeName'].split(":")[1]; - else - result = result + el['nodeName']; - } - return result; - } - var dig = true // if we'll dig down in the tree on the next iter - while (frame['parent']) { - var dom = frame['element'] - var attrs = dom['attributes'] - - if (dom['nodeType'] == RDFParser['nodeType']['TEXT'] || - dom['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) { - //we have a literal - if (frame['parent']['nodeType'] == frame['NODE']) { - //must have had attributes, store as rdf:value - frame['addArc'](RDFParser['ns']['RDF'] + 'value'); - frame = this['buildFrame'](frame); - } - frame['addLiteral'](dom['nodeValue']) - } else if (elementURI(dom) != RDFParser['ns']['RDF'] + "RDF") { - // not root - if (frame['parent'] && frame['parent']['collection']) { - // we're a collection element - frame['addCollectionArc']() - frame = this['buildFrame'](frame, frame['element']) - frame['parent']['element'] = null - } - if (!frame['parent'] || !frame['parent']['nodeType'] || - frame['parent']['nodeType'] == frame['ARC']) { - // we need a node - var about = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "about") - var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID") - if (about && rdfid) { - throw new Error("RDFParser: " + dom['nodeName'] + - " has both rdf:id and rdf:about." + " Halting. Only one of these" + - " properties may be specified on a" + " node."); - } - if (about == null && rdfid) { - frame['addNode']("#" + rdfid['nodeValue']) - dom['removeAttributeNode'](rdfid) - } else if (about == null && rdfid == null) { - var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID") - if (bnid) { - frame['addBNode'](bnid['nodeValue']) - dom['removeAttributeNode'](bnid) - } else { - frame['addBNode']() - } - } else { - frame['addNode'](about['nodeValue']) - dom['removeAttributeNode'](about) - } - - // Typed nodes - var rdftype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "type") - if (RDFParser['ns']['RDF'] + "Description" != elementURI(dom)) { - rdftype = { - 'nodeValue': elementURI(dom) - } - } - if (rdftype != null) { - this['store']['add'](frame['node'], - this['store']['sym'](RDFParser['ns']['RDF'] + "type"), - this['store']['sym']( - $rdf.Util.uri.join( - rdftype['nodeValue'], - frame['base'])), - this['why']) - if (rdftype['nodeName']) { - dom['removeAttributeNode'](rdftype) - } - } - - // Property Attributes - for (var x = attrs['length'] - 1; x >= 0; x--) { - this['store']['add'](frame['node'], - this['store']['sym'](elementURI(attrs[x])), - this['store']['literal']( - attrs[x]['nodeValue'], - frame['lang']), - this['why']) - } - } else { - // we should add an arc (or implicit bnode+arc) - frame['addArc'](elementURI(dom)) - - // save the arc's rdf:ID if it has one - if (this['reify']) { - var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID") - if (rdfid) { - frame['rdfid'] = rdfid['nodeValue'] - dom['removeAttributeNode'](rdfid) - } - } - - var parsetype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "parseType") - var datatype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "datatype") - if (datatype) { - frame['datatype'] = datatype['nodeValue'] - dom['removeAttributeNode'](datatype) - } - - if (parsetype) { - var nv = parsetype['nodeValue'] - if (nv == "Literal") { - frame['datatype'] = RDFParser['ns']['RDF'] + "XMLLiteral" - // (this.buildFrame(frame)).addLiteral(dom) - // should work but doesn't - frame = this['buildFrame'](frame) - frame['addLiteral'](dom) - dig = false - } else if (nv == "Resource") { - frame = this['buildFrame'](frame, frame['element']) - frame['parent']['element'] = null - frame['addBNode']() - } else if (nv == "Collection") { - frame = this['buildFrame'](frame, frame['element']) - frame['parent']['element'] = null - frame['addCollection']() - } - dom['removeAttributeNode'](parsetype) - } - - if (attrs['length'] != 0) { - var resource = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "resource") - var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID") - - frame = this['buildFrame'](frame) - if (resource) { - frame['addNode'](resource['nodeValue']) - dom['removeAttributeNode'](resource) - } else { - if (bnid) { - frame['addBNode'](bnid['nodeValue']) - dom['removeAttributeNode'](bnid) - } else { - frame['addBNode']() - } - } - - for (var x = attrs['length'] - 1; x >= 0; x--) { - var f = this['buildFrame'](frame) - f['addArc'](elementURI(attrs[x])) - if (elementURI(attrs[x]) == RDFParser['ns']['RDF'] + "type") { - (this['buildFrame'](f))['addNode']( - attrs[x]['nodeValue']) - } else { - (this['buildFrame'](f))['addLiteral']( - attrs[x]['nodeValue']) - } - } - } else if (dom['childNodes']['length'] == 0) { - (this['buildFrame'](frame))['addLiteral']("") - } - } - } // rdf:RDF - // dig dug - dom = frame['element'] - while (frame['parent']) { - var pframe = frame - while (dom == null) { - frame = frame['parent'] - dom = frame['element'] - } - var candidate = dom['childNodes'][frame['lastChild']] - if (candidate == null || !dig) { - frame['terminateFrame']() - if (!(frame = frame['parent'])) { - break - } // done - dom = frame['element'] - dig = true - } else if ((candidate['nodeType'] != RDFParser['nodeType']['ELEMENT'] && - candidate['nodeType'] != RDFParser['nodeType']['TEXT'] && - candidate['nodeType'] != RDFParser['nodeType']['CDATA_SECTION']) || - ((candidate['nodeType'] == RDFParser['nodeType']['TEXT'] || - candidate['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) && - dom['childNodes']['length'] != 1)) { - frame['lastChild']++ - } else { - // not a leaf - frame['lastChild']++; - frame = this['buildFrame'](pframe, dom['childNodes'][frame['lastChild'] - 1]) - break - } - } - } // while - } - - /** - * Cleans out state from a previous parse run - * @private - */ - this['cleanParser'] = function() { - this['bnodes'] = {} - this['why'] = null - } - - /** - * Builds scope frame - * @private - */ - this['buildFrame'] = function(parent, element) { - var frame = this['frameFactory'](this, parent, element) - if (parent) { - frame['base'] = parent['base'] - frame['lang'] = parent['lang'] - } - if (element == null || - element['nodeType'] == RDFParser['nodeType']['TEXT'] || - element['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) { - return frame - } - - var attrs = element['attributes'] - - var base = element['getAttributeNode']("xml:base") - if (base != null) { - frame['base'] = base['nodeValue'] - element['removeAttribute']("xml:base") - } - var lang = element['getAttributeNode']("xml:lang") - if (lang != null) { - frame['lang'] = lang['nodeValue'] - element['removeAttribute']("xml:lang") - } - - // remove all extraneous xml and xmlns attributes - for (var x = attrs['length'] - 1; x >= 0; x--) { - if (attrs[x]['nodeName']['substr'](0, 3) == "xml") { - if (attrs[x].name.slice(0, 6) == 'xmlns:') { - var uri = attrs[x].nodeValue; - // $rdf.log('base for namespac attr:'+this.base); - if (this.base) uri = $rdf.Util.uri.join(uri, this.base); - this.store.setPrefixForURI(attrs[x].name.slice(6), uri); - } - // $rdf.log('rdfparser: xml atribute: '+attrs[x].name) //@@ - element['removeAttributeNode'](attrs[x]) - } - } - return frame - } -} - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = $rdf.RDFParser; -} \ No newline at end of file diff --git a/external-scripts/rdf/term.js b/external-scripts/rdf/term.js deleted file mode 100644 index e465eb65..00000000 --- a/external-scripts/rdf/term.js +++ /dev/null @@ -1,505 +0,0 @@ -// These are the classes corresponding to the RDF and N3 data models -// -// Designed to look like rdflib and cwm designs. -// -// Issues: Should the names start with RDF to make them -// unique as program-wide symbols? -// -// W3C open source licence 2005. -// -// Symbol - -(function() { - - if (typeof process === 'object' && process + '' === '[object process]') { - this.$rdf = require('./init'); - } - - var Term = {}; - - Term.Empty = function() { - return this; - }; - - Term.Empty.prototype.termType = 'empty'; - Term.Empty.prototype.toString = function() { - return "()" - }; - Term.Empty.prototype.toNT = Term.Empty.prototype.toString; - - Term.Symbol = function(uri) { - this.uri = uri; - this.value = uri; // -- why? -tim - return this; - } - - Term.Symbol.prototype.termType = 'symbol'; - Term.Symbol.prototype.toString = function() { - return ("<" + this.uri + ">"); - }; - Term.Symbol.prototype.toNT = Term.Symbol.prototype.toString; - - // Some precalculated symbols - Term.Symbol.prototype.XSDboolean = new Term.Symbol('http://www.w3.org/2001/XMLSchema#boolean'); - Term.Symbol.prototype.XSDdecimal = new Term.Symbol('http://www.w3.org/2001/XMLSchema#decimal'); - Term.Symbol.prototype.XSDfloat = new Term.Symbol('http://www.w3.org/2001/XMLSchema#float'); - Term.Symbol.prototype.XSDinteger = new Term.Symbol('http://www.w3.org/2001/XMLSchema#integer'); - Term.Symbol.prototype.XSDdateTime = new Term.Symbol('http://www.w3.org/2001/XMLSchema#dateTime'); - Term.Symbol.prototype.integer = new Term.Symbol('http://www.w3.org/2001/XMLSchema#integer'); // Used? - // Blank Node - if (typeof Term.NextId != 'undefined') { - Term.log('Attempt to re-zero existing blank node id counter at ' + Term.NextId); - } else { - Term.NextId = 0; // Global genid - } - Term.NTAnonymousNodePrefix = "_:n"; - - Term.BlankNode = function(id) { - /*if (id) - this.id = id; - else*/ - this.id = Term.NextId++; - this.value = id ? id : this.id.toString(); - return this - }; - - Term.BlankNode.prototype.termType = 'bnode'; - Term.BlankNode.prototype.toNT = function() { - return Term.NTAnonymousNodePrefix + this.id - }; - Term.BlankNode.prototype.toString = Term.BlankNode.prototype.toNT; - - // Literal - Term.Literal = function(value, lang, datatype) { - this.value = value - if (lang == "" || lang == null) this.lang = undefined; - else this.lang = lang; // string - if (datatype == null) this.datatype = undefined; - else this.datatype = datatype; // term - return this; - } - - Term.Literal.prototype.termType = 'literal' - Term.Literal.prototype.toString = function() { - return '' + this.value; - }; - Term.Literal.prototype.toNT = function() { - var str = this.value - if (typeof str != 'string') { - if (typeof str == 'number') return '' + str; - throw Error("Value of RDF literal is not string: " + str) - } - str = str.replace(/\\/g, '\\\\'); // escape backslashes - str = str.replace(/\"/g, '\\"'); // escape quotes - str = str.replace(/\n/g, '\\n'); // escape newlines - str = '"' + str + '"' //'; - if (this.datatype) { - str = str + '^^' + this.datatype.toNT() - } - if (this.lang) { - str = str + "@" + this.lang; - } - return str; - }; - - Term.Collection = function() { - this.id = Term.NextId++; // Why need an id? For hashstring. - this.elements = []; - this.closed = false; - }; - - Term.Collection.prototype.termType = 'collection'; - - Term.Collection.prototype.toNT = function() { - return Term.NTAnonymousNodePrefix + this.id - }; - - Term.Collection.prototype.toString = function() { - var str = '('; - for (var i = 0; i < this.elements.length; i++) - str += this.elements[i] + ' '; - return str + ')'; - }; - - Term.Collection.prototype.append = function(el) { - this.elements.push(el) - } - Term.Collection.prototype.unshift = function(el) { - this.elements.unshift(el); - } - Term.Collection.prototype.shift = function() { - return this.elements.shift(); - } - - Term.Collection.prototype.close = function() { - this.closed = true - } - - - // Convert Javascript representation to RDF term object - // - Term.term = function(val) { - if (typeof val == 'object') - if (val instanceof Date) { - var d2 = function(x) { - return ('' + (100 + x)).slice(1, 3) - }; // format as just two digits - return new Term.Literal('' + val.getUTCFullYear() + '-' + d2(val.getUTCMonth() + 1) + - '-' + d2(val.getUTCDate()) + 'T' + d2(val.getUTCHours()) + ':' + - d2(val.getUTCMinutes()) + ':' + d2(val.getUTCSeconds()) + 'Z', - undefined, - Term.Symbol.prototype.XSDdateTime); - - } else if (val instanceof Array) { - var x = new Term.Collection(); - for (var i = 0; i < val.length; i++) - x.append(Term.term(val[i])); - return x; - } else - return val; - if (typeof val == 'string') - return new Term.Literal(val); - if (typeof val == 'number') { - var dt; - if (('' + val).indexOf('e') >= 0) dt = Term.Symbol.prototype.XSDfloat; - else if (('' + val).indexOf('.') >= 0) dt = Term.Symbol.prototype.XSDdecimal; - else dt = Term.Symbol.prototype.XSDinteger; - return new Term.Literal(val, undefined, dt); - } - if (typeof val == 'boolean') - return new Term.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean); - if (typeof val == 'undefined') - return undefined; - throw ("Can't make term from " + val + " of type " + typeof val); - } - - // Statement - // - // This is a triple with an optional reason. - // - // The reason can point to provenece or inference - // - Term.Statement = function(subject, predicate, object, why) { - this.subject = Term.term(subject) - this.predicate = Term.term(predicate) - this.object = Term.term(object) - if (typeof why != 'undefined') { - this.why = why; - } - return this; - } - - Term.st = function(subject, predicate, object, why) { - return new Term.Statement(subject, predicate, object, why); - }; - - Term.Statement.prototype.toNT = function() { - return (this.subject.toNT() + " " + this.predicate.toNT() + " " + this.object.toNT() + " ."); - }; - - Term.Statement.prototype.toString = Term.Statement.prototype.toNT; - - // Formula - // - // Set of statements. - Term.Formula = function() { - this.statements = [] - this.constraints = [] - this.initBindings = [] - this.optional = [] - return this; - }; - - - Term.Formula.prototype.termType = 'formula'; - Term.Formula.prototype.toNT = function() { - return "{" + this.statements.join('\n') + "}" - }; - Term.Formula.prototype.toString = Term.Formula.prototype.toNT; - - Term.Formula.prototype.add = function(subj, pred, obj, why) { - this.statements.push(new Term.Statement(subj, pred, obj, why)) - } - - // Convenience methods on a formula allow the creation of new RDF terms: - Term.Formula.prototype.sym = function(uri, name) { - if (name != null) { - throw "This feature (kb.sym with 2 args) is removed. Do not assume prefix mappings." - } - return new Term.Symbol(uri) - } - - Term.sym = function(uri) { - return new Term.Symbol(uri); - }; - - Term.Formula.prototype.literal = function(val, lang, dt) { - return new Term.Literal(val.toString(), lang, dt) - } - Term.lit = Term.Formula.prototype.literal; - - Term.Formula.prototype.bnode = function(id) { - return new Term.BlankNode(id) - } - - Term.Formula.prototype.formula = function() { - return new Term.Formula() - } - - Term.Formula.prototype.collection = function() { // obsolete - return new Term.Collection() - } - - Term.Formula.prototype.list = function(values) { - var li = new Term.Collection(); - if (values) { - for (var i = 0; i < values.length; i++) { - li.append(values[i]); - } - } - return li; - } - - /* Variable - ** - ** Variables are placeholders used in patterns to be matched. - ** In cwm they are symbols which are the formula's list of quantified variables. - ** In sparl they are not visibily URIs. Here we compromise, by having - ** a common special base URI for variables. Their names are uris, - ** but the ? nottaion has an implicit base uri of 'varid:' - */ - - Term.Variable = function(rel) { - this.base = "varid:"; // We deem variabe x to be the symbol varid:x - this.uri = $rdf.Util.uri.join(rel, this.base); - return this; - } - - Term.Variable.prototype.termType = 'variable'; - Term.Variable.prototype.toNT = function() { - if (this.uri.slice(0, this.base.length) == this.base) { - return '?' + this.uri.slice(this.base.length); - } // @@ poor man's refTo - return '?' + this.uri; - }; - - Term.Variable.prototype.toString = Term.Variable.prototype.toNT; - Term.Variable.prototype.classOrder = 7; - - Term.variable = Term.Formula.prototype.variable = function(name) { - return new Term.Variable(name); - }; - - Term.Variable.prototype.hashString = Term.Variable.prototype.toNT; - - - // The namespace function generator - Term.Namespace = function(nsuri) { - return function(ln) { - return new Term.Symbol(nsuri + (ln === undefined ? '' : ln)) - } - } - - Term.Formula.prototype.ns = function(nsuri) { - return function(ln) { - return new Term.Symbol(nsuri + (ln === undefined ? '' : ln)) - } - } - - - // Parse a single token - // - // The bnode bit should not be used on program-external values; designed - // for internal work such as storing a bnode id in an HTML attribute. - // This will only parse the strings generated by the vaious toNT() methods. - Term.Formula.prototype.fromNT = function(str) { - var len = str.length - var ch = str.slice(0, 1) - if (ch == '<') return Term.sym(str.slice(1, len - 1)) - if (ch == '"') { - var lang = undefined; - var dt = undefined; - var k = str.lastIndexOf('"'); - if (k < len - 1) { - if (str[k + 1] == '@') lang = str.slice(k + 2, len); - else if (str.slice(k + 1, k + 3) == '^^') dt = Term.fromNT(str.slice(k + 3, len)); - else throw "Can't convert string from NT: " + str - } - var str = (str.slice(1, k)); - str = str.replace(/\\"/g, '"'); // unescape quotes ' - str = str.replace(/\\n/g, '\n'); // unescape newlines - str = str.replace(/\\\\/g, '\\'); // unescape backslashes - return Term.lit(str, lang, dt); - } - if (ch == '_') { - var x = new Term.BlankNode(); - x.id = parseInt(str.slice(3)); - Term.NextId-- - return x - } - if (ch == '?') { - var x = new Term.Variable(str.slice(1)); - return x; - } - throw "Can't convert from NT: " + str; - - } - Term.fromNT = Term.Formula.prototype.fromNT; // Not for inexpert user - // Convenience - and more conventional name: - Term.graph = function() { - return new $rdf.IndexedFormula(); - }; - - // ends - - - /* - * Update 2018-06-01 - * match.js extension for term.js: - * https://github.com/zotero/zotero/blob/805d3ed6a67add126eff97579200458b52bf5ac5/chrome/content/zotero/xpcom/rdf/match.js - */ - - Term.Symbol.prototype.sameTerm = function(other) { - if (!other) { - return false - } - return ((this.termType == other.termType) && (this.uri == other.uri)) - } - - Term.BlankNode.prototype.sameTerm = function(other) { - if (!other) { - return false - } - return ((this.termType == other.termType) && (this.id == other.id)) - } - - Term.Literal.prototype.sameTerm = function(other) { - if (!other) { - return false - } - return ((this.termType == other.termType) && - (this.value == other.value) && - (this.lang == other.lang) && - ((!this.datatype && !other.datatype) || - (this.datatype && this.datatype.sameTerm(other.datatype)))) - } - - Term.Variable.prototype.sameTerm = function(other) { - if (!other) { - return false - } - return ((this.termType == other.termType) && (this.uri == other.uri)) - } - - Term.Collection.prototype.sameTerm = Term.BlankNode.prototype.sameTerm - - Term.Formula.prototype.sameTerm = function(other) { - return this.hashString() == other.hashString(); - } - // Comparison for ordering - // - // These compare with ANY term - // - // - // When we smush nodes we take the lowest value. This is not - // arbitrary: we want the value actually used to be the literal - // (or list or formula). - Term.Literal.prototype.classOrder = 1 - Term.Collection.prototype.classOrder = 3 - Term.Formula.prototype.classOrder = 4 - Term.Symbol.prototype.classOrder = 5 - Term.BlankNode.prototype.classOrder = 6 - - // Compaisons return sign(self - other) - // Literals must come out before terms for smushing - Term.Literal.prototype.compareTerm = function(other) { - if (this.classOrder < other.classOrder) return -1 - if (this.classOrder > other.classOrder) return +1 - if (this.value < other.value) return -1 - if (this.value > other.value) return +1 - return 0 - } - - Term.Symbol.prototype.compareTerm = function(other) { - if (this.classOrder < other.classOrder) return -1 - if (this.classOrder > other.classOrder) return +1 - if (this.uri < other.uri) return -1 - if (this.uri > other.uri) return +1 - return 0 - } - - Term.BlankNode.prototype.compareTerm = function(other) { - if (this.classOrder < other.classOrder) return -1 - if (this.classOrder > other.classOrder) return +1 - if (this.id < other.id) return -1 - if (this.id > other.id) return +1 - return 0 - } - - Term.Collection.prototype.compareTerm = Term.BlankNode.prototype.compareTerm - - // Convenience routines - // Only one of s p o can be undefined, and w is optional. - Term.Formula.prototype.each = function(s, p, o, w) { - var results = [] - var st, sts = this.statementsMatching(s, p, o, w, false) - var i, n = sts.length - if (typeof s == 'undefined') { - for (i = 0; i < n; i++) { - st = sts[i]; - results.push(st.subject) - } - } else if (typeof p == 'undefined') { - for (i = 0; i < n; i++) { - st = sts[i]; - results.push(st.predicate) - } - } else if (typeof o == 'undefined') { - for (i = 0; i < n; i++) { - st = sts[i]; - results.push(st.object) - } - } else if (typeof w == 'undefined') { - for (i = 0; i < n; i++) { - st = sts[i]; - results.push(st.why) - } - } - return results - } - - Term.Formula.prototype.any = function(s, p, o, w) { - var st = this.anyStatementMatching(s, p, o, w) - if (typeof st == 'undefined') return undefined; - - if (typeof s == 'undefined') return st.subject; - if (typeof p == 'undefined') return st.predicate; - if (typeof o == 'undefined') return st.object; - - return undefined - } - - Term.Formula.prototype.holds = function(s, p, o, w) { - var st = this.anyStatementMatching(s, p, o, w) - if (typeof st == 'undefined') return false; - return true; - } - - Term.Formula.prototype.the = function(s, p, o, w) { - // the() should contain a check there is only one - var x = this.any(s, p, o, w) - if (typeof x == 'undefined') - $rdf.log("No value found for the(){" + s + " " + p + " " + o + "}.") - return x - } - - Term.Formula.prototype.whether = function(s, p, o, w) { - return this.statementsMatching(s, p, o, w, false).length; - } - - if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = Term; - } else { - Object.assign($rdf, Term); - } -})(); \ No newline at end of file diff --git a/external-scripts/rdf/uri.js b/external-scripts/rdf/uri.js deleted file mode 100644 index 5e720c67..00000000 --- a/external-scripts/rdf/uri.js +++ /dev/null @@ -1,148 +0,0 @@ -// Implementing URI-specific functions -// -// See RFC 2386 -// -// This is or was http://www.w3.org/2005/10/ajaw/uri.js -// 2005 W3C open source licence -// -// -// Take a URI given in relative or absolute form and a base -// URI, and return an absolute URI -// -// See also http://www.w3.org/2000/10/swap/uripath.py -// - -if (typeof process === 'object' && process + '' === '[object process]') { - var $rdf = require('./init'); -} - -if (typeof $rdf.Util.uri == "undefined") { - $rdf.Util.uri = {}; -}; - -$rdf.Util.uri.join = function(given, base) { - // if (typeof $rdf.log != 'undefined') $rdf.log(" URI given="+given+" base="+base) - var baseHash = base.indexOf('#') - if (baseHash > 0) base = base.slice(0, baseHash) - if (given.length == 0) return base // before chopping its filename off - if (given.indexOf('#') == 0) return base + given - var colon = given.indexOf(':') - if (colon >= 0) return given // Absolute URI form overrides base URI - var baseColon = base.indexOf(':') - if (base == "") return given; - if (baseColon < 0) { - $rdf.log("Invalid base: " + base + ' in join with ' + given); - return given - } - var baseScheme = base.slice(0, baseColon + 1) // eg http: - if (given.indexOf("//") == 0) // Starts with // - return baseScheme + given; - if (base.indexOf('//', baseColon) == baseColon + 1) { // Any hostpart? - var baseSingle = base.indexOf("/", baseColon + 3) - if (baseSingle < 0) { - if (base.length - baseColon - 3 > 0) { - return base + "/" + given - } else { - return baseScheme + given - } - } - } else { - var baseSingle = base.indexOf("/", baseColon + 1) - if (baseSingle < 0) { - if (base.length - baseColon - 1 > 0) { - return base + "/" + given - } else { - return baseScheme + given - } - } - } - - if (given.indexOf('/') == 0) // starts with / but not // - return base.slice(0, baseSingle) + given - - var path = base.slice(baseSingle) - var lastSlash = path.lastIndexOf("/") - if (lastSlash < 0) return baseScheme + given - if ((lastSlash >= 0) && - (lastSlash < (path.length - 1))) - path = path.slice(0, lastSlash + 1) // Chop trailing filename from base - path = path + given - while (path.match(/[^\/]*\/\.\.\//)) // must apply to result of prev - path = path.replace(/[^\/]*\/\.\.\//, '') // ECMAscript spec 7.8.5 - path = path.replace(/\.\//g, '') // spec vague on escaping - path = path.replace(/\/\.$/, '/') - return base.slice(0, baseSingle) + path -} - -// refTo: Make a URI relative to a given base -// -// based on code in http://www.w3.org/2000/10/swap/uripath.py -// -$rdf.Util.uri.commonHost = new RegExp("^[-_a-zA-Z0-9.]+:(//[^/]*)?/[^/]*$"); - -$rdf.Util.uri.hostpart = function(u) { - var m = /[^\/]*\/\/([^\/]*)\//.exec(u); - return m ? m[1] : '' -}; - -$rdf.Util.uri.refTo = function(base, uri) { - if (!base) return uri; - if (base == uri) return ""; - var i = 0; // How much are they identical? - while (i < uri.length && i < base.length) - if (uri[i] == base[i]) i++; - else break; - if (base.slice(0, i).match($rdf.Util.uri.commonHost)) { - var k = uri.indexOf('//'); - if (k < 0) k = -2; // no host - var l = uri.indexOf('/', k + 2); // First *single* slash - if (uri.slice(l + 1, l + 2) != '/' && - base.slice(l + 1, l + 2) != '/' && - uri.slice(0, l) == base.slice(0, l)) - // common path to single slash - return uri.slice(l); // but no other common path segments - } - // fragment of base? - if (uri.slice(i, i + 1) == '#' && base.length == i) return uri.slice(i); - while (i > 0 && uri[i - 1] != '/') i--; - - if (i < 3) return uri; // No way - if ((base.indexOf('//', i - 2) > 0) || - uri.indexOf('//', i - 2) > 0) - return uri; // an unshared '//' - if (base.indexOf(':', i) > 0) return uri; // unshared ':' - var n = 0; - for (var j = i; j < base.length; j++) - if (base[j] == '/') n++; - if (n == 0 && i < uri.length && uri[i] == '#') return './' + uri.slice(i); - if (n == 0 && i == uri.length) return './'; - var str = ''; - for (var j = 0; j < n; j++) str += '../'; - return str + uri.slice(i); -} - - -/** returns URI without the frag **/ -$rdf.Util.uri.docpart = function(uri) { - var i = uri.indexOf("#") - if (i < 0) return uri - return uri.slice(0, i) -} - -/** The document in which something a thing defined **/ -$rdf.Util.uri.document = function(x) { - return $rdf.sym($rdf.Util.uri.docpart(x.uri)); -} - -/** return the protocol of a uri **/ -/** return null if there isn't one **/ -$rdf.Util.uri.protocol = function(uri) { - var index = uri.indexOf(':'); - if (index >= 0) return uri.slice(0, index); - else return null; -} //protocol -//ends - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = $rdf.Util; -} \ No newline at end of file diff --git a/external-scripts/repo.js b/external-scripts/repo.js deleted file mode 100644 index ada10afd..00000000 --- a/external-scripts/repo.js +++ /dev/null @@ -1,196 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Intended behavior as follows: - * 1. Check for translator updates every REPOSITORY_CHECK_INTERVAL (24hrs) starting with - * Zotero and cascading to the Zotero Repo - * 2. When translators retrieved from Zotero we get the full up-to-date translator metadata - * 3. When translators retrieved from the Zotero Repo we only fetch the diff between the last time - * we checked the Repo and now - * 4. Can override to fetch all metadata from Zotero Repo if needed - */ -Zotero.Repo = new function() { - var _timeoutID; - this.infoRe = /^\s*{[\S\s]*?}\s*?[\r\n]/; - - /** - * Try to retrieve translator metadata from Zotero Standalone and initialize repository check - * timer - */ - this.init = new function() { - var promise; - return function() { - if (promise) return promise; - let promiseInternal = promise = new Promise(async (resolve, reject) => { - try { - await this.update(); - resolve(); - } catch (e) { - reject(e); - } - }); - - promise = null; - return promiseInternal; - } - }; - - /** - * Update translator metadata - * - * Either called by scheduled code to update metadata every REPOSITORY_CHECK_INTERVAL (24hrs) or - * from the Preferences. Reset will be true if called from preferences and should force fetch from - * Repo and ensure that all translator metadata is up to date. - * - * If a browser is closed and reopened then Repo will not be checked unless 24hrs have passed - * since last check. - * - * @param reset {Boolean} Fetches all metadata from repo instead of just the diff since last checked - */ - this.update = async function(reset) { - // get the time - let nextCascadeToRepo = Zotero.Prefs.get("connector.repo.lastCheck.localTime") + - ZOTERO_CONFIG.REPOSITORY_CHECK_INTERVAL * 1000; - let now = Date.now(); - let repoCheckIntervalExpired = nextCascadeToRepo <= now; - - let translatorMetadata; - let isFromStandalone = false; - try { - translatorMetadata = await this._updateFromStandalone(); - isFromStandalone = true; - } catch (e) { - Zotero.debug('Failed to retrieve translators from Zotero Standalone'); - if (!repoCheckIntervalExpired && !reset) { - Zotero.debug('Local repo checked recently, not cascading'); - } else { - try { - translatorMetadata = await this._updateFromRepo(reset); - } catch (e) { - Zotero.logError('Failed to retrieve translators from Zotero Repo ' + e); - } - } - } - - if (translatorMetadata) { - await Zotero.Translators.update(translatorMetadata, reset || isFromStandalone); - } - - if (_timeoutID) clearTimeout(_timeoutID); - let nextCheckIn; - if (translatorMetadata) { - // We got translator metadata so schedule a normal check in 24hrs - nextCheckIn = (ZOTERO_CONFIG.REPOSITORY_CHECK_INTERVAL * 1000) + 2000; - } else if (repoCheckIntervalExpired || reset) { - // We failed to get metadata and repo check interval expired or this was a - // forced reset, so schedule a check soon (in 1hr) in hopes repo comes back alive - nextCheckIn = ZOTERO_CONFIG.REPOSITORY_RETRY_INTERVAL * 1000; - } else { - // We failed to get metadata but this was neither a forced reset nor a scheduled check - // which means probably the user just restarted their browser, - // so we schedule the next check when the cascadeToRepo time is up - nextCheckIn = now - nextCascadeToRepo + 2000; - } - _timeoutID = setTimeout(this.update.bind(this, [reset]), nextCheckIn); - Zotero.debug(`Repo: Next check in ${nextCheckIn/1000}s`); - }; - - /** - * Get translator code from repository - * @param {String} translatorID ID of the translator to retrieve code for - * @param {Boolean} debugMode used in translator tester to prevent fetching from repo - */ - this.getTranslatorCode = async function(translatorID, debugMode) { - var translator = await Zotero.Translators.getWithoutCode(translatorID); - var code; - - // try standalone - try { - code = await Zotero.Connector.callMethod("getTranslatorCode", { - translatorID: translatorID - }) - } catch (e) {} - - // Don't fetch from repo in debug mode - if (!code && !debugMode) { - // then try repo - const url = `${ZOTERO_CONFIG.REPOSITORY_URL}code/${translatorID}?version=${Zotero.version}`; - try { - let xhr = await Zotero.HTTP.request("GET", url); - code = xhr.responseText; - } catch (e) {} - } - - if (!code) { - throw new Error(`Failed to fetch code for translator ${translator.label}`) - } - - var m = Zotero.Repo.infoRe.exec(code); - if (!m) { - throw new Error("Invalid or missing translator metadata JSON object for " + translator.label); - } - - try { - var metadata = JSON.parse(m[0]); - } catch (e) { - throw new Error("Invalid or missing translator metadata JSON object for " + translator.label); - } - - if (metadata.lastUpdated !== translator.lastUpdated) { - if (Zotero.Date.sqlToDate(metadata.lastUpdated) > Zotero.Date.sqlToDate(translator.lastUpdated)) { - Zotero.debug("Repo: Retrieved code for " + metadata.label + " newer than stored metadata; updating"); - await Zotero.Translators.update([metadata]); - } else { - Zotero.debug("Repo: Retrieved code for " + metadata.label + " older than stored metadata; not caching"); - } - } - return code; - }; - - /** - * Retrieve translator metadata from Zotero Standalone - */ - this._updateFromStandalone = async function() { - let translatorMetadata = await Zotero.Connector.callMethod("getTranslators", {}); - Zotero.Prefs.set("connector.repo.lastCheck.localTime", Date.now()); - return translatorMetadata; - - } - - /** - * Retrieve metadata from repository - */ - this._updateFromRepo = async function(reset) { - var url = ZOTERO_CONFIG.REPOSITORY_URL + "metadata?version=" + Zotero.version + "&last=" + - (reset ? "0" : Zotero.Prefs.get("connector.repo.lastCheck.repoTime")); - - xhr = await Zotero.HTTP.request('GET', url); - var date = xhr.getResponseHeader("Date"); - Zotero.Prefs.set("connector.repo.lastCheck.localTime", Date.now()); - Zotero.Prefs.set("connector.repo.lastCheck.repoTime", Math.floor(Date.parse(date) / 1000)); - return JSON.parse(xhr.responseText); - } -} \ No newline at end of file diff --git a/external-scripts/schema.js b/external-scripts/schema.js deleted file mode 100644 index 20e10be1..00000000 --- a/external-scripts/schema.js +++ /dev/null @@ -1,11069 +0,0 @@ -// CHANGED: Inserted info from https://github.com/zotero/zotero-schema/blob/master/schema.json -// TODO: Might do this automatically using the gulp file -var data = { - "version": 14, - "itemTypes": [{ - "itemType": "annotation", - "fields": [], - "creatorTypes": [] - }, - { - "itemType": "artwork", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "artworkMedium", - "baseField": "medium" - }, - { - "field": "artworkSize" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "artist", - "primary": true - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "attachment", - "fields": [{ - "field": "title" - }, - { - "field": "accessDate" - }, - { - "field": "url" - } - ], - "creatorTypes": [] - }, - { - "itemType": "audioRecording", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "audioRecordingFormat", - "baseField": "medium" - }, - { - "field": "seriesTitle" - }, - { - "field": "volume" - }, - { - "field": "numberOfVolumes" - }, - { - "field": "place" - }, - { - "field": "label", - "baseField": "publisher" - }, - { - "field": "date" - }, - { - "field": "runningTime" - }, - { - "field": "language" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "performer", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "composer" - }, - { - "creatorType": "wordsBy" - } - ] - }, - { - "itemType": "bill", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "billNumber", - "baseField": "number" - }, - { - "field": "code" - }, - { - "field": "codeVolume", - "baseField": "volume" - }, - { - "field": "section" - }, - { - "field": "codePages", - "baseField": "pages" - }, - { - "field": "legislativeBody" - }, - { - "field": "session" - }, - { - "field": "history" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "shortTitle" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "sponsor", - "primary": true - }, - { - "creatorType": "cosponsor" - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "blogPost", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "blogTitle", - "baseField": "publicationTitle" - }, - { - "field": "websiteType", - "baseField": "type" - }, - { - "field": "date" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "commenter" - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "book", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "series" - }, - { - "field": "seriesNumber" - }, - { - "field": "volume" - }, - { - "field": "numberOfVolumes" - }, - { - "field": "edition" - }, - { - "field": "place" - }, - { - "field": "publisher" - }, - { - "field": "date" - }, - { - "field": "numPages" - }, - { - "field": "language" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "editor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "seriesEditor" - } - ] - }, - { - "itemType": "bookSection", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "bookTitle", - "baseField": "publicationTitle" - }, - { - "field": "series" - }, - { - "field": "seriesNumber" - }, - { - "field": "volume" - }, - { - "field": "numberOfVolumes" - }, - { - "field": "edition" - }, - { - "field": "place" - }, - { - "field": "publisher" - }, - { - "field": "date" - }, - { - "field": "pages" - }, - { - "field": "language" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "editor" - }, - { - "creatorType": "bookAuthor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "seriesEditor" - } - ] - }, - { - "itemType": "case", - "fields": [{ - "field": "caseName", - "baseField": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "court" - }, - { - "field": "dateDecided", - "baseField": "date" - }, - { - "field": "docketNumber", - "baseField": "number" - }, - { - "field": "reporter" - }, - { - "field": "reporterVolume", - "baseField": "volume" - }, - { - "field": "firstPage", - "baseField": "pages" - }, - { - "field": "history" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "counsel" - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "computerProgram", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "seriesTitle" - }, - { - "field": "versionNumber" - }, - { - "field": "date" - }, - { - "field": "system" - }, - { - "field": "place" - }, - { - "field": "company", - "baseField": "publisher" - }, - { - "field": "programmingLanguage" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "rights" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "accessDate" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "programmer", - "primary": true - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "conferencePaper", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "date" - }, - { - "field": "proceedingsTitle", - "baseField": "publicationTitle" - }, - { - "field": "conferenceName" - }, - { - "field": "place" - }, - { - "field": "publisher" - }, - { - "field": "volume" - }, - { - "field": "pages" - }, - { - "field": "series" - }, - { - "field": "language" - }, - { - "field": "DOI" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "editor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "seriesEditor" - } - ] - }, - { - "itemType": "dictionaryEntry", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "dictionaryTitle", - "baseField": "publicationTitle" - }, - { - "field": "series" - }, - { - "field": "seriesNumber" - }, - { - "field": "volume" - }, - { - "field": "numberOfVolumes" - }, - { - "field": "edition" - }, - { - "field": "place" - }, - { - "field": "publisher" - }, - { - "field": "date" - }, - { - "field": "pages" - }, - { - "field": "language" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "editor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "seriesEditor" - } - ] - }, - { - "itemType": "document", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "publisher" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "editor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "reviewedAuthor" - } - ] - }, - { - "itemType": "email", - "fields": [{ - "field": "subject", - "baseField": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "date" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "language" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "recipient" - } - ] - }, - { - "itemType": "encyclopediaArticle", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "encyclopediaTitle", - "baseField": "publicationTitle" - }, - { - "field": "series" - }, - { - "field": "seriesNumber" - }, - { - "field": "volume" - }, - { - "field": "numberOfVolumes" - }, - { - "field": "edition" - }, - { - "field": "place" - }, - { - "field": "publisher" - }, - { - "field": "date" - }, - { - "field": "pages" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "language" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "editor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "seriesEditor" - } - ] - }, - { - "itemType": "film", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "distributor", - "baseField": "publisher" - }, - { - "field": "date" - }, - { - "field": "genre", - "baseField": "type" - }, - { - "field": "videoRecordingFormat", - "baseField": "medium" - }, - { - "field": "runningTime" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "director", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "scriptwriter" - }, - { - "creatorType": "producer" - } - ] - }, - { - "itemType": "forumPost", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "forumTitle", - "baseField": "publicationTitle" - }, - { - "field": "postType", - "baseField": "type" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "hearing", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "committee" - }, - { - "field": "place" - }, - { - "field": "publisher" - }, - { - "field": "numberOfVolumes" - }, - { - "field": "documentNumber", - "baseField": "number" - }, - { - "field": "pages" - }, - { - "field": "legislativeBody" - }, - { - "field": "session" - }, - { - "field": "history" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "contributor", - "primary": true - }] - }, - { - "itemType": "instantMessage", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "recipient" - } - ] - }, - { - "itemType": "interview", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "date" - }, - { - "field": "interviewMedium", - "baseField": "medium" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "interviewee", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "interviewer" - }, - { - "creatorType": "translator" - } - ] - }, - { - "itemType": "journalArticle", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "publicationTitle" - }, - { - "field": "volume" - }, - { - "field": "issue" - }, - { - "field": "pages" - }, - { - "field": "date" - }, - { - "field": "series" - }, - { - "field": "seriesTitle" - }, - { - "field": "seriesText" - }, - { - "field": "journalAbbreviation" - }, - { - "field": "language" - }, - { - "field": "DOI" - }, - { - "field": "ISSN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "editor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "reviewedAuthor" - } - ] - }, - { - "itemType": "letter", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "letterType", - "baseField": "type" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "recipient" - } - ] - }, - { - "itemType": "magazineArticle", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "publicationTitle" - }, - { - "field": "volume" - }, - { - "field": "issue" - }, - { - "field": "date" - }, - { - "field": "pages" - }, - { - "field": "language" - }, - { - "field": "ISSN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "reviewedAuthor" - } - ] - }, - { - "itemType": "manuscript", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "manuscriptType", - "baseField": "type" - }, - { - "field": "place" - }, - { - "field": "date" - }, - { - "field": "numPages" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "translator" - } - ] - }, - { - "itemType": "map", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "mapType", - "baseField": "type" - }, - { - "field": "scale" - }, - { - "field": "seriesTitle" - }, - { - "field": "edition" - }, - { - "field": "place" - }, - { - "field": "publisher" - }, - { - "field": "date" - }, - { - "field": "language" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "cartographer", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "seriesEditor" - } - ] - }, - { - "itemType": "newspaperArticle", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "publicationTitle" - }, - { - "field": "place" - }, - { - "field": "edition" - }, - { - "field": "date" - }, - { - "field": "section" - }, - { - "field": "pages" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "ISSN" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "reviewedAuthor" - } - ] - }, - { - "itemType": "note", - "fields": [], - "creatorTypes": [] - }, - { - "itemType": "patent", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "place" - }, - { - "field": "country" - }, - { - "field": "assignee" - }, - { - "field": "issuingAuthority" - }, - { - "field": "patentNumber", - "baseField": "number" - }, - { - "field": "filingDate" - }, - { - "field": "pages" - }, - { - "field": "applicationNumber" - }, - { - "field": "priorityNumbers" - }, - { - "field": "issueDate", - "baseField": "date" - }, - { - "field": "references" - }, - { - "field": "legalStatus" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "inventor", - "primary": true - }, - { - "creatorType": "attorneyAgent" - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "podcast", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "seriesTitle" - }, - { - "field": "episodeNumber", - "baseField": "number" - }, - { - "field": "audioFileType", - "baseField": "medium" - }, - { - "field": "runningTime" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "podcaster", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "guest" - } - ] - }, - { - "itemType": "presentation", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "presentationType", - "baseField": "type" - }, - { - "field": "date" - }, - { - "field": "place" - }, - { - "field": "meetingName" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "presenter", - "primary": true - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "radioBroadcast", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "programTitle", - "baseField": "publicationTitle" - }, - { - "field": "episodeNumber", - "baseField": "number" - }, - { - "field": "audioRecordingFormat", - "baseField": "medium" - }, - { - "field": "place" - }, - { - "field": "network", - "baseField": "publisher" - }, - { - "field": "date" - }, - { - "field": "runningTime" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "director", - "primary": true - }, - { - "creatorType": "scriptwriter" - }, - { - "creatorType": "producer" - }, - { - "creatorType": "castMember" - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "guest" - } - ] - }, - { - "itemType": "report", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "reportNumber", - "baseField": "number" - }, - { - "field": "reportType", - "baseField": "type" - }, - { - "field": "seriesTitle" - }, - { - "field": "place" - }, - { - "field": "institution", - "baseField": "publisher" - }, - { - "field": "date" - }, - { - "field": "pages" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "translator" - }, - { - "creatorType": "seriesEditor" - } - ] - }, - { - "itemType": "statute", - "fields": [{ - "field": "nameOfAct", - "baseField": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "code" - }, - { - "field": "codeNumber" - }, - { - "field": "publicLawNumber", - "baseField": "number" - }, - { - "field": "dateEnacted", - "baseField": "date" - }, - { - "field": "pages" - }, - { - "field": "section" - }, - { - "field": "session" - }, - { - "field": "history" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "thesis", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "thesisType", - "baseField": "type" - }, - { - "field": "university", - "baseField": "publisher" - }, - { - "field": "place" - }, - { - "field": "date" - }, - { - "field": "numPages" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "tvBroadcast", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "programTitle", - "baseField": "publicationTitle" - }, - { - "field": "episodeNumber", - "baseField": "number" - }, - { - "field": "videoRecordingFormat", - "baseField": "medium" - }, - { - "field": "place" - }, - { - "field": "network", - "baseField": "publisher" - }, - { - "field": "date" - }, - { - "field": "runningTime" - }, - { - "field": "language" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "director", - "primary": true - }, - { - "creatorType": "scriptwriter" - }, - { - "creatorType": "producer" - }, - { - "creatorType": "castMember" - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "guest" - } - ] - }, - { - "itemType": "videoRecording", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "videoRecordingFormat", - "baseField": "medium" - }, - { - "field": "seriesTitle" - }, - { - "field": "volume" - }, - { - "field": "numberOfVolumes" - }, - { - "field": "place" - }, - { - "field": "studio", - "baseField": "publisher" - }, - { - "field": "date" - }, - { - "field": "runningTime" - }, - { - "field": "language" - }, - { - "field": "ISBN" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "archive" - }, - { - "field": "archiveLocation" - }, - { - "field": "libraryCatalog" - }, - { - "field": "callNumber" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "director", - "primary": true - }, - { - "creatorType": "scriptwriter" - }, - { - "creatorType": "producer" - }, - { - "creatorType": "castMember" - }, - { - "creatorType": "contributor" - } - ] - }, - { - "itemType": "webpage", - "fields": [{ - "field": "title" - }, - { - "field": "abstractNote" - }, - { - "field": "websiteTitle", - "baseField": "publicationTitle" - }, - { - "field": "websiteType", - "baseField": "type" - }, - { - "field": "date" - }, - { - "field": "shortTitle" - }, - { - "field": "url" - }, - { - "field": "accessDate" - }, - { - "field": "language" - }, - { - "field": "rights" - }, - { - "field": "extra" - } - ], - "creatorTypes": [{ - "creatorType": "author", - "primary": true - }, - { - "creatorType": "contributor" - }, - { - "creatorType": "translator" - } - ] - } - ], - "meta": { - "fields": { - "date": { - "type": "date" - }, - "filingDate": { - "type": "date" - } - } - }, - "csl": { - "types": { - "article": [ - "document", - "attachment", - "note" - ], - "article-journal": [ - "journalArticle" - ], - "article-magazine": [ - "magazineArticle" - ], - "article-newspaper": [ - "newspaperArticle" - ], - "bill": [ - "bill", - "hearing" - ], - "book": [ - "book", - "computerProgram" - ], - "broadcast": [ - "podcast", - "tvBroadcast", - "radioBroadcast" - ], - "chapter": [ - "bookSection" - ], - "entry-dictionary": [ - "dictionaryEntry" - ], - "entry-encyclopedia": [ - "encyclopediaArticle" - ], - "graphic": [ - "artwork" - ], - "interview": [ - "interview" - ], - "legal_case": [ - "case" - ], - "legislation": [ - "statute" - ], - "manuscript": [ - "manuscript" - ], - "map": [ - "map" - ], - "motion_picture": [ - "film", - "videoRecording" - ], - "paper-conference": [ - "conferencePaper" - ], - "patent": [ - "patent" - ], - "personal_communication": [ - "letter", - "email", - "instantMessage" - ], - "post": [ - "forumPost" - ], - "post-weblog": [ - "blogPost" - ], - "report": [ - "report" - ], - "song": [ - "audioRecording" - ], - "speech": [ - "presentation" - ], - "thesis": [ - "thesis" - ], - "webpage": [ - "webpage" - ] - }, - "fields": { - "text": { - "abstract": [ - "abstractNote" - ], - "archive": [ - "archive" - ], - "archive_location": [ - "archiveLocation" - ], - "authority": [ - "court", - "legislativeBody", - "issuingAuthority" - ], - "call-number": [ - "callNumber", - "applicationNumber" - ], - "chapter-number": [ - "session" - ], - "collection-number": [ - "seriesNumber" - ], - "collection-title": [ - "seriesTitle", - "series" - ], - "container-title": [ - "publicationTitle", - "reporter", - "code" - ], - "dimensions": [ - "artworkSize", - "runningTime" - ], - "DOI": [ - "DOI" - ], - "edition": [ - "edition" - ], - "event": [ - "meetingName", - "conferenceName" - ], - "event-place": [ - "place" - ], - "genre": [ - "type", - "programmingLanguage" - ], - "ISBN": [ - "ISBN" - ], - "ISSN": [ - "ISSN" - ], - "issue": [ - "issue", - "priorityNumbers" - ], - "journalAbbreviation": [ - "journalAbbreviation" - ], - "language": [ - "language" - ], - "medium": [ - "medium", - "system" - ], - "note": [ - "extra" - ], - "number": [ - "number" - ], - "number-of-pages": [ - "numPages" - ], - "number-of-volumes": [ - "numberOfVolumes" - ], - "page": [ - "pages" - ], - "publisher": [ - "publisher" - ], - "publisher-place": [ - "place" - ], - "references": [ - "history", - "references" - ], - "scale": [ - "scale" - ], - "section": [ - "section", - "committee" - ], - "shortTitle": [ - "shortTitle" - ], - "source": [ - "libraryCatalog" - ], - "status": [ - "legalStatus" - ], - "title": [ - "title" - ], - "title-short": [ - "shortTitle" - ], - "URL": [ - "url" - ], - "version": [ - "versionNumber" - ], - "volume": [ - "volume", - "codeNumber" - ] - }, - "date": { - "accessed": "accessDate", - "issued": "date", - "submitted": "filingDate" - } - }, - "names": { - "author": "author", - "bookAuthor": "container-author", - "composer": "composer", - "director": "director", - "editor": "editor", - "interviewer": "interviewer", - "recipient": "recipient", - "reviewedAuthor": "reviewed-author", - "seriesEditor": "collection-editor", - "translator": "translator" - } - }, - "locales": { - "af-ZA": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Artwork", - "attachment": "Attachment", - "audioRecording": "Audio Recording", - "bill": "Bill", - "blogPost": "Blog Post", - "book": "Book", - "bookSection": "Book Section", - "case": "Case", - "computerProgram": "Software", - "conferencePaper": "Conference Paper", - "dictionaryEntry": "Dictionary Entry", - "document": "Document", - "email": "E-mail", - "encyclopediaArticle": "Encyclopedia Article", - "film": "Film", - "forumPost": "Forum Post", - "hearing": "Hearing", - "instantMessage": "Instant Message", - "interview": "Interview", - "journalArticle": "Journal Article", - "letter": "Letter", - "magazineArticle": "Magazine Article", - "manuscript": "Manuscript", - "map": "Map", - "newspaperArticle": "Newspaper Article", - "note": "Note", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Presentation", - "radioBroadcast": "Radio Broadcast", - "report": "Report", - "statute": "Statute", - "thesis": "Thesis", - "tvBroadcast": "TV Broadcast", - "videoRecording": "Video Recording", - "webpage": "Web Page" - }, - "fields": { - "abstractNote": "Abstract", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "Archive", - "archiveLocation": "Loc. in Archive", - "artworkMedium": "Medium", - "artworkSize": "Artwork Size", - "assignee": "Assignee", - "audioFileType": "File Type", - "audioRecordingFormat": "Format", - "billNumber": "Bill Number", - "blogTitle": "Blog Title", - "bookTitle": "Book Title", - "callNumber": "Call Number", - "caseName": "Case Name", - "code": "Code", - "codeNumber": "Code Number", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "Committee", - "company": "Company", - "conferenceName": "Conference Name", - "country": "Country", - "court": "Court", - "date": "Date", - "dateAdded": "Date Added", - "dateDecided": "Date Decided", - "dateEnacted": "Date Enacted", - "dateModified": "Modified", - "dictionaryTitle": "Dictionary Title", - "distributor": "Distributor", - "docketNumber": "Docket Number", - "documentNumber": "Document Number", - "DOI": "DOI", - "edition": "Edition", - "encyclopediaTitle": "Encyclopedia Title", - "episodeNumber": "Episode Number", - "extra": "Extra", - "filingDate": "Filing Date", - "firstPage": "First Page", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "History", - "institution": "Institution", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Issue", - "issueDate": "Issue Date", - "issuingAuthority": "Issuing Authority", - "itemType": "Type", - "journalAbbreviation": "Journal Abbr", - "label": "Label", - "language": "Language", - "legalStatus": "Legal Status", - "legislativeBody": "Legislative Body", - "letterType": "Type", - "libraryCatalog": "Library Catalog", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Meeting Name", - "nameOfAct": "Name of Act", - "network": "Network", - "number": "Number", - "numberOfVolumes": "# of Volumes", - "numPages": "# of Pages", - "pages": "Pages", - "patentNumber": "Patent Number", - "place": "Place", - "postType": "Post Type", - "presentationType": "Type", - "priorityNumbers": "Priority Numbers", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "Publication", - "publicLawNumber": "Public Law Number", - "publisher": "Publisher", - "references": "References", - "reporter": "Reporter", - "reporterVolume": "Reporter Volume", - "reportNumber": "Report Number", - "reportType": "Report Type", - "rights": "Rights", - "runningTime": "Running Time", - "scale": "Scale", - "section": "Section", - "series": "Series", - "seriesNumber": "Series Number", - "seriesText": "Series Text", - "seriesTitle": "Series Title", - "session": "Session", - "shortTitle": "Short Title", - "studio": "Studio", - "subject": "Subject", - "system": "System", - "thesisType": "Type", - "title": "Title", - "university": "University", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Website Title", - "websiteType": "Website Type" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Attorney/Agent", - "author": "Author", - "bookAuthor": "Book Author", - "cartographer": "Cartographer", - "castMember": "Cast Member", - "commenter": "Commenter", - "composer": "Composer", - "contributor": "Contributor", - "cosponsor": "Cosponsor", - "counsel": "Counsel", - "director": "Director", - "editor": "Editor", - "guest": "Guest", - "interviewee": "Interview With", - "interviewer": "Interviewer", - "inventor": "Inventor", - "performer": "Performer", - "podcaster": "Podcaster", - "presenter": "Presenter", - "producer": "Producer", - "programmer": "Programmer", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Scriptwriter", - "seriesEditor": "Series Editor", - "sponsor": "Sponsor", - "translator": "Translator", - "wordsBy": "Words By" - } - }, - "ar": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "عمل ÙÙ†Ù", - "attachment": "مرÙÙ‚", - "audioRecording": "تسجÙÙ„ صوتÙ", - "bill": "مسودّة قانون", - "blogPost": "موضوع Ù٠مدونة", - "book": "كتاب", - "bookSection": "قسم Ù٠كتاب", - "case": "Ù‚Ø¶ÙØ©", - "computerProgram": "Software", - "conferencePaper": "ورقة عمل Ù٠مؤتمر", - "dictionaryEntry": "كلمة Ù٠المعجم", - "document": "مستند", - "email": "Ø¨Ø±ÙØ¯ الكترونÙ", - "encyclopediaArticle": "مقالة Ù٠موسوعة", - "film": "ÙÙلم", - "forumPost": "موضوع Ù٠منتدى", - "hearing": "سماع شهادة", - "instantMessage": "مراسلة ÙÙˆØ±ÙØ© على الانترنت", - "interview": "مقابلة", - "journalArticle": "مقالة ÙÙ Ø¯ÙˆØ±ÙØ©", - "letter": "خطاب", - "magazineArticle": "مقالة Ù٠مجلة", - "manuscript": "مخطوطة", - "map": "Ø®Ø±ÙØ·Ø©", - "newspaperArticle": "مقالة ÙÙ Ø¬Ø±ÙØ¯Ø©", - "note": "ملاحظة", - "patent": "براءة الإختراع", - "podcast": "تدوÙنة ÙˆØ³Ø§Ø¦Ø·ÙØ©", - "presentation": "عرض تقدÙÙ…Ù", - "radioBroadcast": "بث إذاعÙ", - "report": "ØªÙ‚Ø±ÙØ±", - "statute": "قانون", - "thesis": "أطروحة", - "tvBroadcast": "بث ØªÙ„ÙØ²ÙونÙ", - "videoRecording": "تسجÙÙ„ ÙÙØ¯ÙÙˆ", - "webpage": "ØµÙØ­Ø© ÙˆÙØ¨" - }, - "fields": { - "abstractNote": "المستخلص", - "accessDate": "ØªØ§Ø±ÙØ® الدخول", - "applicationNumber": "رقم الطلب", - "archive": "الارشÙÙ", - "archiveLocation": "الموقع Ù٠الأرشÙÙ", - "artworkMedium": "ÙˆØ³ÙØ· العمل الÙÙ†Ù", - "artworkSize": "حجم العمل الÙÙ†Ù", - "assignee": "المخول بالمهمة", - "audioFileType": "نوع المل٠الصوتÙ", - "audioRecordingFormat": "ØµÙØºØ© التسجÙÙ„ الصوتÙ", - "billNumber": "رقم مسودّة القانون", - "blogTitle": "عنوان المدونة", - "bookTitle": "عنوان الكتاب", - "callNumber": "رقم الإسترجاع", - "caseName": "اسم Ø§Ù„Ù‚Ø¶ÙØ©", - "code": "التشÙÙØ±", - "codeNumber": "رقم الرمز", - "codePages": "ØµÙØ­Ø§Øª القانون", - "codeVolume": "مجلد القانون", - "committee": "اللجنة", - "company": "الشركة", - "conferenceName": "اسم المؤتمر", - "country": "البلد", - "court": "المحكمة", - "date": "Ø§Ù„ØªØ§Ø±ÙØ®", - "dateAdded": "ØªØ§Ø±ÙØ® Ø§Ù„Ø¥Ø¶Ø§ÙØ©", - "dateDecided": "ØªØ§Ø±ÙØ® الحكم", - "dateEnacted": "ØªØ§Ø±ÙØ® سن القانون", - "dateModified": "ØªØ§Ø±ÙØ® التعدÙÙ„", - "dictionaryTitle": "عنوان القاموس", - "distributor": "الموزع", - "docketNumber": "رقم Ø§Ù„Ù‚Ø¶ÙØ©", - "documentNumber": "رقم المستند", - "DOI": "معر٠الكائن الرقمÙ", - "edition": "الطبعة", - "encyclopediaTitle": "عنوان الموسوعة", - "episodeNumber": "رقم الموضوع", - "extra": "معلومات إضاÙÙØ©", - "filingDate": "ØªØ§Ø±ÙØ® Ø§Ù„Ø§ÙØ¯Ø§Ø¹", - "firstPage": "Ø§Ù„ØµÙØ­Ø© الأولى", - "forumTitle": "عنوان المنتدى", - "genre": "النوع الأدبÙ", - "history": "Ø§Ù„ØªØ§Ø±ÙØ®", - "institution": "المؤسسة", - "interviewMedium": "ÙˆØ³ÙØ· المقابلة", - "ISBN": "تدمك", - "ISSN": "تدمد", - "issue": "العدد", - "issueDate": "ØªØ§Ø±ÙØ® الإصدار", - "issuingAuthority": "Ù…Ø³Ø¦ÙˆÙ„ÙØ© الاصدار", - "itemType": "نوع العنصر", - "journalAbbreviation": "اختصار Ø§Ù„Ø¯ÙˆØ±ÙØ©", - "label": "علامة", - "language": "اللغة", - "legalStatus": "الحالة Ø§Ù„Ù‚Ø§Ù†ÙˆÙ†ÙØ©", - "legislativeBody": "الجهة Ø§Ù„ØªØ´Ø±ÙØ¹ÙØ©", - "letterType": "نوع الخطاب", - "libraryCatalog": "Ùهرس المكتبة", - "manuscriptType": "نوع المخطوطة", - "mapType": "نوع Ø§Ù„Ø®Ø±ÙØ·Ø©", - "meetingName": "اسم الإجتماع", - "nameOfAct": "اسم القانون", - "network": "الشبكة", - "number": "الرقم", - "numberOfVolumes": "عدد المجلدات", - "numPages": "عدد Ø§Ù„ØµÙØ­Ø§Øª", - "pages": "Ø§Ù„ØµÙØ­Ø§Øª", - "patentNumber": "رقم البرائة", - "place": "المكان", - "postType": "نوع الموضوع", - "presentationType": "نوع العرض التقدÙÙ…Ù", - "priorityNumbers": "ارقام Ø§Ù„Ø£ÙˆÙ„ÙˆÙØ©", - "proceedingsTitle": "عنوان ورقة العمل", - "programmingLanguage": "Prog. Language", - "programTitle": "عنوان البرنامج", - "publicationTitle": "عنوان المنشور", - "publicLawNumber": "رقم القانون العام", - "publisher": "الناشر", - "references": "مراجع", - "reporter": "المراسل", - "reporterVolume": "مجلد الأحكام", - "reportNumber": "رقم Ø§Ù„ØªÙ‚Ø±ÙØ±", - "reportType": "نوع Ø§Ù„ØªÙ‚Ø±ÙØ±", - "rights": "الحقوق", - "runningTime": "وقت التشغÙÙ„", - "scale": "Ù…Ù‚ÙØ§Ø³ الرسم", - "section": "القسم", - "series": "السلسلة", - "seriesNumber": "رقم السلسلة", - "seriesText": "نص السلسلة", - "seriesTitle": "عنوان السلسلة", - "session": "الجلسة", - "shortTitle": "العنوان المختصر", - "studio": "الأستودÙÙˆ", - "subject": "الموضوع", - "system": "النظام", - "thesisType": "نوع الأطروحة", - "title": "العنوان", - "university": "الجامعة", - "url": "عنوان الموقع", - "versionNumber": "Version", - "videoRecordingFormat": "ØµÙØºØ© التسجÙÙ„ المرئÙ", - "volume": "المجلد", - "websiteTitle": "اسم موقع Ø§Ù„ÙˆÙØ¨", - "websiteType": "نوع موقع Ø§Ù„ÙˆÙØ¨" - }, - "creatorTypes": { - "artist": "الÙنان", - "attorneyAgent": "المحام٠أو الوكÙÙ„", - "author": "المؤلÙ", - "bookAuthor": "مؤل٠كتاب", - "cartographer": "رسام Ø§Ù„Ø®Ø±ÙØ·Ø©", - "castMember": "عضو طاقم التمثÙÙ„", - "commenter": "المعلق", - "composer": "الملحن", - "contributor": "اسم المشارك", - "cosponsor": "الراع٠المشارك", - "counsel": "المستشار", - "director": "المخرج", - "editor": "المحرر", - "guest": "الضÙÙ", - "interviewee": "مقابلة مع", - "interviewer": "المحاور", - "inventor": "المخترع", - "performer": "الÙنان", - "podcaster": "المدون", - "presenter": "المقدم", - "producer": "المنتج", - "programmer": "المبرمج", - "recipient": "المتلقÙ", - "reviewedAuthor": "مؤل٠مراجع", - "scriptwriter": "كاتب الحوار", - "seriesEditor": "محرر السلسلة", - "sponsor": "الراعÙ", - "translator": "المترجم", - "wordsBy": "من كلمات" - } - }, - "bg-BG": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "ĐŸÑ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Đµ Đ½Đ° Đ¸Đ·ĐºÑƒÑÑ‚Đ²Đ¾Ñ‚Đ¾", - "attachment": "ĐŸÑ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ", - "audioRecording": "Đ—Đ²ÑƒĐºĐ¾Đ·Đ°Đ¿Đ¸Ñ", - "bill": "Đ—Đ°ĐºĐ¾Đ½", - "blogPost": "Đ¡ÑĐ¾Đ±Ñ‰ĐµĐ½Đ¸Đµ Đ² Đ±Đ»Đ¾Đ³", - "book": "ĐĐ½Đ¸Đ³Đ°", - "bookSection": "Đ“Đ»Đ°Đ²Đ° Đ¾Ñ‚ ĐºĐ½Đ¸Đ³Đ°", - "case": "Đ¡ÑĐ´ĐµĐ±Đ½Đ¾ Ñ€ĐµÑˆĐµĐ½Đ¸Đµ", - "computerProgram": "Software", - "conferencePaper": "ĐŸÑƒĐ±Đ»Đ¸ĐºĐ°Ñ†Đ¸Ñ Đ¾Ñ‚ ĐºĐ¾Đ½Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Ñ", - "dictionaryEntry": "ĐĐ¿Ñ€ĐµĐ´ĐµĐ»ĐµĐ½Đ¸Đµ Đ² Ñ€ĐµÑ‡Đ½Đ¸Đº", - "document": "Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚", - "email": "Đ•Đ»ĐµĐºÑ‚Ñ€Đ¾Đ½Đ½Đ° Đ¿Đ¾Ñ‰Đ°", - "encyclopediaArticle": "Đ¡Ñ‚Đ°Ñ‚Đ¸Ñ Đ² ĐµĐ½Ñ†Đ¸ĐºĐ»Đ¾Đ¿ĐµĐ´Đ¸Ñ", - "film": "Đ¤Đ¸Đ»Đ¼", - "forumPost": "Đ¡ÑĐ¾Đ±Ñ‰ĐµĐ½Đ¸Đµ Đ²ÑĐ² Ñ„Đ¾Ñ€ÑƒĐ¼", - "hearing": "ЗаÑĐµĐ´Đ°Đ½Đ¸Đµ", - "instantMessage": "Đ‘ÑÑ€Đ·Đ¾ ÑÑĐ¾Đ±Ñ‰ĐµĐ½Đ¸Đµ", - "interview": "Đ˜Đ½Ñ‚ĐµÑ€Đ²Ñ", - "journalArticle": "Đ¡Ñ‚Đ°Ñ‚Đ¸Ñ Đ² Đ½Đ°ÑƒÑ‡Đ½Đ¾ ÑĐ¿Đ¸ÑĐ°Đ½Đ¸Đµ", - "letter": "ĐŸĐ¸ÑĐ¼Đ¾", - "magazineArticle": "Đ¡Ñ‚Đ°Ñ‚Đ¸Ñ Đ² ÑĐ¿Đ¸ÑĐ°Đ½Đ¸Đµ", - "manuscript": "Đ ÑĐºĐ¾Đ¿Đ¸Ñ", - "map": "ĐĐ°Ñ€Ñ‚Đ°", - "newspaperArticle": "Đ¡Ñ‚Đ°Ñ‚Đ¸Ñ Đ²ÑĐ² Đ²ĐµÑÑ‚Đ½Đ¸Đº", - "note": "Đ‘ĐµĐ»ĐµĐ¶ĐºĐ°", - "patent": "ĐŸĐ°Ñ‚ĐµĐ½Ñ‚", - "podcast": "ĐŸĐ¾Đ´ĐºĐ°ÑÑ‚", - "presentation": "ĐŸÑ€ĐµĐ·ĐµĐ½Ñ‚Đ°Ñ†Đ¸Ñ", - "radioBroadcast": "Đ Đ°Đ´Đ¸Đ¾ излÑÑ‡Đ²Đ°Đ½Đµ", - "report": "ĐÑ‚Ñ‡ĐµÑ‚", - "statute": "ĐŸĐ¾Đ´Đ·Đ°ĐºĐ¾Đ½Đ¾Đ² Đ°ĐºÑ‚", - "thesis": "ДиÑĐµÑ€Ñ‚Đ°Ñ†Đ¸Ñ", - "tvBroadcast": "Đ¢ĐµĐ»ĐµĐ²Đ¸Đ·Đ¸Đ¾Đ½Đ½Đ¾ излÑÑ‡Đ²Đ°Đ½Đµ", - "videoRecording": "Đ’Đ¸Đ´ĐµĐ¾", - "webpage": "Đ˜Đ½Ñ‚ĐµÑ€Đ½ĐµÑ‚ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°" - }, - "fields": { - "abstractNote": "Đ˜Đ·Đ²Đ»ĐµÑ‡ĐµĐ½Đ¸Đµ", - "accessDate": "ĐÑ‚Đ²Đ¾Ñ€ĐµĐ½ Đ½Đ°", - "applicationNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° Đ¼Đ¾Đ»Đ±Đ°", - "archive": "Archive", - "archiveLocation": "ĐŸĐ¾Đ·Đ¸Ñ†Đ¸Ñ Đ² Đ°Ñ€Ñ…Đ¸Đ²Đ°", - "artworkMedium": "ĐœĐµĐ´Đ¸Ñ Đ½Đ° Đ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸ĐµÑ‚Đ¾:", - "artworkSize": "Đ Đ°Đ·Đ¼ĐµÑ€ Đ½Đ° Đ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸ĐµÑ‚Đ¾:", - "assignee": "Đ˜Đ·Đ¿ÑĐ»Đ½Đ¸Ñ‚ĐµĐ»", - "audioFileType": "Вид Ñ„Đ°Đ¹Đ»", - "audioRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "billNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° Đ·Đ°ĐºĐ¾Đ½", - "blogTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° Đ±Đ»Đ¾Đ³", - "bookTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° ĐºĐ½Đ¸Đ³Đ°", - "callNumber": "Đ¢ĐµĐ»ĐµÑ„Đ¾Đ½ĐµĐ½ Đ½Đ¾Đ¼ĐµÑ€", - "caseName": "Đ˜Đ¼Đµ Đ½Đ° Đ¿Đ°Ñ€Ñ‚Đ¸Đ´Đ°", - "code": "ĐĐ¾Đ´ĐµĐºÑ", - "codeNumber": "ĐĐ¾Đ´", - "codePages": "Đ¡Ñ‚Ñ€Đ°Đ½Đ¸Ñ†Đ¸ Đ½Đ° Đ·Đ°ĐºĐ¾Đ½Đ¾Đ´Đ°Ñ‚ĐµĐ»ÑÑ‚Đ²Đ¾", - "codeVolume": "Đ¢Đ¾Đ¼ Đ½Đ° Đ·Đ°ĐºĐ¾Đ½Đ¾Đ´Đ°Ñ‚ĐµĐ»ÑÑ‚Đ²Đ¾", - "committee": "ĐĐ¾Đ¼Đ¸Ñ‚ĐµÑ‚", - "company": "ĐĐ¾Đ¼Đ¿Đ°Đ½Đ¸Ñ", - "conferenceName": "Đ˜Đ¼Đµ Đ½Đ° ĐºĐ¾Đ½Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸ÑÑ‚Đ°", - "country": "Đ¡Ñ‚Ñ€Đ°Đ½Đ°", - "court": "Đ¡ÑĐ´", - "date": "Đ”Đ°Ñ‚Đ°", - "dateAdded": "Đ”Đ¾Đ±Đ°Đ²ĐµĐ½ Đ½Đ°:", - "dateDecided": "Đ”Đ°Ñ‚Đ° Đ½Đ° Ñ€ĐµÑˆĐµĐ½Đ¸Đµ", - "dateEnacted": "Đ”Đ°Ñ‚Đ° Đ½Đ° Đ²Đ»Đ¸Đ·Đ°Đ½Đµ Đ² Ñила", - "dateModified": "ĐŸÑ€Đ¾Đ¼ĐµĐ½ĐµĐ½ Đ½Đ°:", - "dictionaryTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° Ñ€ĐµÑ‡Đ½Đ¸Đº", - "distributor": "ДиÑÑ‚Ñ€Đ¸Đ±ÑƒÑ‚Đ¾Ñ€", - "docketNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ² Ñ€ĐµĐ³Đ¸ÑÑ‚ÑÑ€", - "documentNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚", - "DOI": "DOI", - "edition": "Đ˜Đ·Đ´Đ°Đ½Đ¸Đµ", - "encyclopediaTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° ĐµĐ½Ñ†Đ¸ĐºĐ»Đ¾Đ¿ĐµĐ´Đ¸Ñ", - "episodeNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° ĐµĐ¿Đ¸Đ·Đ¾Đ´", - "extra": "Đ”Đ¾Đ¿ÑĐ»Đ½Đ¸Ñ‚ĐµĐ»Đ½Đ¸", - "filingDate": "Đ”Đ°Ñ‚Đ° Đ½Đ° Đ°Ñ€Ñ…Đ¸Đ²Đ¸Ñ€Đ°Đ½Đµ", - "firstPage": "ĐŸÑÑ€Đ²Đ° ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°", - "forumTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Ñ Đ½Đ° Ñ„Đ¾Ñ€ÑƒĐ¼/listserv", - "genre": "Đ–Đ°Đ½Ñ€", - "history": "Đ˜ÑÑ‚Đ¾Ñ€Đ¸Ñ", - "institution": "Đ˜Đ½ÑÑ‚Đ¸Ñ‚ÑƒÑ†Đ¸Ñ", - "interviewMedium": "ĐœĐµĐ´Đ¸Ñ", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Đ‘Ñ€Đ¾Đ¹", - "issueDate": "Đ”Đ°Ñ‚Đ° Đ½Đ° Đ¸Đ·Đ´Đ°Đ²Đ°Đ½Đµ", - "issuingAuthority": "Đ˜Đ·Đ´Đ°Đ´ĐµĐ½ Đ¾Ñ‚", - "itemType": "Đ¢Đ¸Đ¿", - "journalAbbreviation": "Đ¡ÑĐºÑ€Đ°Ñ‚ĐµĐ½Đ¾ Đ¸Đ¼Đµ Đ½Đ° ÑĐ¿Đ¸ÑĐ°Đ½Đ¸ĐµÑ‚Đ¾", - "label": "Đ•Ñ‚Đ¸ĐºĐµÑ‚", - "language": "Đ•Đ·Đ¸Đº", - "legalStatus": "Đ—Đ°ĐºĐ¾Đ½Đ¾Đ² ÑÑ‚Đ°Ñ‚ÑƒÑ‚", - "legislativeBody": "Đ—Đ°ĐºĐ¾Đ½Đ¾Đ´Đ°Ñ‚ĐµĐ»Đ½Đ¾ Ñ‚ÑĐ»Đ¾", - "letterType": "Вид", - "libraryCatalog": "Library Catalog", - "manuscriptType": "Вид", - "mapType": "Вид", - "meetingName": "Đ˜Đ¼Đµ Đ½Đ° ÑÑ€ĐµÑ‰Đ°Ñ‚Đ°", - "nameOfAct": "Đ˜Đ¼Đµ Đ½Đ° Đ·Đ°ĐºĐ¾Đ½", - "network": "ĐœÑ€ĐµĐ¶Đ°", - "number": "ĐĐ¾Đ¼ĐµÑ€", - "numberOfVolumes": "ĐĐ¾Đ¼ĐµÑ€Đ° Đ½Đ° Ñ‚Đ¾Đ¼Đ¾Đ²ĐµÑ‚Đµ", - "numPages": "Đ±Ñ€Đ¾Đ¹ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ¸", - "pages": "Đ¡Ñ‚Ñ€Đ°Đ½Đ¸Ñ†Đ¸", - "patentNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° Đ¿Đ°Ñ‚ĐµĐ½Ñ‚", - "place": "ĐœÑÑÑ‚Đ¾", - "postType": "Вид ÑÑĐ¾Đ±Ñ‰ĐµĐ½Đ¸ĐµÑ‚Đ¾", - "presentationType": "Вид", - "priorityNumbers": "ĐŸÑ€Đ¸Đ¾Ñ€Đ¸Ñ‚ĐµÑ‚Đ½Đ¸ Đ½Đ¾Đ¼ĐµÑ€Đ°", - "proceedingsTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° Đ¿Ñ€Đ¾Ñ‚Đ¾ĐºĐ¾Đ»", - "programmingLanguage": "Prog. Language", - "programTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° Đ¾Ñ€Đ³Ñ€Đ°Đ¼Đ°", - "publicationTitle": "Đ˜Đ·Đ´Đ°Đ½Đ¸Đµ", - "publicLawNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° Đ·Đ°ĐºĐ¾Đ½", - "publisher": "Đ˜Đ·Đ´Đ°Ñ‚ĐµĐ»", - "references": "ĐÑ‚Đ¿Ñ€Đ°Ñ‚ĐºĐ¸", - "reporter": "Đ–ÑƒÑ€Đ½Đ°Đ»Đ¸ÑÑ‚", - "reporterVolume": "Đ¢Đ¾Đ¼ Đ½Đ° ÑÑ‚ĐµĐ½Đ¾Đ³Ñ€Đ°Đ¼Đ°Ñ‚Đ°", - "reportNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° Đ¾Ñ‚Ñ‡ĐµÑ‚", - "reportType": "Вид Đ¾Ñ‚Ñ‡ĐµÑ‚Đ°", - "rights": "ĐŸÑ€Đ°Đ²Đ°", - "runningTime": "ĐŸÑ€Đ¾Đ´ÑĐ»Đ¶Đ¸Ñ‚ĐµĐ»Đ½Đ¾ÑÑ‚", - "scale": "Đ¡ĐºĐ°Đ»Đ°", - "section": "Đ“Đ»Đ°Đ²Đ°", - "series": "ĐŸĐ¾Ñ€ĐµĐ´Đ¸Ñ†Đ°", - "seriesNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ½Đ° Đ¿Đ¾Ñ€ĐµĐ´Đ¸Ñ†Đ°Ñ‚Đ°", - "seriesText": "Đ¢ĐµĐºÑÑ‚ Đ½Đ° Đ¿Đ¾Ñ€ĐµĐ´Đ¸Ñ†Đ°Ñ‚Đ°", - "seriesTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° Đ¿Đ¾Ñ€ĐµĐ´Đ¸Ñ†Đ°Ñ‚Đ°", - "session": "Đ¡ĐµÑиÑ", - "shortTitle": "ĐÑÑĐ¾ Đ·Đ°Đ³Đ»Đ°Đ²Đ¸Đµ", - "studio": "Đ¡Ñ‚ÑƒĐ´Đ¸Đ¾", - "subject": "Đ¢ĐµĐ¼Đ°", - "system": "Đ¡Đ¸ÑÑ‚ĐµĐ¼Đ°", - "thesisType": "Вид", - "title": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ", - "university": "Đ£Đ½Đ¸Đ²ĐµÑ€ÑĐ¸Ñ‚ĐµÑ‚", - "url": "ĐĐ´Ñ€ĐµÑ", - "versionNumber": "Version", - "videoRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "volume": "Đ¢Đ¾Đ¼", - "websiteTitle": "Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ Đ½Đ° Đ¸Đ½Ñ‚ĐµÑ€Đ½ĐµÑ‚ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°", - "websiteType": "Вид Đ¸Đ½Ñ‚ĐµÑ€Đ½ĐµÑ‚ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°Ñ‚Đ°" - }, - "creatorTypes": { - "artist": "Đ¡ÑĐ·Đ´Đ°Ñ‚ĐµĐ»", - "attorneyAgent": "ĐĐ´Đ²Đ¾ĐºĐ°Ñ‚/ĐŸÑĐ»Đ½Đ¾Đ¼Đ¾Ñ‰Ñ‚Đ½Đ¸Đº", - "author": "ĐĐ²Ñ‚Đ¾Ñ€", - "bookAuthor": "ĐĐ²Ñ‚Đ¾Ñ€ Đ½Đ° ĐºĐ½Đ¸Đ³Đ°", - "cartographer": "ĐĐ°Ñ€Ñ‚Đ¾Đ³Ñ€Đ°Ñ„", - "castMember": "Đ§Đ»ĐµĐ½ Đ½Đ° Đ¢Ñ€ÑƒĐ¿Đ°Ñ‚Đ°", - "commenter": "ĐĐ¾Đ¼ĐµĐ½Ñ‚Đ°Ñ‚Đ¾Ñ€", - "composer": "ĐĐ¾Đ¼Đ¿Đ¾Đ·Đ¸Ñ‚Đ¾Ñ€", - "contributor": "Đ¡ÑÑ‚Ñ€ÑƒĐ´Đ½Đ¸Đº", - "cosponsor": "ĐĐ¾ÑĐ¿Đ¾Đ½ÑĐ¾Ñ€", - "counsel": "ĐĐ´Đ²Đ¾ĐºĐ°Ñ‚", - "director": "РежиÑÑŒĐ¾Ñ€", - "editor": "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€", - "guest": "Đ“Đ¾ÑÑ‚", - "interviewee": "Đ˜Đ½Ñ‚ĐµÑ€Đ²Ñ Ñ", - "interviewer": "Đ˜Đ½Ñ‚ĐµÑ€Đ²ÑĐ¸Ñ€Đ°Ñ‰", - "inventor": "ĐÑ‚ĐºÑ€Đ¸Đ²Đ°Ñ‚ĐµĐ»", - "performer": "Đ˜Đ·Đ¿ÑĐ»Đ½Đ¸Ñ‚ĐµĐ»", - "podcaster": "ĐĐ²Ñ‚Đ¾Ñ€ Đ½Đ° Đ¿Đ¾Đ´ĐºĐ°ÑÑ‚", - "presenter": "Đ˜Đ·Đ½ĐµÑĐµĐ½ Đ¾Ñ‚", - "producer": "ĐŸÑ€Đ¾Đ´ÑƒÑ†ĐµĐ½Ñ‚", - "programmer": "ĐŸÑ€Đ¾Đ³Ñ€Đ°Đ¼Đ¸ÑÑ‚", - "recipient": "ĐŸĐ¾Đ»ÑƒÑ‡Đ°Ñ‚ĐµĐ»", - "reviewedAuthor": "Đ ĐµÑ†ĐµĐ½Đ·Đ¸Ñ€Đ°Đ½ ĐĐ²Ñ‚Đ¾Ñ€", - "scriptwriter": "Đ¡Ñ†ĐµĐ½Đ°Ñ€Đ¸ÑÑ‚", - "seriesEditor": "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ Đ½Đ° ĐŸĐ¾Ñ€ĐµĐ´Đ¸Ñ†Đ°Ñ‚Đ°", - "sponsor": "Đ¡Đ¿Đ¾Đ½ÑĐ¾Ñ€", - "translator": "ĐŸÑ€ĐµĐ²Đ¾Đ´Đ°Ñ‡", - "wordsBy": "Đ¢ĐµĐºÑÑ‚" - } - }, - "br": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Skeudennadur", - "attachment": "Pezh-stag", - "audioRecording": "Enrolladenn aodio", - "bill": "Raktres/kinnig lezenn", - "blogPost": "Embannadenn blog", - "book": "Levr", - "bookSection": "Chabistr levr", - "case": "Afer", - "computerProgram": "Meziant", - "conferencePaper": "Pennad koñferañs", - "dictionaryEntry": "Pennger geriadur", - "document": "Teuliad", - "email": "Postel", - "encyclopediaArticle": "Pennad hollouiziegezh", - "film": "Film", - "forumPost": "Evezhiadenn forom", - "hearing": "Odiañs", - "instantMessage": "Kemennadenn flapva", - "interview": "Atersadenn", - "journalArticle": "Pennad kelaouenn", - "letter": "Lizher", - "magazineArticle": "Pennad magazin", - "manuscript": "Dornskrid", - "map": "Kartenn", - "newspaperArticle": "Pennad kazetenn", - "note": "Notenn", - "patent": "Breved", - "podcast": "Podskignañ", - "presentation": "Kinnigadenn", - "radioBroadcast": "Abadenn radio", - "report": "Danevell", - "statute": "Akta lezennel", - "thesis": "Tezenn", - "tvBroadcast": "Abadenn TV", - "videoRecording": "Enrolladenn video", - "webpage": "Lec'hienn Web" - }, - "fields": { - "abstractNote": "Berradenn", - "accessDate": "Gwelet d'an/ar/al", - "applicationNumber": "Niver arload", - "archive": "Diell", - "archiveLocation": "Lec'hiadur en diell", - "artworkMedium": "Harp ar skeudenn", - "artworkSize": "Ment ar skeudennadur", - "assignee": "Dilezer", - "audioFileType": "Doare restr", - "audioRecordingFormat": "Stumm", - "billNumber": "Niverenn prezegenn", - "blogTitle": "Titl blog", - "bookTitle": "Titl al levr", - "callNumber": "Niver-envel", - "caseName": "Anv an afer", - "code": "Kod", - "codeNumber": "Niver kod", - "codePages": "Kod ar pajennoĂ¹", - "codeVolume": "Kod al levrenn", - "committee": "Komite", - "company": "Kumpaniezh", - "conferenceName": "Anv prezegenn", - "country": "Bro", - "court": "Lez-varn", - "date": "Deiziad", - "dateAdded": "Deiziad ouzhpennañ", - "dateDecided": "Deiziad an diviz", - "dateEnacted": "Embannet d'an/ar/al", - "dateModified": "Deiziad kemmañ", - "dictionaryTitle": "Titl ar geriadur", - "distributor": "Dasparzher", - "docketNumber": "Niver reked", - "documentNumber": "Niver an teuliad", - "DOI": "DOI", - "edition": "Embannadur", - "encyclopediaTitle": "Titl hollouiziegezh", - "episodeNumber": "Niver ar rann", - "extra": "TraoĂ¹ dibarr", - "filingDate": "Deiziad leuniadur", - "firstPage": "Pajenn gentañ", - "forumTitle": "Titl ar forom/Listserv", - "genre": "Doare", - "history": "Istor", - "institution": "Ensavadur", - "interviewMedium": "Media", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Niverenn", - "issueDate": "Deiziad embann", - "issuingAuthority": "Aozadur a embann", - "itemType": "Doare", - "journalAbbreviation": "Berradur anv kelaouenn", - "label": "Label", - "language": "Yezh", - "legalStatus": "StatudoĂ¹ lezennel", - "legislativeBody": "Korf lezennel", - "letterType": "Doare", - "libraryCatalog": "Dastumad levraoueg", - "manuscriptType": "Doare", - "mapType": "Doare", - "meetingName": "Anv an emvod", - "nameOfAct": "Anv an akta", - "network": "Kenrouedad", - "number": "Niver", - "numberOfVolumes": "# a levrennoĂ¹", - "numPages": "# a bajennoĂ¹", - "pages": "PajennoĂ¹", - "patentNumber": "Niver breved", - "place": "Lec'h", - "postType": "Doare embannadenn", - "presentationType": "Doare", - "priorityNumbers": "Niver priorelezh", - "proceedingsTitle": "Titl an aktoĂ¹", - "programmingLanguage": "Yezh brogrammiñ", - "programTitle": "Titl ar program", - "publicationTitle": "Embannadenn", - "publicLawNumber": "Niver ofisiel an akta", - "publisher": "Embanner", - "references": "DaveennoĂ¹", - "reporter": "Teskad", - "reporterVolume": "Levrenn dastumad", - "reportNumber": "Niver an danevell", - "reportType": "Doare danevell", - "rights": "AotreadurioĂ¹", - "runningTime": "Padelezh", - "scale": "Skeul", - "section": "Kevrenn", - "series": "Dastumad", - "seriesNumber": "Niverenn en dastumad", - "seriesText": "Testenn an dastumad", - "seriesTitle": "Titl an dastumad", - "session": "Dalc'h", - "shortTitle": "Titl berr", - "studio": "Studio", - "subject": "Sujed", - "system": "Sistem", - "thesisType": "Doare", - "title": "Titl", - "university": "Skol-veur", - "url": "URL", - "versionNumber": "Stumm", - "videoRecordingFormat": "Stumm", - "volume": "Levrenn", - "websiteTitle": "Titl al lec'hienn", - "websiteType": "Doare lec'hienn Web" - }, - "creatorTypes": { - "artist": "Arzour", - "attorneyAgent": "Dileuriad/Ajant", - "author": "Aozer", - "bookAuthor": "Aozer al levr", - "cartographer": "Kartenner", - "castMember": "Ezel ar c'homedianeta", - "commenter": "Displeger", - "composer": "Kompozer", - "contributor": "Kendaoler", - "cosponsor": "Ken-tad-paeron", - "counsel": "Kuzul", - "director": "Rener", - "editor": "Embanner", - "guest": "Den pedet", - "interviewee": "Aterset gant", - "interviewer": "Aterser", - "inventor": "Ijiner", - "performer": "Jubenner", - "podcaster": "Podskigner", - "presenter": "Kinniger", - "producer": "Produer", - "programmer": "Programmer", - "recipient": "Resever", - "reviewedAuthor": "Aozer niverennet", - "scriptwriter": "Skriver-skriptoĂ¹", - "seriesEditor": "Embanner heuliadennoĂ¹", - "sponsor": "Sponsor", - "translator": "Troer", - "wordsBy": "GerioĂ¹ gant" - } - }, - "ca-AD": { - "itemTypes": { - "annotation": "AnotaciĂ³", - "artwork": "Peça artĂ­stica", - "attachment": "Fitxer adjunt", - "audioRecording": "Enregistrament d'Ă udio", - "bill": "Llei", - "blogPost": "Entrada de bloc", - "book": "Llibre", - "bookSection": "CapĂ­tol d'un llibre", - "case": "Cas", - "computerProgram": "Programari", - "conferencePaper": "Text d'una conferència", - "dictionaryEntry": "Entrada de diccionari", - "document": "Document", - "email": "Correu electrĂ²nic", - "encyclopediaArticle": "Article enciclopèdic", - "film": "Pel·lĂ­cula", - "forumPost": "Comentari en un fĂ²rum", - "hearing": "AudiciĂ³", - "instantMessage": "Missatge instantani", - "interview": "Entrevista", - "journalArticle": "Article de revista acadèmica", - "letter": "Carta", - "magazineArticle": "Article de revista", - "manuscript": "Manuscrit", - "map": "Mapa", - "newspaperArticle": "Article de premsa", - "note": "Nota", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "PresentaciĂ³", - "radioBroadcast": "EmissiĂ³ de rĂ dio", - "report": "Informe", - "statute": "Estatut", - "thesis": "Tesi", - "tvBroadcast": "EmissiĂ³ de televisiĂ³", - "videoRecording": "Enregistrament de vĂ­deo", - "webpage": "PĂ gina web" - }, - "fields": { - "abstractNote": "Resum", - "accessDate": "Ăltim accĂ©s", - "applicationNumber": "NĂºmero d'aplicaciĂ³", - "archive": "Arxiu", - "archiveLocation": "LocalitzaciĂ³ a l'arxiu", - "artworkMedium": "MitjĂ  artĂ­stic", - "artworkSize": "Mida", - "assignee": "Assignatari", - "audioFileType": "Tipus de fitxer", - "audioRecordingFormat": "Format", - "billNumber": "NĂºmero de llei", - "blogTitle": "TĂ­tol del blog", - "bookTitle": "TĂ­tol del llibre", - "callNumber": "NĂºmero de catĂ leg", - "caseName": "Nom del cas", - "code": "Codi", - "codeNumber": "NĂºmero del codi", - "codePages": "PĂ gines del codi", - "codeVolume": "Volum del codi", - "committee": "Comitè", - "company": "Empresa", - "conferenceName": "TĂ­tol de la conferència", - "country": "PaĂ­s", - "court": "Tribunal", - "date": "Data", - "dateAdded": "Afegit", - "dateDecided": "Data de decisiĂ³", - "dateEnacted": "Data d'aprovaciĂ³", - "dateModified": "Modificat", - "dictionaryTitle": "TĂ­tol del diccionari", - "distributor": "DistribuĂ¯dor", - "docketNumber": "NĂºmero d'expedient", - "documentNumber": "NĂºmero de document", - "DOI": "DOI", - "edition": "EdiciĂ³", - "encyclopediaTitle": "TĂ­tol de l'enciclopèdia", - "episodeNumber": "NĂºmero d'episodi", - "extra": "Extra", - "filingDate": "Data de presentaciĂ³", - "firstPage": "Primera pĂ gina", - "forumTitle": "TĂ­tol de fĂ²rum/llista", - "genre": "Gènere", - "history": "HistĂ²ria", - "institution": "InstituciĂ³", - "interviewMedium": "MitjĂ ", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "NĂºmero", - "issueDate": "Data d'emissiĂ³", - "issuingAuthority": "Autoritat emissora", - "itemType": "Tipus", - "journalAbbreviation": "Abreviatura de la revista", - "label": "Etiqueta", - "language": "Llengua", - "legalStatus": "Estatus jurĂ­dic", - "legislativeBody": "Cos legislatiu", - "letterType": "Tipus", - "libraryCatalog": "CatĂ leg de la biblioteca", - "manuscriptType": "Tipus", - "mapType": "Tipus", - "meetingName": "Nom de la trobada", - "nameOfAct": "Nom de la llei", - "network": "Xarxa", - "number": "NĂºmero", - "numberOfVolumes": "Nre. de volums", - "numPages": "Nre. de pĂ gines", - "pages": "PĂ gines", - "patentNumber": "NĂºmero de patent", - "place": "Lloc", - "postType": "Tipus d'escrit", - "presentationType": "Tipus", - "priorityNumbers": "NĂºmeros de prioritat", - "proceedingsTitle": "TĂ­tol de la ponència", - "programmingLanguage": "Llenguatge de prog.", - "programTitle": "TĂ­tol del programa", - "publicationTitle": "PublicaciĂ³", - "publicLawNumber": "NĂºmero de dret pĂºblic", - "publisher": "Editorial", - "references": "Referències", - "reporter": "Reporter", - "reporterVolume": "Volum del reporter", - "reportNumber": "NĂºmero d'informe", - "reportType": "Tipus d'informe", - "rights": "Drets", - "runningTime": "Durada", - "scale": "Escala", - "section": "SecciĂ³", - "series": "Sèrie", - "seriesNumber": "NĂºmero de la sèrie", - "seriesText": "Text de la sèrie", - "seriesTitle": "TĂ­tol de la sèrie", - "session": "SessiĂ³", - "shortTitle": "TĂ­tol curt", - "studio": "Estudi", - "subject": "Tema", - "system": "Sistema", - "thesisType": "Tipus", - "title": "TĂ­tol", - "university": "Universitat", - "url": "URL", - "versionNumber": "VersiĂ³", - "videoRecordingFormat": "Format", - "volume": "Volum", - "websiteTitle": "TĂ­tol del web", - "websiteType": "Tipus de pĂ gina web" - }, - "creatorTypes": { - "artist": "Artista", - "attorneyAgent": "Representant/Agent", - "author": "Autor", - "bookAuthor": "Autor del llibre", - "cartographer": "CartĂ²graf", - "castMember": "Membre del repartiment", - "commenter": "Comentarista", - "composer": "Compositor", - "contributor": "Col·laborador", - "cosponsor": "Copatrocinador", - "counsel": "Conseller", - "director": "Director", - "editor": "Editor", - "guest": "Convidat", - "interviewee": "Entrevistat", - "interviewer": "Entrevistador", - "inventor": "Inventor", - "performer": "Intèrpret", - "podcaster": "Podcaster", - "presenter": "Presentador", - "producer": "Productor", - "programmer": "Programador", - "recipient": "Receptor", - "reviewedAuthor": "Autor revisat", - "scriptwriter": "Guionista", - "seriesEditor": "Editor de la sèrie", - "sponsor": "Esponsor", - "translator": "Traductor", - "wordsBy": "Lletrista" - } - }, - "cs-CZ": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "UmÄ›leckĂ© dĂ­lo", - "attachment": "PÅ™Ă­loha", - "audioRecording": "Audio nahrĂ¡vka", - "bill": "NĂ¡vrh zĂ¡kona", - "blogPost": "PÅ™Ă­spÄ›vek v blogu", - "book": "Kniha", - "bookSection": "Kapitola knihy", - "case": "PÅ™Ă­pad", - "computerProgram": "Software", - "conferencePaper": "KonferenÄnĂ­ pÅ™Ă­spÄ›vek", - "dictionaryEntry": "ZĂ¡znam ve slovnĂ­ku", - "document": "Dokument", - "email": "E-mail", - "encyclopediaArticle": "ÄŒlĂ¡nek v encyklopedii", - "film": "Film", - "forumPost": "PÅ™Ă­spÄ›vek ve fĂ³ru", - "hearing": "SlyÅ¡enĂ­", - "instantMessage": "ZprĂ¡va IM", - "interview": "Rozhovor", - "journalArticle": "ÄŒlĂ¡nek v Äasopise", - "letter": "Dopis", - "magazineArticle": "ÄŒlĂ¡nek v magazĂ­nu", - "manuscript": "Rukopis", - "map": "Mapa", - "newspaperArticle": "ÄŒlĂ¡nek v novinĂ¡ch", - "note": "PoznĂ¡mka", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Prezentace", - "radioBroadcast": "PoÅ™ad v rĂ¡diu", - "report": "ZprĂ¡va", - "statute": "NaÅ™Ă­zenĂ­", - "thesis": "VysokoÅ¡kolskĂ¡ kvalifikaÄnĂ­ prĂ¡ce", - "tvBroadcast": "PoÅ™ad v TV", - "videoRecording": "Video nahrĂ¡vka", - "webpage": "WebovĂ¡ strĂ¡nka" - }, - "fields": { - "abstractNote": "Abstrakt", - "accessDate": "PÅ™Ă­stup", - "applicationNumber": "ÄŒĂ­slo Å¾Ă¡dosti", - "archive": "Archiv", - "archiveLocation": "MĂ­sto v archivu", - "artworkMedium": "MĂ©dium", - "artworkSize": "Velikost dĂ­la", - "assignee": "PověřenĂ½", - "audioFileType": "Typ souboru", - "audioRecordingFormat": "FormĂ¡t", - "billNumber": "ÄŒĂ­slo zĂ¡kona", - "blogTitle": "NĂ¡zev blogu", - "bookTitle": "JmĂ©no knihy", - "callNumber": "Signatura", - "caseName": "JmĂ©no pÅ™Ă­padu", - "code": "ZĂ¡konĂ­k", - "codeNumber": "KĂ³dovĂ© ÄĂ­slo", - "codePages": "StrĂ¡nky zĂ¡konĂ­ku", - "codeVolume": "RoÄnĂ­k zĂ¡konĂ­ku", - "committee": "VĂ½bor", - "company": "SpoleÄnost", - "conferenceName": "JmĂ©no konference", - "country": "ZemÄ›", - "court": "Soud", - "date": "Datum", - "dateAdded": "Datum pÅ™idĂ¡nĂ­", - "dateDecided": "Datum rozhodnutĂ­", - "dateEnacted": "Datum schvĂ¡lenĂ­", - "dateModified": "Upraveno", - "dictionaryTitle": "NĂ¡zev slovnĂ­ku", - "distributor": "Distributor", - "docketNumber": "ÄŒĂ­slo spisu", - "documentNumber": "ÄŒĂ­slo dokumentu", - "DOI": "DOI", - "edition": "VydĂ¡nĂ­", - "encyclopediaTitle": "JmĂ©no encyklopedie", - "episodeNumber": "ÄŒĂ­slo epizody", - "extra": "Extra", - "filingDate": "Datum zĂ¡pisu", - "firstPage": "PrvnĂ­ strana", - "forumTitle": "NĂ¡zev fĂ³ra", - "genre": "Å½Ă¡nr", - "history": "Historie", - "institution": "Instituce", - "interviewMedium": "MĂ©dium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "ÄŒĂ­slo", - "issueDate": "Datum vydĂ¡nĂ­", - "issuingAuthority": "VydĂ¡vajĂ­cĂ­ ĂºÅ™ad", - "itemType": "Typ", - "journalAbbreviation": "ZkrĂ¡cenĂ½ nĂ¡zev Äasopisu", - "label": "OznaÄenĂ­", - "language": "Jazyk", - "legalStatus": "ZĂ¡konnĂ½ status", - "legislativeBody": "ZĂ¡konodĂ¡rnĂ½ orgĂ¡n", - "letterType": "Typ", - "libraryCatalog": "Katalog knihovny", - "manuscriptType": "Typ", - "mapType": "Typ", - "meetingName": "NĂ¡zev setkĂ¡nĂ­", - "nameOfAct": "NĂ¡zev zĂ¡kona", - "network": "SĂ­Å¥", - "number": "ÄŒĂ­slo", - "numberOfVolumes": "PoÄet roÄnĂ­ků", - "numPages": "# stran", - "pages": "Rozsah", - "patentNumber": "ÄŒĂ­slo patentů", - "place": "MĂ­sto", - "postType": "Typ pÅ™Ă­spÄ›vku", - "presentationType": "Typ", - "priorityNumbers": "ÄŒĂ­slo priority", - "proceedingsTitle": "JmĂ©no sbornĂ­ku", - "programmingLanguage": "Prog. jazyk", - "programTitle": "NĂ¡zev programu", - "publicationTitle": "Publikace", - "publicLawNumber": "ÄŒĂ­slo zĂ¡kona", - "publisher": "Vydavatel", - "references": "Reference", - "reporter": "SbĂ­rka soudnĂ­ch rozhodnutĂ­", - "reporterVolume": "RoÄnĂ­k sbĂ­rky", - "reportNumber": "ÄŒĂ­slo zprĂ¡vy", - "reportType": "Druhy zprĂ¡vy", - "rights": "PrĂ¡va", - "runningTime": "ÄŒas", - "scale": "MÄ›Å™Ă­tko", - "section": "Sekce", - "series": "SĂ©rie", - "seriesNumber": "ÄŒĂ­slo sĂ©rie", - "seriesText": "Text sĂ©rie", - "seriesTitle": "NĂ¡zev sĂ©rie", - "session": "ZasedĂ¡nĂ­", - "shortTitle": "KrĂ¡tkĂ½ nĂ¡zev", - "studio": "Studio", - "subject": "Subjekt", - "system": "SystĂ©m", - "thesisType": "Typ", - "title": "NĂ¡zev", - "university": "Univerzita", - "url": "URL", - "versionNumber": "Verze", - "videoRecordingFormat": "FormĂ¡t", - "volume": "RoÄnĂ­k", - "websiteTitle": "NĂ¡zev strĂ¡nky", - "websiteType": "Typ webovĂ© strĂ¡nky" - }, - "creatorTypes": { - "artist": "VĂ½tvarnĂ­k", - "attorneyAgent": "AdvokĂ¡t/zĂ¡stupce", - "author": "Autor", - "bookAuthor": "Autor knihy", - "cartographer": "Kartograf", - "castMember": "ÄŒlen obsazenĂ­", - "commenter": "KomentĂ¡tor", - "composer": "Skladatel", - "contributor": "PÅ™ispÄ›vatel", - "cosponsor": "Spolusponzor", - "counsel": "PrĂ¡vnĂ­ zĂ¡stupce", - "director": "RežisĂ©r", - "editor": "Editor", - "guest": "Host", - "interviewee": "Rozhovor s", - "interviewer": "Tazatel", - "inventor": "VynĂ¡lezce", - "performer": "ĂÄinkujĂ­cĂ­", - "podcaster": "Autor podcastu", - "presenter": "PrezentujĂ­cĂ­", - "producer": "Producent", - "programmer": "ProgramĂ¡tor", - "recipient": "PÅ™Ă­jemce", - "reviewedAuthor": "Autor revize", - "scriptwriter": "ScĂ©nĂ¡rista", - "seriesEditor": "Editor sĂ©rie", - "sponsor": "Sponzor", - "translator": "PÅ™ekladatel", - "wordsBy": "Texty" - } - }, - "da-DK": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Billede/skulptur", - "attachment": "Vedhæftning", - "audioRecording": "Lydoptagelse", - "bill": "Lovforslag", - "blogPost": "Blog-indlæg", - "book": "Bog", - "bookSection": "Bidrag til bog", - "case": "Retssag/Dom", - "computerProgram": "Software", - "conferencePaper": "Konferencebidrag", - "dictionaryEntry": "Ordbogsopslag", - "document": "Dokument", - "email": "E-mail", - "encyclopediaArticle": "Leksikonartikel", - "film": "Film", - "forumPost": "Forum-indlæg", - "hearing": "Høring", - "instantMessage": "Besked", - "interview": "Interview", - "journalArticle": "Tidsskriftsartikel", - "letter": "Brev", - "magazineArticle": "Artikel i blad", - "manuscript": "Manuskript", - "map": "Kort", - "newspaperArticle": "Avisartikel", - "note": "Note", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Præsentation", - "radioBroadcast": "Radioudsendelse", - "report": "Rapport", - "statute": "Lov (vedtaget)", - "thesis": "Afhandling", - "tvBroadcast": "TV-udsendelse", - "videoRecording": "Videooptagelse", - "webpage": "Web-side" - }, - "fields": { - "abstractNote": "ResumĂ©", - "accessDate": "Set d.", - "applicationNumber": "Ansøgning nr.", - "archive": "Samling", - "archiveLocation": "Placering i samlingen", - "artworkMedium": "Medium", - "artworkSize": "Værkets størrelse", - "assignee": "Ansvarlig", - "audioFileType": "Filtype", - "audioRecordingFormat": "Format", - "billNumber": "Lovforslagets nr.", - "blogTitle": "Bloggens titel", - "bookTitle": "Bogens titel", - "callNumber": "Opstillingssignatur", - "caseName": "Sagens navn", - "code": "Lovsamling", - "codeNumber": "Nummer", - "codePages": "Sider", - "codeVolume": "Bind", - "committee": "Udvalg", - "company": "Selskab", - "conferenceName": "Konferencens navn", - "country": "Land", - "court": "Domstol", - "date": "Tidspunkt", - "dateAdded": "Tilføjet d.", - "dateDecided": "Dom afsagt d.", - "dateEnacted": "Vedtaget d.", - "dateModified": "Ændret d.", - "dictionaryTitle": "Ordbogens titel", - "distributor": "Selskab", - "docketNumber": "Dossier nr.", - "documentNumber": "Dokument nr.", - "DOI": "DOI", - "edition": "Udgave", - "encyclopediaTitle": "Leksikonets titel", - "episodeNumber": "Afsnit nr.", - "extra": "Ekstra", - "filingDate": "Indlemmet d.", - "firstPage": "Første side", - "forumTitle": "Titel pĂ¥ Forum/Listserv", - "genre": "Genre", - "history": "Historie", - "institution": "Institution", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Nummer", - "issueDate": "Udstedt d.", - "issuingAuthority": "Myndighed", - "itemType": "Type", - "journalAbbreviation": "Tidsskr.forkort.", - "label": "Pladeselskab", - "language": "Sprog", - "legalStatus": "Juridisk status", - "legislativeBody": "Lovgivende organ", - "letterType": "Type", - "libraryCatalog": "Bibliotekskatalog", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Mødets navn", - "nameOfAct": "Lovens navn", - "network": "Station (radio/TV)", - "number": "Nummer", - "numberOfVolumes": "Antal bind", - "numPages": "Antal sider", - "pages": "Sider", - "patentNumber": "Patentnummer", - "place": "Sted", - "postType": "Type (post)", - "presentationType": "Type", - "priorityNumbers": "Prioritetsnumre", - "proceedingsTitle": "Titel pĂ¥ proceedings", - "programmingLanguage": "Prog. Language", - "programTitle": "Programmets titel", - "publicationTitle": "Publikationens titel", - "publicLawNumber": "Public Law Number (USA)", - "publisher": "Udgiver/Forlag", - "references": "Referencer", - "reporter": "Referat-samling", - "reporterVolume": "Referat-bind", - "reportNumber": "Rapportens nr.", - "reportType": "Rapporttype", - "rights": "Rettigheder", - "runningTime": "Længde (tid)", - "scale": "Skala", - "section": "Paragraf", - "series": "Serie", - "seriesNumber": "Nummer i serien", - "seriesText": "Serie: suppl. tekst", - "seriesTitle": "Serietitel", - "session": "Behandlet", - "shortTitle": "Forkortet titel", - "studio": "Studie", - "subject": "Emne", - "system": "System", - "thesisType": "Type", - "title": "Titel", - "university": "Universitet", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Bind/Ă…rgang", - "websiteTitle": "Webstedets titel", - "websiteType": "Type (websted)" - }, - "creatorTypes": { - "artist": "Kunstner/Ophav", - "attorneyAgent": "Advokat", - "author": "Forfatter/Ophav", - "bookAuthor": "Bogens forfatter", - "cartographer": "Kartograf", - "castMember": "Medvirkende", - "commenter": "Kommentator", - "composer": "Komponist", - "contributor": "Anden bidragyder", - "cosponsor": "Medforslagsstiller", - "counsel": "Advokat", - "director": "Instruktør/Ophav", - "editor": "Redaktør", - "guest": "Gæst", - "interviewee": "Inverview med", - "interviewer": "Interviewer", - "inventor": "Opfinder", - "performer": "Udøver", - "podcaster": "Ophav til podcast", - "presenter": "Forelæser/Ophav", - "producer": "Producent", - "programmer": "Programmør", - "recipient": "Modtager", - "reviewedAuthor": "Anmeldt forfatter", - "scriptwriter": "Manuskriptforfatter", - "seriesEditor": "Seriens redaktør", - "sponsor": "Forslagsstiller", - "translator": "Oversætter", - "wordsBy": "Tekster af" - } - }, - "de": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Kunstwerk", - "attachment": "Anhang", - "audioRecording": "Tonaufnahme", - "bill": "Gesetzentwurf", - "blogPost": "Blog-Post", - "book": "Buch", - "bookSection": "Buchteil", - "case": "Fall", - "computerProgram": "Software", - "conferencePaper": "Konferenz-Paper", - "dictionaryEntry": "Wörterbucheintrag", - "document": "Dokument", - "email": "E-Mail", - "encyclopediaArticle": "Enzyklopädieartikel", - "film": "Film", - "forumPost": "Foren-Eintrag", - "hearing": "Anhörung", - "instantMessage": "Instant-Message", - "interview": "Interview", - "journalArticle": "Zeitschriftenartikel", - "letter": "Brief", - "magazineArticle": "Magazin-Artikel", - "manuscript": "Manuskript", - "map": "Karte", - "newspaperArticle": "Zeitungsartikel", - "note": "Notiz", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Vortrag", - "radioBroadcast": "Radiosendung", - "report": "Bericht", - "statute": "Gesetz", - "thesis": "Dissertation", - "tvBroadcast": "Fernsehsendung", - "videoRecording": "Videoaufnahme", - "webpage": "Webseite" - }, - "fields": { - "abstractNote": "Zusammenfassung", - "accessDate": "Heruntergeladen am", - "applicationNumber": "Bewerbungsnummer", - "archive": "Archiv", - "archiveLocation": "Standort im Archiv", - "artworkMedium": "Medium", - "artworkSize": "GrĂ¶ĂŸe des Kunstwerks", - "assignee": "Abtretungsempfänger", - "audioFileType": "Dateityp", - "audioRecordingFormat": "Format", - "billNumber": "Nummer des Gesetzentwurfs", - "blogTitle": "Titel des Blogs", - "bookTitle": "Buchtitel", - "callNumber": "Signatur", - "caseName": "Name des Falls", - "code": "Code", - "codeNumber": "Codenummer", - "codePages": "Seiten des Codes", - "codeVolume": "Band des Codes", - "committee": "Ausschuss", - "company": "Firma", - "conferenceName": "Name der Konferenz", - "country": "Land", - "court": "Gericht", - "date": "Datum", - "dateAdded": "HinzugefĂ¼gt am", - "dateDecided": "Beschlussdatum", - "dateEnacted": "Datum des Inkrafttretens", - "dateModified": "Geändert am", - "dictionaryTitle": "Titel des Wörterbuchs", - "distributor": "Verleih", - "docketNumber": "Aktenzeichen", - "documentNumber": "Dokumentennummer", - "DOI": "DOI", - "edition": "Auflage", - "encyclopediaTitle": "Titel der Enzyklopädie", - "episodeNumber": "Nummer der Folge", - "extra": "Extra", - "filingDate": "Datum der Einreichung", - "firstPage": "Erste Seite", - "forumTitle": "Titel des Forums/Listservs", - "genre": "Genre", - "history": "Geschichte", - "institution": "Institution", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Ausgabe", - "issueDate": "Erscheinungsdatum", - "issuingAuthority": "Herausgeber", - "itemType": "Typ", - "journalAbbreviation": "Zeitschriften-AbkĂ¼rzung", - "label": "Label", - "language": "Sprache", - "legalStatus": "Rechtsstatus", - "legislativeBody": "Gesetzgebende Körperschaft", - "letterType": "Art", - "libraryCatalog": "Bibliothekskatalog", - "manuscriptType": "Art", - "mapType": "Art", - "meetingName": "Name der Sitzung", - "nameOfAct": "Name des Erlasses", - "network": "Netzwerk", - "number": "Nummer", - "numberOfVolumes": "# von Bänden", - "numPages": "Anzahl der Seiten", - "pages": "Seiten", - "patentNumber": "Patentnummer", - "place": "Ort", - "postType": "Art von Eintrag", - "presentationType": "Art", - "priorityNumbers": "Prioritätsnummern", - "proceedingsTitle": "Titel des Konferenzbandes", - "programmingLanguage": "Programmiersprache", - "programTitle": "Name des Programms", - "publicationTitle": "Publikation", - "publicLawNumber": "Ă–ffentliche Gesetzesnummer", - "publisher": "Verlag", - "references": "Quellenangaben", - "reporter": "Gesetzessammlung", - "reporterVolume": "Nummer der Gesetzessammlung", - "reportNumber": "Nummer des Berichts", - "reportType": "Art von Bericht", - "rights": "Rechte", - "runningTime": "Laufzeit", - "scale": "MaĂŸstab", - "section": "Teil", - "series": "Reihe", - "seriesNumber": "Nummer der Reihe", - "seriesText": "Reihe Text", - "seriesTitle": "Titel der Reihe", - "session": "Sitzung", - "shortTitle": "Kurztitel", - "studio": "Studio", - "subject": "Betreff", - "system": "System", - "thesisType": "Art", - "title": "Titel", - "university": "Universität", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Band", - "websiteTitle": "Titel der Website", - "websiteType": "Art der Webseite" - }, - "creatorTypes": { - "artist": "KĂ¼nstler", - "attorneyAgent": "Anwalt/Agent", - "author": "Autor", - "bookAuthor": "Buchautor", - "cartographer": "Kartograph", - "castMember": "Ensemble", - "commenter": "Kommentator", - "composer": "Komponist", - "contributor": "Mitarbeiter", - "cosponsor": "Mitunterzeichner", - "counsel": "Anwalt", - "director": "Regisseur", - "editor": "Herausgeber", - "guest": "Gast", - "interviewee": "Interview mit", - "interviewer": "Interviewer", - "inventor": "Erfinder", - "performer": "Darsteller", - "podcaster": "Podcaster", - "presenter": "Vortragender", - "producer": "Produzent", - "programmer": "Programmierer", - "recipient": "Empfänger", - "reviewedAuthor": "Rezensierter Autor", - "scriptwriter": "Drehbuchautor", - "seriesEditor": "Hrsg. der Reihe", - "sponsor": "Sponsor", - "translator": "Ăœbersetzer", - "wordsBy": "Text von" - } - }, - "el-GR": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "ΈÏγο τέχνης", - "attachment": "Συνημμένο", - "audioRecording": "ΕγγÏαφή ήχου", - "bill": "ΛογαÏιασμός", - "blogPost": "ΑνάÏτηση", - "book": "Βιβλίο", - "bookSection": "Ενότητα Βιβλίου", - "case": "Υπόθεση", - "computerProgram": "Λογισμικό", - "conferencePaper": "ΆÏθÏο ΣυνεδÏίου", - "dictionaryEntry": "Εισαγωγή λεξικοÏ", - "document": "ΈγγÏαφο", - "email": "ηλ. μήνυμα", - "encyclopediaArticle": "ΆÏθÏο εγκυκλοπαίδειας", - "film": "Ταινία", - "forumPost": "Δημοσίευση φόÏουμ", - "hearing": "ΑκÏόαση", - "instantMessage": "Άμεσο Μήνυμα", - "interview": "Συνέντευξη", - "journalArticle": "ΆÏθÏο Î•Ï€Î¹ÏƒÏ„Î·Î¼Î¿Î½Î¹ÎºÎ¿Ï Î ÎµÏιοδικοÏ", - "letter": "Επιστολή", - "magazineArticle": "ΆÏθÏο ΠεÏιοδικοÏ", - "manuscript": "ΧειÏόγÏαφο", - "map": "ΧάÏτης", - "newspaperArticle": "ΆÏθÏο ΕφημεÏίδας", - "note": "Σημείωση", - "patent": "ΕυÏεσιτεχνία", - "podcast": "Podcast", - "presentation": "ΠαÏουσίαση", - "radioBroadcast": "Ραδιοφωνική Μετάδοση", - "report": "ΑναφοÏά", - "statute": "Îόμος", - "thesis": "ΔιατÏιβή", - "tvBroadcast": "Τηλεοπτική Μετάδοση", - "videoRecording": "ΕγγÏαφή Βίντεο", - "webpage": "Ιστοσελίδα" - }, - "fields": { - "abstractNote": "ΠεÏίληψη", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "ΑÏχείο", - "archiveLocation": "Τοπ. στο ΑÏχείο", - "artworkMedium": "Medium", - "artworkSize": "Μέγεθος έÏγου τέχνης", - "assignee": "Assignee", - "audioFileType": "ΤÏπος ΑÏχείου", - "audioRecordingFormat": "ΜοÏφή", - "billNumber": "ΑÏιθμός ΛογαÏιασμοÏ", - "blogTitle": "Blog Title", - "bookTitle": "Τίτλος Βιβλίου", - "callNumber": "ΑÏιθμός κλήσης", - "caseName": "Case Name", - "code": "ÎÏδικας", - "codeNumber": "Code Number", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "ΕπιτÏοπή", - "company": "ΕταιÏία", - "conferenceName": "Όνομα ΣυνεδÏίου", - "country": "ΧÏÏα", - "court": "ΔικαστήÏιο", - "date": "ΗμεÏομηνία", - "dateAdded": "ΗμεÏομηνία Ï€Ïοσθήκης", - "dateDecided": "Date Decided", - "dateEnacted": "Date Enacted", - "dateModified": "ΤÏοποποιήθηκε", - "dictionaryTitle": "Τίτλος ΛεξικοÏ", - "distributor": "Διανομέας", - "docketNumber": "Docket Number", - "documentNumber": "Document Number", - "DOI": "DOI", - "edition": "Έκδοση", - "encyclopediaTitle": "Τίτλος Εγκυκλοπαίδειας", - "episodeNumber": "ΑÏιθμός Επεισοδίου", - "extra": "Επιπλέον", - "filingDate": "Filing Date", - "firstPage": "ΠÏÏτη Σελίδα", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "History", - "institution": "ÎδÏυμα", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "ΤεÏχος", - "issueDate": "ΗμεÏομηνία Έκδοσης", - "issuingAuthority": "Issuing Authority", - "itemType": "ΤÏπος", - "journalAbbreviation": "Journal Abbr", - "label": "Ετικέτα", - "language": "ΓλÏσσα", - "legalStatus": "Îομική Υπόσταση", - "legislativeBody": "Îομοθετικό ΣÏμα", - "letterType": "ΤÏπος", - "libraryCatalog": "Îατάλογος Βιβλιοθήκης", - "manuscriptType": "ΤÏπος", - "mapType": "ΤÏπος", - "meetingName": "Όνομα ΣÏσκεψης", - "nameOfAct": "Name of Act", - "network": "Δίκτυο", - "number": "ΑÏιθμός", - "numberOfVolumes": "# Τόμων", - "numPages": "# από Σελίδες", - "pages": "Σελίδες", - "patentNumber": "ΑÏιθμός ΕυÏεσιτεχνίας", - "place": "Τόπος", - "postType": "Post Type", - "presentationType": "ΤÏπος", - "priorityNumbers": "ΑÏιθμοί Ï€ÏοτεÏαιότητας", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "ΓλÏσσα Ï€ÏογÏαμ.", - "programTitle": "Program Title", - "publicationTitle": "Δημοσίευμα", - "publicLawNumber": "Public Law Number", - "publisher": "Εκδότης", - "references": "ΑναφοÏές", - "reporter": "ΡεπόÏτεÏ", - "reporterVolume": "Reporter Volume", - "reportNumber": "ΑÏιθμός ΑναφοÏάς", - "reportType": "ΤÏπος ΑναφοÏάς", - "rights": "ΔικαιÏματα", - "runningTime": "Running Time", - "scale": "Îλίμακα", - "section": "Ενότητα", - "series": "ΣειÏά", - "seriesNumber": "ΑÏιθμός ΣειÏάς", - "seriesText": "Series Text", - "seriesTitle": "Τίτλος ΣειÏάς", - "session": "Ενότητα", - "shortTitle": "Short Title", - "studio": "ΣτοÏντιο", - "subject": "Θέμα", - "system": "ΣÏστημα", - "thesisType": "ΤÏπος", - "title": "Τίτλος", - "university": "Πανεπιστήμιο", - "url": "URL", - "versionNumber": "Έκδοση", - "videoRecordingFormat": "ΜοÏφή", - "volume": "Τόμος", - "websiteTitle": "Τίτλος Ιστότοπου", - "websiteType": "ΤÏπος Ιστότοπου" - }, - "creatorTypes": { - "artist": "Îαλλιτέχνης", - "attorneyAgent": "Attorney/Agent", - "author": "ΣυγγÏαφέας", - "bookAuthor": "ΣυγγÏαφέας Βιβλίου", - "cartographer": "ΧαÏτογÏάφος", - "castMember": "Μέλος του καστ", - "commenter": "Σχολιαστής", - "composer": "Συνθέτης", - "contributor": "Contributor", - "cosponsor": "Συντονιστής", - "counsel": "Counsel", - "director": "Σκηνοθέτης", - "editor": "Συντάκτης", - "guest": "Guest", - "interviewee": "Συνέντευξη με", - "interviewer": "ΔημοσιογÏάφος", - "inventor": "Inventor", - "performer": "ΕÏμηνευτής", - "podcaster": "Podcaster", - "presenter": "ΠαÏουσιαστής", - "producer": "ΠαÏαγωγός", - "programmer": "ΠÏογÏαμματιστής", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Scriptwriter", - "seriesEditor": "Series Editor", - "sponsor": "Sponsor", - "translator": "ΜετάφÏαση", - "wordsBy": "Words By" - } - }, - "en-GB": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Artwork", - "attachment": "Attachment", - "audioRecording": "Audio Recording", - "bill": "Bill", - "blogPost": "Blog Post", - "book": "Book", - "bookSection": "Book Section", - "case": "Case", - "computerProgram": "Software", - "conferencePaper": "Conference Paper", - "dictionaryEntry": "Dictionary Entry", - "document": "Document", - "email": "E-mail", - "encyclopediaArticle": "Encyclopedia Article", - "film": "Film", - "forumPost": "Forum Post", - "hearing": "Hearing", - "instantMessage": "Instant Message", - "interview": "Interview", - "journalArticle": "Journal Article", - "letter": "Letter", - "magazineArticle": "Magazine Article", - "manuscript": "Manuscript", - "map": "Map", - "newspaperArticle": "Newspaper Article", - "note": "Note", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Presentation", - "radioBroadcast": "Radio Broadcast", - "report": "Report", - "statute": "Statute", - "thesis": "Thesis", - "tvBroadcast": "TV Broadcast", - "videoRecording": "Video Recording", - "webpage": "Web Page" - }, - "fields": { - "abstractNote": "Abstract", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "Archive", - "archiveLocation": "Loc. in Archive", - "artworkMedium": "Medium", - "artworkSize": "Artwork Size", - "assignee": "Assignee", - "audioFileType": "File Type", - "audioRecordingFormat": "Format", - "billNumber": "Bill Number", - "blogTitle": "Blog Title", - "bookTitle": "Book Title", - "callNumber": "Call Number", - "caseName": "Case Name", - "code": "Code", - "codeNumber": "Code Number", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "Committee", - "company": "Company", - "conferenceName": "Conference Name", - "country": "Country", - "court": "Court", - "date": "Date", - "dateAdded": "Date Added", - "dateDecided": "Date Decided", - "dateEnacted": "Date Enacted", - "dateModified": "Modified", - "dictionaryTitle": "Dictionary Title", - "distributor": "Distributor", - "docketNumber": "Docket Number", - "documentNumber": "Document Number", - "DOI": "DOI", - "edition": "Edition", - "encyclopediaTitle": "Encyclopedia Title", - "episodeNumber": "Episode Number", - "extra": "Extra", - "filingDate": "Filing Date", - "firstPage": "First Page", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "History", - "institution": "Institution", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Issue", - "issueDate": "Issue Date", - "issuingAuthority": "Issuing Authority", - "itemType": "Type", - "journalAbbreviation": "Journal Abbr", - "label": "Label", - "language": "Language", - "legalStatus": "Legal Status", - "legislativeBody": "Legislative Body", - "letterType": "Type", - "libraryCatalog": "Library Catalog", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Meeting Name", - "nameOfAct": "Name of Act", - "network": "Network", - "number": "Number", - "numberOfVolumes": "# of Volumes", - "numPages": "# of Pages", - "pages": "Pages", - "patentNumber": "Patent Number", - "place": "Place", - "postType": "Post Type", - "presentationType": "Type", - "priorityNumbers": "Priority Numbers", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "Publication", - "publicLawNumber": "Public Law Number", - "publisher": "Publisher", - "references": "References", - "reporter": "Reporter", - "reporterVolume": "Reporter Volume", - "reportNumber": "Report Number", - "reportType": "Report Type", - "rights": "Rights", - "runningTime": "Running Time", - "scale": "Scale", - "section": "Section", - "series": "Series", - "seriesNumber": "Series Number", - "seriesText": "Series Text", - "seriesTitle": "Series Title", - "session": "Session", - "shortTitle": "Short Title", - "studio": "Studio", - "subject": "Subject", - "system": "System", - "thesisType": "Type", - "title": "Title", - "university": "University", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Website Title", - "websiteType": "Website Type" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Attorney/Agent", - "author": "Author", - "bookAuthor": "Book Author", - "cartographer": "Cartographer", - "castMember": "Cast Member", - "commenter": "Commenter", - "composer": "Composer", - "contributor": "Contributor", - "cosponsor": "Cosponsor", - "counsel": "Counsel", - "director": "Director", - "editor": "Editor", - "guest": "Guest", - "interviewee": "Interview With", - "interviewer": "Interviewer", - "inventor": "Inventor", - "performer": "Performer", - "podcaster": "Podcaster", - "presenter": "Presenter", - "producer": "Producer", - "programmer": "Programmer", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Scriptwriter", - "seriesEditor": "Series Editor", - "sponsor": "Sponsor", - "translator": "Translator", - "wordsBy": "Words By" - } - }, - "en-US": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Artwork", - "attachment": "Attachment", - "audioRecording": "Audio Recording", - "bill": "Bill", - "blogPost": "Blog Post", - "book": "Book", - "bookSection": "Book Section", - "case": "Case", - "computerProgram": "Software", - "conferencePaper": "Conference Paper", - "dictionaryEntry": "Dictionary Entry", - "document": "Document", - "email": "E-mail", - "encyclopediaArticle": "Encyclopedia Article", - "film": "Film", - "forumPost": "Forum Post", - "hearing": "Hearing", - "instantMessage": "Instant Message", - "interview": "Interview", - "journalArticle": "Journal Article", - "letter": "Letter", - "magazineArticle": "Magazine Article", - "manuscript": "Manuscript", - "map": "Map", - "newspaperArticle": "Newspaper Article", - "note": "Note", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Presentation", - "radioBroadcast": "Radio Broadcast", - "report": "Report", - "statute": "Statute", - "thesis": "Thesis", - "tvBroadcast": "TV Broadcast", - "videoRecording": "Video Recording", - "webpage": "Web Page" - }, - "fields": { - "abstractNote": "Abstract", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "Archive", - "archiveLocation": "Loc. in Archive", - "artworkMedium": "Medium", - "artworkSize": "Artwork Size", - "assignee": "Assignee", - "audioFileType": "File Type", - "audioRecordingFormat": "Format", - "billNumber": "Bill Number", - "blogTitle": "Blog Title", - "bookTitle": "Book Title", - "callNumber": "Call Number", - "caseName": "Case Name", - "code": "Code", - "codeNumber": "Code Number", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "Committee", - "company": "Company", - "conferenceName": "Conference Name", - "country": "Country", - "court": "Court", - "date": "Date", - "dateAdded": "Date Added", - "dateDecided": "Date Decided", - "dateEnacted": "Date Enacted", - "dateModified": "Modified", - "dictionaryTitle": "Dictionary Title", - "distributor": "Distributor", - "docketNumber": "Docket Number", - "documentNumber": "Document Number", - "DOI": "DOI", - "edition": "Edition", - "encyclopediaTitle": "Encyclopedia Title", - "episodeNumber": "Episode Number", - "extra": "Extra", - "filingDate": "Filing Date", - "firstPage": "First Page", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "History", - "institution": "Institution", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Issue", - "issueDate": "Issue Date", - "issuingAuthority": "Issuing Authority", - "itemType": "Type", - "journalAbbreviation": "Journal Abbr", - "label": "Label", - "language": "Language", - "legalStatus": "Legal Status", - "legislativeBody": "Legislative Body", - "letterType": "Type", - "libraryCatalog": "Library Catalog", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Meeting Name", - "nameOfAct": "Name of Act", - "network": "Network", - "number": "Number", - "numberOfVolumes": "# of Volumes", - "numPages": "# of Pages", - "pages": "Pages", - "patentNumber": "Patent Number", - "place": "Place", - "postType": "Post Type", - "presentationType": "Type", - "priorityNumbers": "Priority Numbers", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "Publication", - "publicLawNumber": "Public Law Number", - "publisher": "Publisher", - "references": "References", - "reporter": "Reporter", - "reporterVolume": "Reporter Volume", - "reportNumber": "Report Number", - "reportType": "Report Type", - "rights": "Rights", - "runningTime": "Running Time", - "scale": "Scale", - "section": "Section", - "series": "Series", - "seriesNumber": "Series Number", - "seriesText": "Series Text", - "seriesTitle": "Series Title", - "session": "Session", - "shortTitle": "Short Title", - "studio": "Studio", - "subject": "Subject", - "system": "System", - "thesisType": "Type", - "title": "Title", - "university": "University", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Website Title", - "websiteType": "Website Type" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Attorney/Agent", - "author": "Author", - "bookAuthor": "Book Author", - "cartographer": "Cartographer", - "castMember": "Cast Member", - "commenter": "Commenter", - "composer": "Composer", - "contributor": "Contributor", - "cosponsor": "Cosponsor", - "counsel": "Counsel", - "director": "Director", - "editor": "Editor", - "guest": "Guest", - "interviewee": "Interview With", - "interviewer": "Interviewer", - "inventor": "Inventor", - "performer": "Performer", - "podcaster": "Podcaster", - "presenter": "Presenter", - "producer": "Producer", - "programmer": "Programmer", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Scriptwriter", - "seriesEditor": "Series Editor", - "sponsor": "Sponsor", - "translator": "Translator", - "wordsBy": "Words By" - } - }, - "es-ES": { - "itemTypes": { - "annotation": "AnotaciĂ³n", - "artwork": "Obra de arte", - "attachment": "Adjunto", - "audioRecording": "GrabaciĂ³n de sonido", - "bill": "Propuesta de ley", - "blogPost": "Entrada de blog", - "book": "Libro", - "bookSection": "SecciĂ³n de un libro", - "case": "Caso", - "computerProgram": "Software", - "conferencePaper": "ArtĂ­culo en conferencia", - "dictionaryEntry": "Entrada de diccionario", - "document": "Documento", - "email": "Correo electrĂ³nico", - "encyclopediaArticle": "ArtĂ­culo de enciclopedia", - "film": "PelĂ­cula", - "forumPost": "Mensaje en un foro", - "hearing": "Audiencia", - "instantMessage": "Mensaje instantĂ¡neo", - "interview": "Entrevista", - "journalArticle": "ArtĂ­culo de revista acadĂ©mica", - "letter": "Carta", - "magazineArticle": "ArtĂ­culo de revista", - "manuscript": "Manuscrito", - "map": "Mapa", - "newspaperArticle": "ArtĂ­culo de periĂ³dico", - "note": "Nota", - "patent": "Patente", - "podcast": "PĂ³dcast", - "presentation": "PresentaciĂ³n", - "radioBroadcast": "EmisiĂ³n de radio", - "report": "Informe", - "statute": "Estatuto", - "thesis": "Tesis", - "tvBroadcast": "EmisiĂ³n de TV", - "videoRecording": "GrabaciĂ³n de vĂ­deo", - "webpage": "PĂ¡gina web" - }, - "fields": { - "abstractNote": "Resumen", - "accessDate": "Accedido", - "applicationNumber": "NĂºmero de solicitud", - "archive": "Archivo", - "archiveLocation": "PosiciĂ³n en archivo", - "artworkMedium": "Medio", - "artworkSize": "Tamaño de la obra", - "assignee": "Responsable", - "audioFileType": "Tipo de archivo", - "audioRecordingFormat": "Formato", - "billNumber": "NĂºmero de propuesta de ley", - "blogTitle": "TĂ­tulo del blog", - "bookTitle": "TĂ­tulo del libro", - "callNumber": "Signatura", - "caseName": "Nombre del caso", - "code": "CĂ³digo", - "codeNumber": "NĂºmero de cĂ³digo", - "codePages": "PĂ¡ginas del cĂ³digo", - "codeVolume": "Volumen del cĂ³digo", - "committee": "ComitĂ©", - "company": "Compañía", - "conferenceName": "Nombre de la conferencia", - "country": "PaĂ­s", - "court": "Juzgado", - "date": "Fecha", - "dateAdded": "Fecha de adiciĂ³n", - "dateDecided": "Fecha de sentencia", - "dateEnacted": "Fecha de entrada en vigor", - "dateModified": "Modificado", - "dictionaryTitle": "TĂ­tulo del diccionario", - "distributor": "Distribuidor", - "docketNumber": "NĂºmero de expediente", - "documentNumber": "NĂºmero de documento", - "DOI": "DOI", - "edition": "EdiciĂ³n", - "encyclopediaTitle": "TĂ­tulo de la enciclopedia", - "episodeNumber": "NĂºmero de episodio", - "extra": "Adicional", - "filingDate": "Fecha de solicitud", - "firstPage": "Primera pĂ¡gina", - "forumTitle": "TĂ­tulo de foro o lista de correo", - "genre": "GĂ©nero", - "history": "Historia", - "institution": "InstituciĂ³n", - "interviewMedium": "Medio", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Ejemplar", - "issueDate": "Fecha de salida", - "issuingAuthority": "Entidad emisora", - "itemType": "Tipo", - "journalAbbreviation": "Abrev. de revista", - "label": "Etiqueta", - "language": "Idioma", - "legalStatus": "Estado legal", - "legislativeBody": "Cuerpo legislativo", - "letterType": "Tipo", - "libraryCatalog": "CatĂ¡logo de biblioteca", - "manuscriptType": "Tipo", - "mapType": "Tipo", - "meetingName": "Nombre de la reuniĂ³n", - "nameOfAct": "Nombre de la ley", - "network": "Red", - "number": "NĂºmero", - "numberOfVolumes": "NĂºmero de volĂºmenes", - "numPages": "NĂºmero de pĂ¡ginas", - "pages": "PĂ¡ginas", - "patentNumber": "NĂºmero de patente", - "place": "Lugar", - "postType": "Tipo de mensaje", - "presentationType": "Tipo", - "priorityNumbers": "NĂºmeros de prioridad", - "proceedingsTitle": "TĂ­tulo de las actas", - "programmingLanguage": "Lenguaje de programaciĂ³n", - "programTitle": "TĂ­tulo del programa", - "publicationTitle": "PublicaciĂ³n", - "publicLawNumber": "NĂºmero de ley pĂºblica", - "publisher": "Editorial", - "references": "Referencias", - "reporter": "Acta judicial", - "reporterVolume": "Volumen de las actas", - "reportNumber": "NĂºmero de informe", - "reportType": "Tipo de informe", - "rights": "Derechos", - "runningTime": "DuraciĂ³n", - "scale": "Escala", - "section": "SecciĂ³n", - "series": "Serie", - "seriesNumber": "NĂºmero de la serie", - "seriesText": "Texto de la serie", - "seriesTitle": "TĂ­tulo de la serie", - "session": "SesiĂ³n", - "shortTitle": "TĂ­tulo corto", - "studio": "Estudio", - "subject": "Asunto", - "system": "Sistema", - "thesisType": "Tipo", - "title": "TĂ­tulo", - "university": "Universidad", - "url": "URL", - "versionNumber": "VersiĂ³n", - "videoRecordingFormat": "Formato", - "volume": "Volumen", - "websiteTitle": "TĂ­tulo de pĂ¡gina web", - "websiteType": "Tipo de pĂ¡gina Web" - }, - "creatorTypes": { - "artist": "Artista", - "attorneyAgent": "Abogado/Representante", - "author": "Autor", - "bookAuthor": "Autor del libro", - "cartographer": "CartĂ³grafo", - "castMember": "Miembro del reparto", - "commenter": "Comentador", - "composer": "Compositor", - "contributor": "Contribuidor", - "cosponsor": "Copatrocinador", - "counsel": "Consejero", - "director": "Director", - "editor": "Editor", - "guest": "Invitado", - "interviewee": "Entrevista con", - "interviewer": "Entrevistador", - "inventor": "Inventor", - "performer": "IntĂ©rprete", - "podcaster": "Podcaster", - "presenter": "Presentador", - "producer": "Productor", - "programmer": "Programador", - "recipient": "Receptor", - "reviewedAuthor": "Autor revisado", - "scriptwriter": "Guionista", - "seriesEditor": "Editor de la serie", - "sponsor": "Patrocinador", - "translator": "Traductor", - "wordsBy": "Palabras de" - } - }, - "et-EE": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Kunstiteos", - "attachment": "Manus", - "audioRecording": "Helisalvestis", - "bill": "Arve", - "blogPost": "Blogipostitus", - "book": "Raamat", - "bookSection": "Osa raamatust", - "case": "Kaasus", - "computerProgram": "Software", - "conferencePaper": "Ettekanne", - "dictionaryEntry": "Kirje sõnaraamatus", - "document": "Dokument", - "email": "E-mail", - "encyclopediaArticle": "EntsĂ¼klopeediaartikkel", - "film": "Film", - "forumPost": "Foorumi postitus", - "hearing": "Istung", - "instantMessage": "Välksõnum", - "interview": "Intervjuu", - "journalArticle": "Artikkel", - "letter": "Kiri", - "magazineArticle": "Ajakirjaartikkel (mitteakad.)", - "manuscript": "Käsikiri", - "map": "Kaart", - "newspaperArticle": "Ajaleheartikkel", - "note": "Märkus", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Esitlus", - "radioBroadcast": "Raadiosaade", - "report": "Raport", - "statute": "Statuut", - "thesis": "Väitekiri", - "tvBroadcast": "Telesaade", - "videoRecording": "Videosalvestis", - "webpage": "VeebilehekĂ¼lg" - }, - "fields": { - "abstractNote": "Abstrakt", - "accessDate": "Vaadatud", - "applicationNumber": "Taotluse number", - "archive": "Arhiiv", - "archiveLocation": "Asukoht arhiivis", - "artworkMedium": "Kandja", - "artworkSize": "Kunstiteose suurus", - "assignee": "Ăœlesande täitja", - "audioFileType": "Faili tĂ¼Ă¼p", - "audioRecordingFormat": "Formaat", - "billNumber": "Arvenumber", - "blogTitle": "Blogi nimi", - "bookTitle": "Raamatupealkiri", - "callNumber": "Kohaviit", - "caseName": "Kaasuse nimi", - "code": "Koodeks", - "codeNumber": "Koodeksinumber", - "codePages": "Koodeksi lehekĂ¼ljed", - "codeVolume": "Koodeksi köide", - "committee": "Kommitee", - "company": "Firma", - "conferenceName": "Konverentsi nimi", - "country": "Maa", - "court": "Kohus", - "date": "Aeg", - "dateAdded": "Lisamise aeg", - "dateDecided": "Otsustamise aeg", - "dateEnacted": "Jõustumise kuupäev", - "dateModified": "Muudetud", - "dictionaryTitle": "Sõnaraamatu pealkiri", - "distributor": "Levitaja", - "docketNumber": "Päevakorra number", - "documentNumber": "Dokumendi number", - "DOI": "DOI", - "edition": "TrĂ¼kk", - "encyclopediaTitle": "EntsĂ¼klopeedia pealkiri", - "episodeNumber": "Episoodi number", - "extra": "Lisa", - "filingDate": "Arhiveerimiskuupäev", - "firstPage": "Esimene lehekĂ¼lg", - "forumTitle": "Foorumi/Listi pealkir", - "genre": "Žanr", - "history": "Ajalugu", - "institution": "Asutus", - "interviewMedium": "Kandja", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Väljalase", - "issueDate": "Väljalaske aeg", - "issuingAuthority": "Väljaandja", - "itemType": "TĂ¼Ă¼p", - "journalAbbreviation": "Ajakirja lĂ¼h.", - "label": "Silt", - "language": "Keel", - "legalStatus": "Ă•iguslik seis", - "legislativeBody": "Seadusandlik keha", - "letterType": "TĂ¼Ă¼p", - "libraryCatalog": "Raamatukogukataloog", - "manuscriptType": "TĂ¼Ă¼p", - "mapType": "TĂ¼Ă¼p", - "meetingName": "Kohtumise nimi", - "nameOfAct": "Akti nimi", - "network": "Võrk", - "number": "Number", - "numberOfVolumes": "# köidet", - "numPages": "# lk", - "pages": "LehekĂ¼ljed", - "patentNumber": "Patendi number", - "place": "Koht", - "postType": "Postituse tĂ¼Ă¼p", - "presentationType": "TĂ¼Ă¼p", - "priorityNumbers": "Prioriteedi numbrid", - "proceedingsTitle": "Toimetise pealkiri", - "programmingLanguage": "Prog. Language", - "programTitle": "Programmi nimi", - "publicationTitle": "TrĂ¼kis", - "publicLawNumber": "Avaliku seaduse number(?)", - "publisher": "Väljaandja", - "references": "Viited", - "reporter": "Teavitaja", - "reporterVolume": "Raporteerija köide(?)", - "reportNumber": "Raportinumber", - "reportType": "RaportitĂ¼Ă¼p", - "rights": "Ă•igused", - "runningTime": "Kestvus", - "scale": "Suurus", - "section": "Osa", - "series": "Seeria", - "seriesNumber": "Seeria number", - "seriesText": "Seeria tekst", - "seriesTitle": "Seeria pealkiri", - "session": "Sessioon", - "shortTitle": "LĂ¼hendatud pealkiri", - "studio": "Stuudio", - "subject": "Subjekt", - "system": "SĂ¼steem", - "thesisType": "TĂ¼Ă¼p", - "title": "Pealkiri", - "university": "Ăœlikool", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Formaat", - "volume": "Köide", - "websiteTitle": "VeebilehekĂ¼lje pealkiri", - "websiteType": "Veebilehe tĂ¼Ă¼p" - }, - "creatorTypes": { - "artist": "Kunstnik", - "attorneyAgent": "Esindaja/Agent", - "author": "Autor", - "bookAuthor": "Raamatu autor", - "cartographer": "Kartograaf", - "castMember": "Osatäitja", - "commenter": "Kommentaator", - "composer": "Helilooja", - "contributor": "Kaastööline", - "cosponsor": "Kaas-sponsor", - "counsel": "Nõustaja", - "director": "Režissöör", - "editor": "Toimetaja", - "guest": "KĂ¼laline", - "interviewee": "Intervjueeritav", - "interviewer": "Intervjueerija", - "inventor": "Leiutaja", - "performer": "Esitaja", - "podcaster": "Podcaster", - "presenter": "Esitaja", - "producer": "Produtsent", - "programmer": "Programmeerija", - "recipient": "Saaja", - "reviewedAuthor": "Arvustatud autor", - "scriptwriter": "Käsikirja autor", - "seriesEditor": "Seeria toimetaja", - "sponsor": "Sponsor", - "translator": "Tõlkija", - "wordsBy": "Sõnade autor" - } - }, - "eu-ES": { - "itemTypes": { - "annotation": "Oharpena", - "artwork": "Arte lan", - "attachment": "Eranskina", - "audioRecording": "Audio Grabaketa", - "bill": "Lege proiektu", - "blogPost": "Blog Albistea", - "book": "Liburu", - "bookSection": "Kapitulu", - "case": "Kasu legal", - "computerProgram": "Softwarea", - "conferencePaper": "Kongresu paper", - "dictionaryEntry": "Hiztegi-sarrera", - "document": "Dokumentu", - "email": "E-posta", - "encyclopediaArticle": "Entziklopedia artikulua", - "film": "Filma", - "forumPost": "Forum Posta", - "hearing": "Bista", - "instantMessage": "Zuzeneko mezularitza", - "interview": "Elkarrizketa", - "journalArticle": "Aldizkaria artikulu", - "letter": "Gutun", - "magazineArticle": "Prentsa artikulu", - "manuscript": "Eskuizkribu", - "map": "Mapa", - "newspaperArticle": "Egunkaria albiste", - "note": "Oharra", - "patent": "Patente", - "podcast": "Podcasta", - "presentation": "Aurkezpena", - "radioBroadcast": "Irrati saioa", - "report": "Txosten", - "statute": "Estatutua", - "thesis": "Tesi", - "tvBroadcast": "Telebista saioa", - "videoRecording": "Video Grabaketa", - "webpage": "Web orri" - }, - "fields": { - "abstractNote": "Laburpena", - "accessDate": "Atzipen data", - "applicationNumber": "Aplikazio zenbakia", - "archive": "Artxiboa", - "archiveLocation": "Aurkibidea artxiboan", - "artworkMedium": "Hedabidea", - "artworkSize": "Artelanaren neurriak", - "assignee": "Nori esleitua", - "audioFileType": "Fitxategi mota", - "audioRecordingFormat": "Formatua", - "billNumber": "Proiektuaren zbk", - "blogTitle": "Blog izenburua", - "bookTitle": "Liburuaren izenburua", - "callNumber": "Erref. Zenbakia", - "caseName": "Kasu izena", - "code": "Kodea", - "codeNumber": "Kode zenbakia", - "codePages": "Kode orrialdeak", - "codeVolume": "Kodearen Alea", - "committee": "Batzordea", - "company": "Enpresa", - "conferenceName": "Kongresuaren titulua", - "country": "Herrialdea", - "court": "Auzitegia", - "date": "Data", - "dateAdded": "Noiz gehitua", - "dateDecided": "Erabakiaren data", - "dateEnacted": "Noiz antzeztua", - "dateModified": "Noiz aldatua", - "dictionaryTitle": "Hiztegiaren izenburua", - "distributor": "Banatzailea", - "docketNumber": "Docket zbk.", - "documentNumber": "Dokumentu zbk.", - "DOI": "DOI", - "edition": "Edizioa", - "encyclopediaTitle": "Entziklopediaren izenburua", - "episodeNumber": "Saio zbk.", - "extra": "Estra", - "filingDate": "Noiz aurkeztua", - "firstPage": "Lehen orrialdea", - "forumTitle": "Forum/Listserv Izenburua", - "genre": "Generoa", - "history": "Historia", - "institution": "Instituzioa", - "interviewMedium": "Komunikabidea", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Zenbakia", - "issueDate": "Zenbakiaren data", - "issuingAuthority": "Agintaritza jaulkitzailea", - "itemType": "Mota", - "journalAbbreviation": "Aldizkaria labur.", - "label": "Disketxea", - "language": "Hizkuntza", - "legalStatus": "Egoera legala", - "legislativeBody": "Erakunde legegintzailea", - "letterType": "Mota", - "libraryCatalog": "Liburutegi katalogoa", - "manuscriptType": "Mota", - "mapType": "Mota", - "meetingName": "Bilkuraren titulua", - "nameOfAct": "Ekitaldiaren izena", - "network": "Irrati/TB-sare", - "number": "Zenbakia", - "numberOfVolumes": "Ale kopurua", - "numPages": "orr.kopurua", - "pages": "Orrialdeak", - "patentNumber": "Patente zenbakia", - "place": "Tokia", - "postType": "Posta mota", - "presentationType": "Mota", - "priorityNumbers": "Lehentasun zenbakiak", - "proceedingsTitle": "Proceedings izenburua", - "programmingLanguage": "Prog. lengoaia", - "programTitle": "Programaren izenburua", - "publicationTitle": "Agerkaria", - "publicLawNumber": "Lege publiko zenbakia", - "publisher": "Argitaratzailea", - "references": "Erreferentziak", - "reporter": "Erreportaria", - "reporterVolume": "Berriemailearen alea", - "reportNumber": "Txostenaren zbk", - "reportType": "Txosten mota", - "rights": "Eskubideak", - "runningTime": "Luzapena", - "scale": "Eskala", - "section": "Atala", - "series": "Serie", - "seriesNumber": "Serie-zenbakia", - "seriesText": "Serie-testua", - "seriesTitle": "Serie-izenburua", - "session": "Saioa", - "shortTitle": "izenburu laburra", - "studio": "Estudioa", - "subject": "Gaia", - "system": "Sistema", - "thesisType": "Mota", - "title": "Izenburua", - "university": "Unibertsitatea", - "url": "URLa", - "versionNumber": "Bertsioa", - "videoRecordingFormat": "Formatua", - "volume": "Alea", - "websiteTitle": "Web-orriaren izenburua", - "websiteType": "Orrialde mota" - }, - "creatorTypes": { - "artist": "Artista", - "attorneyAgent": "Abokatua/Agentea", - "author": "Egile", - "bookAuthor": "Liburuaren egilea", - "cartographer": "Kartografialaria", - "castMember": "Aktorea", - "commenter": "Esataria", - "composer": "Konposatzailea", - "contributor": "Kolaboratzaile", - "cosponsor": "Laguntzailea", - "counsel": "Kontseilua", - "director": "Zuzendaria", - "editor": "Editore", - "guest": "Gonbidatua", - "interviewee": "Elkarrizketatua", - "interviewer": "Elkarrizketatzaile", - "inventor": "Asmatzailea", - "performer": "Antzezlea", - "podcaster": "Podcast egilea", - "presenter": "Aurkezlea", - "producer": "Ekoizlea", - "programmer": "Programatzailea", - "recipient": "Hartzailea", - "reviewedAuthor": "Berrikusitako egilea", - "scriptwriter": "Gidoi-idazle", - "seriesEditor": "Seriearen editore", - "sponsor": "Babeslea", - "translator": "Itzultzaile", - "wordsBy": "Hitzak" - } - }, - "fa": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "اثر هنری", - "attachment": "پیوست", - "audioRecording": "صدای ضبط شده", - "bill": "قانون", - "blogPost": "پست بلاگ", - "book": "کتاب", - "bookSection": "ÙØµÙ„ کتاب", - "case": "پرونده", - "computerProgram": "Software", - "conferencePaper": "مقاله Ú©Ù†ÙØ±Ø§Ù†Ø³", - "dictionaryEntry": "مدخل لغتنامه", - "document": "سند", - "email": "ایمیل", - "encyclopediaArticle": "مقاله دانشنامه", - "film": "Ùیلم", - "forumPost": "پست ÙØ±ÙˆÙ…", - "hearing": "استماع", - "instantMessage": "پیام Ùوری", - "interview": "مصاحبه", - "journalArticle": "مقاله", - "letter": "نامه", - "magazineArticle": "مقاله مجله", - "manuscript": "دست‌نوشته", - "map": "نقشه", - "newspaperArticle": "مقاله روزنامه", - "note": "یادداشت", - "patent": "ثبت اختراع", - "podcast": "پادکست", - "presentation": "ارائه", - "radioBroadcast": "برنامه رادیویی", - "report": "گزارش", - "statute": "مجسمه", - "thesis": "پایان‌نامه", - "tvBroadcast": "برنامه تلویزیونی", - "videoRecording": "تصویر ضبط شده", - "webpage": "ØµÙØ­Ù‡ وب" - }, - "fields": { - "abstractNote": "چکیده", - "accessDate": "تاریخ دسترسی", - "applicationNumber": "شماره درخواست", - "archive": "آرشیو", - "archiveLocation": "محل در آرشیو", - "artworkMedium": "رسانه", - "artworkSize": "اندازه کار هنری", - "assignee": "نماینده قانونی", - "audioFileType": "نوع پرونده", - "audioRecordingFormat": "قالب", - "billNumber": "Bill Number", - "blogTitle": "عنوان بلاگ", - "bookTitle": "عنوان کتاب", - "callNumber": "شماره ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ", - "caseName": "نام پرونده", - "code": "کد", - "codeNumber": "شماره کد", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "کمیته", - "company": "شرکت", - "conferenceName": "نام Ú©Ù†ÙØ±Ø§Ù†Ø³", - "country": "کشور", - "court": "دادگاه", - "date": "تاریخ", - "dateAdded": "تاریخ Ø§ÙØ²ÙˆØ¯Ù†", - "dateDecided": "Date Decided", - "dateEnacted": "تاریخ تصویب", - "dateModified": "تاریخ اصلاح", - "dictionaryTitle": "عنوان لغتنامه", - "distributor": "‌توزیع‌کننده", - "docketNumber": "شماره Ø¯ÙØªØ±", - "documentNumber": "شماره سند", - "DOI": "شناسه DOI", - "edition": "ویرایش", - "encyclopediaTitle": "عنوان دانشنامه", - "episodeNumber": "شماره اپیزود", - "extra": "اطلاعات اضاÙÙ‡", - "filingDate": "تاریخ بایگانی", - "firstPage": "ØµÙØ­Ù‡ اول", - "forumTitle": "عنوان انجمن Ú¯ÙØªÚ¯Ùˆ", - "genre": "ژانر", - "history": "تاریخچه", - "institution": "موسسه", - "interviewMedium": "رسانه", - "ISBN": "شابک", - "ISSN": "شابن", - "issue": "شماره", - "issueDate": "تاریخ شماره", - "issuingAuthority": "مرجع صادر کننده", - "itemType": "نوع", - "journalAbbreviation": "نام مختصر مجله", - "label": "برچسب", - "language": "زبان", - "legalStatus": "وضعیت حقوقی", - "legislativeBody": "هیات قانون‌گذاری", - "letterType": "نوع", - "libraryCatalog": "Ùهرست کتابخانه", - "manuscriptType": "نوع", - "mapType": "نوع", - "meetingName": "نام نشست", - "nameOfAct": "نام قانون", - "network": "شبکه", - "number": "عدد", - "numberOfVolumes": "تعداد جلد", - "numPages": "تعداد ØµÙØ­Ù‡", - "pages": "ØµÙØ­Ø§Øª", - "patentNumber": "شماره ثبت اختراع", - "place": "مکان", - "postType": "نوع پست", - "presentationType": "نوع", - "priorityNumbers": "شماره‌های اولویت", - "proceedingsTitle": "عنوان مجموعه مقالات", - "programmingLanguage": "Prog. Language", - "programTitle": "عنوان برنامه", - "publicationTitle": "انتشار", - "publicLawNumber": "شماره قانون عمومی", - "publisher": "ناشر", - "references": "مراجع", - "reporter": "گزارشگر", - "reporterVolume": "Reporter Volume", - "reportNumber": "شماره گزارش", - "reportType": "نوع گزارش", - "rights": "حقوق", - "runningTime": "زمان اجرا", - "scale": "مقیاس", - "section": "بخش", - "series": "مجموعه (سری)", - "seriesNumber": "شماره مجموعه", - "seriesText": "متن مجموعه", - "seriesTitle": "عنوان مجموعه", - "session": "جلسه", - "shortTitle": "عنوان کوتاه", - "studio": "استودیو", - "subject": "موضوع", - "system": "سامانه", - "thesisType": "نوع", - "title": "عنوان", - "university": "دانشگاه", - "url": "نشانی وب", - "versionNumber": "Version", - "videoRecordingFormat": "قالب", - "volume": "جلد", - "websiteTitle": "عنوان وب‌گاه", - "websiteType": "نوع وب‌گاه" - }, - "creatorTypes": { - "artist": "هنرمند", - "attorneyAgent": "وکیل/نماینده", - "author": "نویسنده", - "bookAuthor": "نویسنده کتاب", - "cartographer": "نقشه‌کش", - "castMember": "عضو گروه", - "commenter": "Ù…ÙØ³Ø±", - "composer": "آهنگساز", - "contributor": "پدیدآور", - "cosponsor": "پشتیبان دوم", - "counsel": "مشاور", - "director": "کارگردان", - "editor": "ویرایشگر", - "guest": "مهمان", - "interviewee": "مصاحبه با", - "interviewer": "مصاحبه‌گر", - "inventor": "مخترع", - "performer": "مجری", - "podcaster": "Podcaster", - "presenter": "ارائه‌دهنده", - "producer": "تولیدکننده", - "programmer": "برنامه‌نویس", - "recipient": "گیرنده", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "نمایشنامه‌نویس", - "seriesEditor": "ویرایشگر مجموعه", - "sponsor": "پشتیبان", - "translator": "مترجم", - "wordsBy": "کلام از" - } - }, - "fi-FI": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Taideteos", - "attachment": "Liite", - "audioRecording": "Äänite", - "bill": "Lasku", - "blogPost": "Blogikirjoitus", - "book": "Kirja", - "bookSection": "Kirjan osa", - "case": "Oikeusjuttu", - "computerProgram": "Ohjelmisto", - "conferencePaper": "Konferenssiartikkeli", - "dictionaryEntry": "Sanakirjan hakusana", - "document": "Asiakirja", - "email": "S-posti", - "encyclopediaArticle": "Tietosanakirja-artikkeli", - "film": "Filmi", - "forumPost": "Foorumiviesti", - "hearing": "Kuuleminen", - "instantMessage": "Pikaviestimen viesti", - "interview": "Haastattelu", - "journalArticle": "Aikakausjulkaisun artikkeli", - "letter": "Kirje", - "magazineArticle": "Aikakauslehden artikkeli", - "manuscript": "Käsikirjoitus", - "map": "Kartta", - "newspaperArticle": "Sanomalehden artikkeli", - "note": "Muistiinpano", - "patent": "Patentti", - "podcast": "Podcast", - "presentation": "Esitelmä", - "radioBroadcast": "Radiolähetys", - "report": "Raportti", - "statute": "Säädös", - "thesis": "Opinnäytetyö", - "tvBroadcast": "Tv-lähetys", - "videoRecording": "Videotallenne", - "webpage": "Web-sivu" - }, - "fields": { - "abstractNote": "Tiivistelmä", - "accessDate": "Luettu", - "applicationNumber": "Hakemusnumero", - "archive": "Arkisto", - "archiveLocation": "Paik. arkistossa", - "artworkMedium": "Materiaali", - "artworkSize": "Teoksen koko", - "assignee": "Valtuutettu", - "audioFileType": "Tiedostomuoto", - "audioRecordingFormat": "Muoto", - "billNumber": "Lasku numero", - "blogTitle": "Blogin nimi", - "bookTitle": "Kirjan nimi", - "callNumber": "Hyllypaikka", - "caseName": "Tapauksen nimi", - "code": "Koodi", - "codeNumber": "Koodinumero", - "codePages": "Koodin sivut", - "codeVolume": "Koodisarja", - "committee": "Komitea", - "company": "Yritys", - "conferenceName": "Konferenssin nimi", - "country": "Maa", - "court": "Tuomioistuin", - "date": "Päiväys", - "dateAdded": "Lisäyspäivä", - "dateDecided": "Päätöspäivämäärä", - "dateEnacted": "Täytäntöönpanopäivä", - "dateModified": "Muokattu", - "dictionaryTitle": "Sanakirjan otsake", - "distributor": "Jakelija", - "docketNumber": "Esityslistan numero", - "documentNumber": "Asiakirjan numero", - "DOI": "DOI", - "edition": "Painos", - "encyclopediaTitle": "Tietosanakirjan otsake", - "episodeNumber": "Jakson numero", - "extra": "Ylim.", - "filingDate": "Arkistointipäivä", - "firstPage": "Ensimmäinen sivu", - "forumTitle": "Foorumin/listan nimi", - "genre": "Genre", - "history": "Historia", - "institution": "Laitos", - "interviewMedium": "Tallennusväline", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Numero", - "issueDate": "Hakupäiväys", - "issuingAuthority": "Myöntänyt viranomainen", - "itemType": "Tyyppi", - "journalAbbreviation": "Julkaisun lyhenne", - "label": "Otsake", - "language": "Kieli", - "legalStatus": "Statustiedot", - "legislativeBody": "Lainsäätäjä", - "letterType": "Tyyppi", - "libraryCatalog": "Kirjastokatalogi", - "manuscriptType": "Käsikirjoitustyyppi", - "mapType": "Tyyppi", - "meetingName": "Tapaamisen nimi", - "nameOfAct": "Laki", - "network": "Verkko", - "number": "Määrä", - "numberOfVolumes": "Niteiden lkm.", - "numPages": "Sivumäärä", - "pages": "Sivut", - "patentNumber": "Patenttinumero", - "place": "Paikka", - "postType": "Tyyppi", - "presentationType": "Tyyppi", - "priorityNumbers": "Etuoikeusnumerot", - "proceedingsTitle": "Konferenssijulkaisun otsikko", - "programmingLanguage": "Ohjelmointikieli", - "programTitle": "Ohjelman nimi", - "publicationTitle": "Julkaisu", - "publicLawNumber": "Lakinumero", - "publisher": "Julkaisija", - "references": "Viittaukset", - "reporter": "Toimittaja", - "reporterVolume": "Raporttivuosikerta", - "reportNumber": "Raportti numero", - "reportType": "Raportin tyyppi", - "rights": "Oikeudet", - "runningTime": "Soittoaika", - "scale": "Mittakaava", - "section": "Osio", - "series": "Sarja", - "seriesNumber": "Sarjan numero", - "seriesText": "Sarjan teksti", - "seriesTitle": "Sarjan nimi", - "session": "Istunto", - "shortTitle": "Lyhyt nimi", - "studio": "Studio", - "subject": "Aihe", - "system": "Järjestelmä", - "thesisType": "Tyyppi", - "title": "Otsake", - "university": "Yliopisto", - "url": "URL", - "versionNumber": "Versio", - "videoRecordingFormat": "Muoto", - "volume": "Vuosikerta", - "websiteTitle": "Websivu", - "websiteType": "Web-sivustotyyppi" - }, - "creatorTypes": { - "artist": "Taiteilija", - "attorneyAgent": "Asianajaja/agentti", - "author": "Tekijä", - "bookAuthor": "Kirjan tekijä", - "cartographer": "Kartoittaja", - "castMember": "Näyttelijä", - "commenter": "Kommentoija", - "composer": "Säveltäjä", - "contributor": "Muu tekijä", - "cosponsor": "Osasponsori", - "counsel": "Oikeusavustaja", - "director": "Ohjaaja", - "editor": "Toimittaja", - "guest": "Vieras", - "interviewee": "Haastattelussa", - "interviewer": "Haastattelija", - "inventor": "Keksijä", - "performer": "Esiintyjä", - "podcaster": "Podcastin tekijä", - "presenter": "Esittäjä", - "producer": "Tuottaja", - "programmer": "Ohjelmoija", - "recipient": "Vastaanottaja", - "reviewedAuthor": "Arvostelun kohde", - "scriptwriter": "Käsikirjoittaja", - "seriesEditor": "Sarjan toimittaja", - "sponsor": "Sponsori", - "translator": "Kääntäjä", - "wordsBy": "Sanoittaja" - } - }, - "fr-FR": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Illustration", - "attachment": "Pièce jointe", - "audioRecording": "Enregistrement audio", - "bill": "Projet/proposition de loi", - "blogPost": "Billet de blog", - "book": "Livre", - "bookSection": "Chapitre de livre", - "case": "Affaire", - "computerProgram": "Logiciel", - "conferencePaper": "Article de colloque", - "dictionaryEntry": "EntrĂ©e de dictionnaire", - "document": "Document", - "email": "Courriel", - "encyclopediaArticle": "Article d'encyclopĂ©die", - "film": "Film", - "forumPost": "Message de forum", - "hearing": "Audience", - "instantMessage": "Message instantanĂ©", - "interview": "Interview", - "journalArticle": "Article de revue", - "letter": "Lettre", - "magazineArticle": "Article de magazine", - "manuscript": "Manuscrit", - "map": "Carte", - "newspaperArticle": "Article de journal", - "note": "Note", - "patent": "Brevet", - "podcast": "Balado (Podcast)", - "presentation": "PrĂ©sentation", - "radioBroadcast": "Émission de radio", - "report": "Rapport", - "statute": "Acte juridique", - "thesis": "Thèse", - "tvBroadcast": "Émission de TV", - "videoRecording": "Enregistrement vidĂ©o", - "webpage": "Page Web" - }, - "fields": { - "abstractNote": "RĂ©sumĂ©", - "accessDate": "ConsultĂ© le", - "applicationNumber": "N° d'application", - "archive": "Archive", - "archiveLocation": "Loc. dans l'archive", - "artworkMedium": "Support de l'illustration", - "artworkSize": "Taille d'illustration", - "assignee": "Cessionnaire", - "audioFileType": "Type de fichier", - "audioRecordingFormat": "Format", - "billNumber": "N° de projet", - "blogTitle": "Titre du blog", - "bookTitle": "Titre du livre", - "callNumber": "Cote", - "caseName": "Nom de l'affaire", - "code": "Code", - "codeNumber": "N° de code", - "codePages": "Pages de code", - "codeVolume": "Volume de code", - "committee": "Commission", - "company": "SociĂ©tĂ©", - "conferenceName": "IntitulĂ© du colloque", - "country": "Pays", - "court": "Tribunal", - "date": "Date", - "dateAdded": "Date d'ajout", - "dateDecided": "Date de dĂ©cision", - "dateEnacted": "PromulguĂ© le", - "dateModified": "ModifiĂ© le", - "dictionaryTitle": "Titre du dict.", - "distributor": "Distributeur", - "docketNumber": "N° de requĂªte", - "documentNumber": "N° du document", - "DOI": "DOI", - "edition": "Édition", - "encyclopediaTitle": "Titre de l'encycl.", - "episodeNumber": "N° de l'Ă©pisode", - "extra": "Extra", - "filingDate": "Date d'archivage", - "firstPage": "Première page", - "forumTitle": "Titre du forum/listserv", - "genre": "Genre", - "history": "Histoire", - "institution": "Institution", - "interviewMedium": "MĂ©dia", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "NumĂ©ro", - "issueDate": "Date de parution", - "issuingAuthority": "AutoritĂ© Ă©mettrice", - "itemType": "Type", - "journalAbbreviation": "AbrĂ©v. de revue", - "label": "Label", - "language": "Langue", - "legalStatus": "Statut lĂ©gal", - "legislativeBody": "Corps lĂ©gislatif", - "letterType": "Type", - "libraryCatalog": "Catalogue de bibl.", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "IntitulĂ© de la rĂ©union", - "nameOfAct": "Nom de l'acte", - "network": "RĂ©seau", - "number": "NumĂ©ro", - "numberOfVolumes": "Nb de volumes", - "numPages": "Nb de pages", - "pages": "Pages", - "patentNumber": "N° de brevet", - "place": "Lieu", - "postType": "Type d'article", - "presentationType": "Type", - "priorityNumbers": "NumĂ©ros de prioritĂ©", - "proceedingsTitle": "Titre des actes", - "programmingLanguage": "Langage de programmation", - "programTitle": "Titre du programme", - "publicationTitle": "Publication", - "publicLawNumber": "N° officiel de l'acte", - "publisher": "Maison d’édition", - "references": "RĂ©fĂ©rences", - "reporter": "Recueil", - "reporterVolume": "Volume de recueil", - "reportNumber": "N° du rapport", - "reportType": "Type de rapport", - "rights": "Autorisations", - "runningTime": "DurĂ©e", - "scale": "Échelle", - "section": "Section", - "series": "Collection", - "seriesNumber": "N° ds la coll.", - "seriesText": "Texte de la coll.", - "seriesTitle": "Titre de la coll.", - "session": "Session", - "shortTitle": "Titre abrĂ©gĂ©", - "studio": "Studio", - "subject": "Sujet", - "system": "Système", - "thesisType": "Type", - "title": "Titre", - "university": "UniversitĂ©", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Titre du site Web", - "websiteType": "Type de site Web" - }, - "creatorTypes": { - "artist": "Artiste", - "attorneyAgent": "Mandataire/Agent", - "author": "Auteur", - "bookAuthor": "Auteur du livre", - "cartographer": "Cartographe", - "castMember": "Membre de la distribution", - "commenter": "Commentateur", - "composer": "Compositeur", - "contributor": "Collaborateur", - "cosponsor": "Co-parrain", - "counsel": "Conseiller", - "director": "Metteur en scène", - "editor": "Éditeur", - "guest": "InvitĂ©", - "interviewee": "InterviewĂ©", - "interviewer": "Reporter", - "inventor": "Inventeur", - "performer": "Interprète", - "podcaster": "Diffuseur", - "presenter": "PrĂ©sentateur", - "producer": "Producteur", - "programmer": "Programmeur", - "recipient": "Destinataire", - "reviewedAuthor": "Auteur recensĂ©", - "scriptwriter": "ScĂ©nariste", - "seriesEditor": "Directeur de coll.", - "sponsor": "Auteur", - "translator": "Traducteur", - "wordsBy": "Paroles de" - } - }, - "gl-ES": { - "itemTypes": { - "annotation": "AnotaciĂ³n", - "artwork": "Arte", - "attachment": "Anexo", - "audioRecording": "GravaciĂ³n de son", - "bill": "Factura", - "blogPost": "Entrada de blogue", - "book": "Libro", - "bookSection": "SecciĂ³n de libro", - "case": "Caso", - "computerProgram": "Software", - "conferencePaper": "PublicaciĂ³n de congreso", - "dictionaryEntry": "Entrada de dicionario", - "document": "Documento", - "email": "Correo electrĂ³nico", - "encyclopediaArticle": "Artigo enciclopĂ©dico", - "film": "PelĂ­cula", - "forumPost": "Entrada de foro", - "hearing": "Audiencia", - "instantMessage": "Mensaxe instantĂ¡neo", - "interview": "Entrevista", - "journalArticle": "Artigo de publicaciĂ³n", - "letter": "Carta", - "magazineArticle": "Artigo de revista", - "manuscript": "Manuscrito", - "map": "Mapa", - "newspaperArticle": "Artigo de xornal", - "note": "Nota", - "patent": "Patente", - "podcast": "Podcast", - "presentation": "PresentaciĂ³n", - "radioBroadcast": "EmisiĂ³n de Radio", - "report": "Informe", - "statute": "Estatuto", - "thesis": "Tese", - "tvBroadcast": "EmisiĂ³n de TV", - "videoRecording": "GravaciĂ³n de vĂ­deo", - "webpage": "PĂ¡xina web" - }, - "fields": { - "abstractNote": "Resumen", - "accessDate": "Consultado", - "applicationNumber": "NĂºmero da solicitude", - "archive": "Arquivo", - "archiveLocation": "Loc. no arquivo", - "artworkMedium": "Mediano", - "artworkSize": "Tamaño das ilustraciĂ³ns", - "assignee": "Cesionario", - "audioFileType": "Tipo de ficheiro", - "audioRecordingFormat": "Formato", - "billNumber": "NĂºmero da factura", - "blogTitle": "TĂ­tulo do blogue", - "bookTitle": "TĂ­tulo do libro", - "callNumber": "NĂºmero de catĂ¡logo", - "caseName": "NĂºmero do caso", - "code": "CĂ³digo", - "codeNumber": "NĂºmero de cĂ³digo", - "codePages": "PĂ¡xinas de cĂ³digos", - "codeVolume": "Tomo de cĂ³digos", - "committee": "ComitĂ©", - "company": "Compañía", - "conferenceName": "Nome da congreso", - "country": "PaĂ­s", - "court": "Tribunal", - "date": "Data", - "dateAdded": "Data de alta", - "dateDecided": "Data decidida", - "dateEnacted": "Data de promulgaciĂ³n", - "dateModified": "Modificado", - "dictionaryTitle": "TĂ­tulo do dicionario", - "distributor": "Distribuidor", - "docketNumber": "NĂºmero de expediente", - "documentNumber": "NĂºmero do documento", - "DOI": "DOI", - "edition": "EdiciĂ³n", - "encyclopediaTitle": "TĂ­tulo da enciclopedia", - "episodeNumber": "NĂºmero de episodio", - "extra": "Extra", - "filingDate": "Data de entrada en arquivo", - "firstPage": "Primeira pĂ¡xina", - "forumTitle": "TĂ­tulo do foro/Listserv", - "genre": "XĂ©nero", - "history": "Historia", - "institution": "InstituciĂ³n", - "interviewMedium": "Medio", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "NĂºmero", - "issueDate": "Data do elemento", - "issuingAuthority": "Autoridade emisora", - "itemType": "Tipo", - "journalAbbreviation": "Abreviatura da publicaciĂ³n", - "label": "RĂ³tulo", - "language": "Lingua", - "legalStatus": "Estatuto xurĂ­dico", - "legislativeBody": "Corpo lexislativo", - "letterType": "Tipo", - "libraryCatalog": "CatĂ¡logo da biblioteca", - "manuscriptType": "Tipo", - "mapType": "Tipo", - "meetingName": "Nome da ReuniĂ³n", - "nameOfAct": "NĂºmero da acta", - "network": "Rede", - "number": "NĂºmero", - "numberOfVolumes": "Nº de tomos", - "numPages": "Nº de PĂ¡xinas", - "pages": "PĂ¡xinas", - "patentNumber": "NĂºmero da patente", - "place": "Lugar", - "postType": "Tipo de entrada", - "presentationType": "Tipo", - "priorityNumbers": "NĂºmeros de prioridade", - "proceedingsTitle": "TĂ­tulo das medidas legais", - "programmingLanguage": "Ling. de programaciĂ³n", - "programTitle": "TĂ­tulo do programa", - "publicationTitle": "PublicaciĂ³n", - "publicLawNumber": "NĂºmero de dereito pĂºblico", - "publisher": "Editorial", - "references": "Referencias", - "reporter": "Reporteiro", - "reporterVolume": "Tomo de reporteiros", - "reportNumber": "NĂºmero do informe", - "reportType": "Tipo de informe", - "rights": "Dereitos", - "runningTime": "DuraciĂ³n", - "scale": "Escala", - "section": "SecciĂ³n", - "series": "Serie", - "seriesNumber": "NĂºmero da serie", - "seriesText": "Texto da serie", - "seriesTitle": "TĂ­tulo da serie", - "session": "SesiĂ³n", - "shortTitle": "TĂ­tulo curto", - "studio": "Estudio", - "subject": "Asunto", - "system": "Sistema", - "thesisType": "Tipo", - "title": "TĂ­tulo", - "university": "Universidade", - "url": "URL", - "versionNumber": "VersiĂ³n", - "videoRecordingFormat": "Formato", - "volume": "Tomo", - "websiteTitle": "TĂ­tulo da pĂ¡xina web", - "websiteType": "Tipo de pĂ¡xina web" - }, - "creatorTypes": { - "artist": "Artista", - "attorneyAgent": "Procurador/Axente", - "author": "Autor", - "bookAuthor": "Autor do libro", - "cartographer": "CartĂ³grafo", - "castMember": "Membro do elenco", - "commenter": "Comentarista", - "composer": "Compositor", - "contributor": "Colaborador", - "cosponsor": "Copatrocinador", - "counsel": "Avogado", - "director": "Director", - "editor": "Editor", - "guest": "Invitado", - "interviewee": "Entrevista con", - "interviewer": "Entrevista", - "inventor": "Inventor", - "performer": "IntĂ©rprete", - "podcaster": "Fonte do podcast", - "presenter": "Presentador", - "producer": "Produtor", - "programmer": "Programador", - "recipient": "Receptor", - "reviewedAuthor": "Autor reseñado", - "scriptwriter": "Guionista", - "seriesEditor": "Editor da serie", - "sponsor": "Patrocinador", - "translator": "Tradutor", - "wordsBy": "GuiĂ³n de" - } - }, - "he-IL": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "יצירת ×ו×נות", - "attachment": "קובץ ×צורף", - "audioRecording": "הקלטת ×ודיו", - "bill": "Bill", - "blogPost": "רשו×ת יו×ן רשת", - "book": "ספר", - "bookSection": "פרק ×ספר", - "case": "תיק", - "computerProgram": "Software", - "conferencePaper": "Conference Paper", - "dictionaryEntry": "×¢×¨× ×‘×ילון", - "document": "×ס××", - "email": "דו×ר ×לקטרוני", - "encyclopediaArticle": "×××ר ××נציקלופדיה", - "film": "סרט", - "forumPost": "הודעה בפורו×", - "hearing": "שי×וע", - "instantMessage": "×סר ×יידי", - "interview": "ר×יון", - "journalArticle": "×××ר ×כתב עת", - "letter": "×כתב", - "magazineArticle": "×××ר ××גזין", - "manuscript": "כתב-יד", - "map": "×פה", - "newspaperArticle": "×××ר ×עיתון", - "note": "הערה", - "patent": "פטנט", - "podcast": "פודק×סט", - "presentation": "×צגת", - "radioBroadcast": "שידור רדיו", - "report": "דוח", - "statute": "Statute", - "thesis": "תזה", - "tvBroadcast": "שידור טלוויזיוני", - "videoRecording": "הקלטת ויד×ו", - "webpage": "דף ×ינטרנט" - }, - "fields": { - "abstractNote": "תקציר", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "Archive", - "archiveLocation": "××™×§×•× ×‘×רכיב", - "artworkMedium": "Medium", - "artworkSize": "Artwork Size", - "assignee": "Assignee", - "audioFileType": "סוג קובץ", - "audioRecordingFormat": "Format", - "billNumber": "Bill Number", - "blogTitle": "×©× ×‘×œ×•×’", - "bookTitle": "×©× ×¡×¤×¨", - "callNumber": "Call Number", - "caseName": "Case Name", - "code": "קוד", - "codeNumber": "Code Number", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "ועדה", - "company": "חברה", - "conferenceName": "×©× ×›× ×¡", - "country": "×דינה", - "court": "Court", - "date": "ת×רי×", - "dateAdded": "ת××¨×™× ×”×•×¡×¤×”", - "dateDecided": "ת××¨×™× ×”×—×œ×˜×”", - "dateEnacted": "Date Enacted", - "dateModified": "שונה", - "dictionaryTitle": "×©× ×ילון", - "distributor": "×פיץ", - "docketNumber": "Docket Number", - "documentNumber": "×ספר ×ס××", - "DOI": "DOI", - "edition": "×הדורה", - "encyclopediaTitle": "×©× ×ינציקלופדיה", - "episodeNumber": "×ספר פרק", - "extra": "Extra", - "filingDate": "Filing Date", - "firstPage": "×¢×וד ר×שון", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "היסטוריה", - "institution": "×וסד", - "interviewMedium": "×דיו×", - "ISBN": "×סת\"ב", - "ISSN": "ISSN", - "issue": "גיליון", - "issueDate": "ת××¨×™× ×”× ×¤×§×”", - "issuingAuthority": "Issuing Authority", - "itemType": "סוג", - "journalAbbreviation": "Journal Abbr", - "label": "תווית", - "language": "שפה", - "legalStatus": "×צב ×שפטי", - "legislativeBody": "גוף ×חוקק", - "letterType": "סוג", - "libraryCatalog": "Library Catalog", - "manuscriptType": "סוג", - "mapType": "סוג", - "meetingName": "×©× ×¤×’×™×©×”", - "nameOfAct": "Name of Act", - "network": "רשת", - "number": "×ספר", - "numberOfVolumes": "# of Volumes", - "numPages": "# of Pages", - "pages": "×¢×ודי×", - "patentNumber": "×ספר פטנט", - "place": "×קו×", - "postType": "Post Type", - "presentationType": "סוג", - "priorityNumbers": "Priority Numbers", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "הוצ××” ל×ור", - "publicLawNumber": "Public Law Number", - "publisher": "×ו\"ל", - "references": "References", - "reporter": "Reporter", - "reporterVolume": "Reporter Volume", - "reportNumber": "×ספר דו\"×—", - "reportType": "סוג דו\"×—", - "rights": "זכויות", - "runningTime": "Running Time", - "scale": "×§× ×” ×ידה", - "section": "Section", - "series": "סידרה", - "seriesNumber": "×ספר סידרה", - "seriesText": "טקסט סידרה", - "seriesTitle": "×©× ×¡×™×“×¨×”", - "session": "Session", - "shortTitle": "כותרת קצרה", - "studio": "סטודיו", - "subject": "נוש×", - "system": "×ערכת", - "thesisType": "סוג", - "title": "כותרת", - "university": "×וניברסיטה", - "url": "כתובת ×ינטרנט", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "כר×", - "websiteTitle": "כותרת ×תר", - "websiteType": "סוג ×תר" - }, - "creatorTypes": { - "artist": "×ו×ן", - "attorneyAgent": "×¢×•×¨× ×“×™×Ÿ/סוכן", - "author": "×חבר", - "bookAuthor": "Book Author", - "cartographer": "קרטוגר××£", - "castMember": "Cast Member", - "commenter": "Commenter", - "composer": "×לחין", - "contributor": "Contributor", - "cosponsor": "Cosponsor", - "counsel": "Counsel", - "director": "ב×××™", - "editor": "עור×", - "guest": "×ורח", - "interviewee": "ר×יון ×¢×", - "interviewer": "×ר×יין", - "inventor": "××צי×", - "performer": "×בצע", - "podcaster": "Podcaster", - "presenter": "×ציג", - "producer": "×פיק", - "programmer": "×תכנת", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "תסריט××™", - "seriesEditor": "×¢×•×¨× ×¡×™×“×¨×”", - "sponsor": "נותן חסות", - "translator": "×תרג×", - "wordsBy": "Words By" - } - }, - "hr-HR": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Artwork", - "attachment": "Attachment", - "audioRecording": "Audio Recording", - "bill": "Bill", - "blogPost": "Blog Post", - "book": "Book", - "bookSection": "Book Section", - "case": "Case", - "computerProgram": "Software", - "conferencePaper": "Conference Paper", - "dictionaryEntry": "Dictionary Entry", - "document": "Document", - "email": "E-mail", - "encyclopediaArticle": "Encyclopedia Article", - "film": "Film", - "forumPost": "Forum Post", - "hearing": "Hearing", - "instantMessage": "Instant Message", - "interview": "Interview", - "journalArticle": "Journal Article", - "letter": "Letter", - "magazineArticle": "Magazine Article", - "manuscript": "Manuscript", - "map": "Map", - "newspaperArticle": "Newspaper Article", - "note": "Note", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Presentation", - "radioBroadcast": "Radio Broadcast", - "report": "Report", - "statute": "Statute", - "thesis": "Thesis", - "tvBroadcast": "TV Broadcast", - "videoRecording": "Video Recording", - "webpage": "Web Page" - }, - "fields": { - "abstractNote": "Abstract", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "Archive", - "archiveLocation": "Loc. in Archive", - "artworkMedium": "Medium", - "artworkSize": "Artwork Size", - "assignee": "Assignee", - "audioFileType": "File Type", - "audioRecordingFormat": "Format", - "billNumber": "Bill Number", - "blogTitle": "Blog Title", - "bookTitle": "Book Title", - "callNumber": "Call Number", - "caseName": "Case Name", - "code": "Code", - "codeNumber": "Code Number", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "Committee", - "company": "Company", - "conferenceName": "Conference Name", - "country": "Country", - "court": "Court", - "date": "Date", - "dateAdded": "Date Added", - "dateDecided": "Date Decided", - "dateEnacted": "Date Enacted", - "dateModified": "Modified", - "dictionaryTitle": "Dictionary Title", - "distributor": "Distributor", - "docketNumber": "Docket Number", - "documentNumber": "Document Number", - "DOI": "DOI", - "edition": "Edition", - "encyclopediaTitle": "Encyclopedia Title", - "episodeNumber": "Episode Number", - "extra": "Extra", - "filingDate": "Filing Date", - "firstPage": "First Page", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "History", - "institution": "Institution", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Issue", - "issueDate": "Issue Date", - "issuingAuthority": "Issuing Authority", - "itemType": "Type", - "journalAbbreviation": "Journal Abbr", - "label": "Label", - "language": "Language", - "legalStatus": "Legal Status", - "legislativeBody": "Legislative Body", - "letterType": "Type", - "libraryCatalog": "Library Catalog", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Meeting Name", - "nameOfAct": "Name of Act", - "network": "Network", - "number": "Number", - "numberOfVolumes": "# of Volumes", - "numPages": "# of Pages", - "pages": "Pages", - "patentNumber": "Patent Number", - "place": "Place", - "postType": "Post Type", - "presentationType": "Type", - "priorityNumbers": "Priority Numbers", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "Publication", - "publicLawNumber": "Public Law Number", - "publisher": "Publisher", - "references": "References", - "reporter": "Reporter", - "reporterVolume": "Reporter Volume", - "reportNumber": "Report Number", - "reportType": "Report Type", - "rights": "Rights", - "runningTime": "Running Time", - "scale": "Scale", - "section": "Section", - "series": "Series", - "seriesNumber": "Series Number", - "seriesText": "Series Text", - "seriesTitle": "Series Title", - "session": "Session", - "shortTitle": "Short Title", - "studio": "Studio", - "subject": "Subject", - "system": "System", - "thesisType": "Type", - "title": "Title", - "university": "University", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Website Title", - "websiteType": "Website Type" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Attorney/Agent", - "author": "Author", - "bookAuthor": "Book Author", - "cartographer": "Cartographer", - "castMember": "Cast Member", - "commenter": "Commenter", - "composer": "Composer", - "contributor": "Contributor", - "cosponsor": "Cosponsor", - "counsel": "Counsel", - "director": "Director", - "editor": "Editor", - "guest": "Guest", - "interviewee": "Interview With", - "interviewer": "Interviewer", - "inventor": "Inventor", - "performer": "Performer", - "podcaster": "Podcaster", - "presenter": "Presenter", - "producer": "Producer", - "programmer": "Programmer", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Scriptwriter", - "seriesEditor": "Series Editor", - "sponsor": "Sponsor", - "translator": "Translator", - "wordsBy": "Words By" - } - }, - "hu-HU": { - "itemTypes": { - "annotation": "MegjegyzĂ©s", - "artwork": "MűalkotĂ¡s", - "attachment": "Kapcsolat", - "audioRecording": "HangfelvĂ©tel", - "bill": "TörvĂ©nyjavaslat", - "blogPost": "BlogbejegyzĂ©s", - "book": "Könyv", - "bookSection": "Könyvfejezet", - "case": "Eset", - "computerProgram": "Szoftver", - "conferencePaper": "Dolgozat", - "dictionaryEntry": "SzĂ³tĂ¡r szĂ³cikk", - "document": "Dokumentum", - "email": "Email", - "encyclopediaArticle": "Lexikon szĂ³cikk", - "film": "Film", - "forumPost": "FĂ³rumbejegyzĂ©s", - "hearing": "MeghallgatĂ¡s", - "instantMessage": "Azonnali Ă¼zenet", - "interview": "InterjĂº", - "journalArticle": "FolyĂ³iratcikk", - "letter": "LevĂ©l", - "magazineArticle": "Magazincikk", - "manuscript": "KĂ©zirat", - "map": "TĂ©rkĂ©p", - "newspaperArticle": "ĂjsĂ¡gcikk", - "note": "Jegyzet", - "patent": "Szabadalom", - "podcast": "Podcast", - "presentation": "ElÅ‘adĂ¡s", - "radioBroadcast": "RĂ¡diĂ³s program", - "report": "JelentĂ©s", - "statute": "JogszabĂ¡ly", - "thesis": "Szakdolgozat", - "tvBroadcast": "TelevĂ­ziĂ³s program", - "videoRecording": "VideĂ³felvĂ©tel", - "webpage": "Weboldal" - }, - "fields": { - "abstractNote": "Kivonat", - "accessDate": "HozzĂ¡fĂ©rĂ©s", - "applicationNumber": "BejelentĂ©s szĂ¡ma", - "archive": "ArchĂ­vum", - "archiveLocation": "Pontos lelÅ‘hely", - "artworkMedium": "MűalkotĂ¡s mĂ©diuma", - "artworkSize": "MűalkotĂ¡s mĂ©rete", - "assignee": "FelelÅ‘s", - "audioFileType": "FĂ¡jl tĂ­pusa", - "audioRecordingFormat": "FormĂ¡tum", - "billNumber": "TörvĂ©nyjavaslat szĂ¡ma", - "blogTitle": "Blog cĂ­me", - "bookTitle": "Könyv cĂ­me", - "callNumber": "RaktĂ¡ri jelzet", - "caseName": "Eset neve", - "code": "TörvĂ©nykönyv", - "codeNumber": "TörvĂ©nykönyv szĂ¡ma", - "codePages": "OldalszĂ¡m", - "codeVolume": "Kötet", - "committee": "BizottsĂ¡g", - "company": "CĂ©g", - "conferenceName": "Konferencia cĂ­me", - "country": "OrszĂ¡g", - "court": "BĂ­rĂ³sĂ¡g", - "date": "DĂ¡tum", - "dateAdded": "HozzĂ¡adĂ¡s dĂ¡tuma", - "dateDecided": "DöntĂ©s dĂ¡tuma", - "dateEnacted": "HatĂ¡lybalĂ©pĂ©s dĂ¡tuma", - "dateModified": "MĂ³dosĂ­tĂ¡s dĂ¡tuma", - "dictionaryTitle": "SzĂ³tĂ¡r cĂ­me", - "distributor": "TerjesztÅ‘", - "docketNumber": "ĂœgyiratszĂ¡m", - "documentNumber": "Dokumentum szĂ¡ma", - "DOI": "DOI", - "edition": "KiadĂ¡s", - "encyclopediaTitle": "Lexikon cĂ­me", - "episodeNumber": "EpizĂ³d szĂ¡ma", - "extra": "EgyĂ©b", - "filingDate": "IktatĂ¡s idÅ‘pontja", - "firstPage": "ElsÅ‘ oldal", - "forumTitle": "FĂ³rum/listserv cĂ­me", - "genre": "TĂ­pus", - "history": "TörtĂ©net", - "institution": "IntĂ©zmĂ©ny", - "interviewMedium": "MĂ©dium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "SzĂ¡m", - "issueDate": "KiadĂ¡s dĂ¡tuma", - "issuingAuthority": "Issuing Authority", - "itemType": "TĂ­pus", - "journalAbbreviation": "FolyĂ³irat rövid neve", - "label": "CĂ­mke", - "language": "Nyelv", - "legalStatus": "Ăllapot", - "legislativeBody": "TörvĂ©nyhozĂ³ szerv", - "letterType": "TĂ­pus", - "libraryCatalog": "KönyvtĂ¡r KatalĂ³gus", - "manuscriptType": "TĂ­pus", - "mapType": "TĂ­pus", - "meetingName": "TalĂ¡lkozĂ³ neve", - "nameOfAct": "TörvĂ©ny cĂ­me", - "network": "TV tĂ¡rsasĂ¡g", - "number": "SorszĂ¡m", - "numberOfVolumes": "Kötetek szĂ¡ma", - "numPages": "Terjedelem", - "pages": "OldalszĂ¡m", - "patentNumber": "Szabadalom szĂ¡ma", - "place": "Hely", - "postType": "BejegyzĂ©s tĂ­pusa", - "presentationType": "TĂ­pus", - "priorityNumbers": "ElsÅ‘bbsĂ©gi sorrend", - "proceedingsTitle": "KiadvĂ¡ny cĂ­me", - "programmingLanguage": "Prog. nyelv", - "programTitle": "Program cĂ­me", - "publicationTitle": "KiadvĂ¡ny", - "publicLawNumber": "TörvĂ©ny szĂ¡ma", - "publisher": "KiadĂ³", - "references": "HivatkozĂ¡sok", - "reporter": "DöntvĂ©nytĂ¡r", - "reporterVolume": "Kötet", - "reportNumber": "JelentĂ©s szĂ¡ma", - "reportType": "JelentĂ©s tĂ­pusa", - "rights": "Jogok", - "runningTime": "LejĂ¡tszĂ¡si idÅ‘", - "scale": "ArĂ¡ny", - "section": "Fejezet", - "series": "Sorozat", - "seriesNumber": "Sorozatbeli sorszĂ¡m", - "seriesText": "Sorozat szövege", - "seriesTitle": "Sorozat cĂ­me", - "session": "ĂœlĂ©sszak", - "shortTitle": "Rövid cĂ­m", - "studio": "StĂºdiĂ³", - "subject": "TĂ©ma", - "system": "Rendszer", - "thesisType": "TĂ­pus", - "title": "CĂ­m", - "university": "Egyetem", - "url": "URL", - "versionNumber": "VerziĂ³", - "videoRecordingFormat": "FormĂ¡tum", - "volume": "Kötet", - "websiteTitle": "Website cĂ­me", - "websiteType": "Weboldal tĂ­pusa" - }, - "creatorTypes": { - "artist": "MűvĂ©sz", - "attorneyAgent": "ĂœgyvĂ©d", - "author": "SzerzÅ‘", - "bookAuthor": "Könyv szerzÅ‘je", - "cartographer": "TĂ©rkĂ©pĂ©sz", - "castMember": "SzereplÅ‘", - "commenter": "HozzĂ¡szĂ³lĂ³", - "composer": "ZeneszerzÅ‘", - "contributor": "KözreműködÅ‘", - "cosponsor": "Cosponsor", - "counsel": "ĂœgyvĂ©d", - "director": "RendezÅ‘", - "editor": "SzerkesztÅ‘", - "guest": "VendĂ©g", - "interviewee": "InterjĂº alanya", - "interviewer": "InterjĂº kĂ©szĂ­tÅ‘je", - "inventor": "FeltalĂ¡lĂ³", - "performer": "ElÅ‘adĂ³", - "podcaster": "Podcaster", - "presenter": "ElÅ‘adĂ³", - "producer": "Producer", - "programmer": "ProgramozĂ³", - "recipient": "Alperes", - "reviewedAuthor": "RecenzĂ¡lt mű szerzÅ‘je", - "scriptwriter": "ForgatĂ³könyvĂ­rĂ³", - "seriesEditor": "SorozatszerkesztÅ‘", - "sponsor": "BenyĂºjtĂ³", - "translator": "FordĂ­tĂ³", - "wordsBy": "SzövegĂ­rĂ³" - } - }, - "id-ID": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Karya Seni", - "attachment": "Lampiran", - "audioRecording": "Rekaman Audio", - "bill": "Tagihan", - "blogPost": "Pos Blog", - "book": "Buku", - "bookSection": "Seksi Buku", - "case": "Kasus", - "computerProgram": "Software", - "conferencePaper": "Dokumen Konferensi", - "dictionaryEntry": "Entri Kamus", - "document": "Dokumen", - "email": "E-mail", - "encyclopediaArticle": "Artikel Ensiklopedia", - "film": "Film", - "forumPost": "Pos Forum", - "hearing": "Pemeriksaan", - "instantMessage": "Pesan Instan", - "interview": "Wawancara", - "journalArticle": "Artikel Jurnal", - "letter": "Surat", - "magazineArticle": "Artikel Majalah", - "manuscript": "Manuskrip", - "map": "Peta", - "newspaperArticle": "Artikel Koran", - "note": "Catatan", - "patent": "Paten", - "podcast": "Podcast", - "presentation": "Presentasi", - "radioBroadcast": "Siaran Radio", - "report": "Laporan", - "statute": "Statuta", - "thesis": "Tesis", - "tvBroadcast": "Siaran TV", - "videoRecording": "Rekaman Video", - "webpage": "Laman Web" - }, - "fields": { - "abstractNote": "Abstrak", - "accessDate": "Diakses", - "applicationNumber": "Nomor Aplikasi", - "archive": "Arsip", - "archiveLocation": "Lokasi di dalam Arsip", - "artworkMedium": "Media", - "artworkSize": "Ukuran Karya Seni", - "assignee": "Penerima", - "audioFileType": "Jenis Berkas", - "audioRecordingFormat": "Format", - "billNumber": "Nomor Tagihan", - "blogTitle": "Judul Blog", - "bookTitle": "Judul Buku", - "callNumber": "Nomor Panggilan", - "caseName": "Nama Kasus", - "code": "Kode", - "codeNumber": "Nomor Kode", - "codePages": "Halaman Kode", - "codeVolume": "Volume Kode", - "committee": "Komite", - "company": "Perusahaan", - "conferenceName": "Nama Konferensi", - "country": "Negara", - "court": "Pengadilan", - "date": "Tanggal", - "dateAdded": "Tanggal Ditambahkan", - "dateDecided": "Tanggal Diputuskan", - "dateEnacted": "Tanggal DIundangkan", - "dateModified": "Dimodifikasi", - "dictionaryTitle": "Judul Kamus", - "distributor": "Distributor", - "docketNumber": "Nomor Acara Pengadilan", - "documentNumber": "Nomor Dokumen", - "DOI": "DOI", - "edition": "Edisi", - "encyclopediaTitle": "Judul Ensiklopedia", - "episodeNumber": "Nomor Episode", - "extra": "Ekstra", - "filingDate": "Tanggal Pembuatan", - "firstPage": "Halaman Pertama", - "forumTitle": "Judul Forum/Listserv", - "genre": "Genre", - "history": "RIwayat", - "institution": "Institusi", - "interviewMedium": "Media", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Isu", - "issueDate": "Tanngal Keluar", - "issuingAuthority": "Otoritas yang Mengeluarkan", - "itemType": "Jenis", - "journalAbbreviation": "Singkatan Jurnal", - "label": "Label", - "language": "Bahasa", - "legalStatus": "Status Legal", - "legislativeBody": "Badan Legislatif", - "letterType": "Jenis", - "libraryCatalog": "Katalog Perpustakaan", - "manuscriptType": "Jenis", - "mapType": "Jenis", - "meetingName": "Nama Pertemuan", - "nameOfAct": "Nama Putusan", - "network": "Jaringan", - "number": "Nomor", - "numberOfVolumes": "# Volume", - "numPages": "# halaman", - "pages": "Halaman", - "patentNumber": "Nomor Paten", - "place": "Tempat", - "postType": "Jenis Pos", - "presentationType": "Jenis", - "priorityNumbers": "Nomor Prioritas", - "proceedingsTitle": "Judul Rapat", - "programmingLanguage": "Prog. Language", - "programTitle": "Judul Program", - "publicationTitle": "Publikasi", - "publicLawNumber": "Nomor Hukum Publik", - "publisher": "Penerbit", - "references": "Referensi", - "reporter": "Reporter", - "reporterVolume": "Volume Reporter", - "reportNumber": "Nomor Laporan", - "reportType": "Jenis Laporan", - "rights": "Hak", - "runningTime": "Waktu Berjalan", - "scale": "Skala", - "section": "Bagian", - "series": "Seri", - "seriesNumber": "Nomor Seri", - "seriesText": "Teks Seri", - "seriesTitle": "Judul Seri", - "session": "Sesi", - "shortTitle": "Judul Singkat", - "studio": "Studio", - "subject": "Subjek", - "system": "Sistem", - "thesisType": "Jenis", - "title": "Judul", - "university": "Universitas", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Judul Website", - "websiteType": "Jenis Website" - }, - "creatorTypes": { - "artist": "Seniman", - "attorneyAgent": "Pengacara/Agen", - "author": "Penulis", - "bookAuthor": "Penulis Buku", - "cartographer": "Pembuat Peta", - "castMember": "Pemain", - "commenter": "Pemberi Komentar", - "composer": "Komposer", - "contributor": "Kontributor", - "cosponsor": "Kosponsor", - "counsel": "Advokat", - "director": "Direktur", - "editor": "Editor", - "guest": "Bintang Tamu", - "interviewee": "Wawancara dengan", - "interviewer": "Pewawancara", - "inventor": "Penemu", - "performer": "Performer", - "podcaster": "Podcaster", - "presenter": "Presenter", - "producer": "Produser", - "programmer": "Programer", - "recipient": "Penerima", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Penulis Skrip", - "seriesEditor": "Editor Seri", - "sponsor": "Sponsor", - "translator": "Penerjemah", - "wordsBy": "Teks Oleh" - } - }, - "is-IS": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Listaverk", - "attachment": "Viðhengi", - "audioRecording": "HljĂ³Ă°upptaka", - "bill": "Tilkynning", - "blogPost": "Bloggfærsla", - "book": "BĂ³k", - "bookSection": "BĂ³karhluti", - "case": "MĂ¡l", - "computerProgram": "Software", - "conferencePaper": "RĂ¡Ă°stefnugrein", - "dictionaryEntry": "Færsla Ă­ orðabĂ³k", - "document": "Skjal", - "email": "TölvupĂ³stur", - "encyclopediaArticle": "Færsla Ă­ alfræðiriti", - "film": "Kvikmynd", - "forumPost": "Færsla Ă¡ samskiptasvæði", - "hearing": "RĂ©ttarhöld", - "instantMessage": "Skyndiskilaboð", - "interview": "Viðtal", - "journalArticle": "Fræðigrein Ă­ tĂ­mariti", - "letter": "BrĂ©f", - "magazineArticle": "TĂ­maritsgrein", - "manuscript": "Handrit", - "map": "Kort", - "newspaperArticle": "Grein Ă­ dagblaði", - "note": "Athugasemd", - "patent": "Einkaleyfi", - "podcast": "HljĂ³Ă°varp", - "presentation": "Kynning", - "radioBroadcast": "ĂtvarpsĂºtsending", - "report": "SkĂ½rsla", - "statute": "Lög", - "thesis": "Ritgerð", - "tvBroadcast": "SjĂ³nvarpsĂºtsending", - "videoRecording": "Myndskeið", - "webpage": "Vefsíða" - }, - "fields": { - "abstractNote": "Ăgrip", - "accessDate": "SĂ³tt", - "applicationNumber": "UmsĂ³kn nĂºmer", - "archive": "Safnvista", - "archiveLocation": "Staðsetning Ă­ safni", - "artworkMedium": "Miðill", - "artworkSize": "Stærð verks", - "assignee": "MĂ¡lstaki", - "audioFileType": "SkrĂ¡artegund", - "audioRecordingFormat": "HljĂ³Ă°upptökusnið", - "billNumber": "TilkynningarnĂºmer", - "blogTitle": "Titill Ă¡ Bloggi", - "bookTitle": "Titill bĂ³kar", - "callNumber": "Hillumerking", - "caseName": "Nafn mĂ¡ls", - "code": "KĂ³Ă°i", - "codeNumber": "KĂ³Ă°anĂºmer", - "codePages": "Síður kĂ³Ă°a", - "codeVolume": "Magn kĂ³Ă°a", - "committee": "Nefnd", - "company": "Fyrirtæki", - "conferenceName": "Heiti rĂ¡Ă°stefnu", - "country": "Land", - "court": "RĂ©ttur", - "date": "Dagsetning", - "dateAdded": "Dagsetning viðbĂ³tar", - "dateDecided": "Dagsetning Ă¡kvörðunar", - "dateEnacted": "Virkjunardagsetning", - "dateModified": "Breytt", - "dictionaryTitle": "Nafn orðabĂ³kar", - "distributor": "Dreifingaraðili", - "docketNumber": "MĂ¡lsnĂºmer", - "documentNumber": "SkjalanĂºmer", - "DOI": "DOI", - "edition": "ĂtgĂ¡fa", - "encyclopediaTitle": "Nafn alfræðirits", - "episodeNumber": "ĂĂ¡ttur nĂºmer", - "extra": "ViðbĂ³t", - "filingDate": "Dagsetning skrĂ¡ningar", - "firstPage": "Fyrsta síða", - "forumTitle": "Titill samskiptasvæðis/Listserv", - "genre": "Tegund", - "history": "Saga", - "institution": "Stofnun", - "interviewMedium": "Miðill", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Hefti", - "issueDate": "ĂtgĂ¡fudagsetning", - "issuingAuthority": "Ătgefandi", - "itemType": "Tegund", - "journalAbbreviation": "Skammstöfun fræðarits", - "label": "Merki", - "language": "TungumĂ¡l", - "legalStatus": "Lagaleg staða", - "legislativeBody": "Lagastofnun", - "letterType": "Tegund leturs", - "libraryCatalog": "FærslusafnskrĂ¡", - "manuscriptType": "Tegund ritverks", - "mapType": "Tegund korts", - "meetingName": "Heiti fundar", - "nameOfAct": "Nafn laga", - "network": "Gagnanet", - "number": "NĂºmer", - "numberOfVolumes": "Fjöldi binda", - "numPages": "# síður", - "pages": "Blaðsíður", - "patentNumber": "Einkaleyfi nr.", - "place": "Staðsetning", - "postType": "PĂ³stsnið", - "presentationType": "Tegund", - "priorityNumbers": "ForgangsnĂºmer", - "proceedingsTitle": "Titill mĂ¡lstofu", - "programmingLanguage": "Prog. Language", - "programTitle": "Titill forrits", - "publicationTitle": "ĂtgĂ¡fa", - "publicLawNumber": "Lög nĂºmer", - "publisher": "Ătgefandi", - "references": "TilvĂ­sanir", - "reporter": "Blaðamaður", - "reporterVolume": "Fjöldi blaðamanna", - "reportNumber": "SkĂ½rslunĂºmer", - "reportType": "Tegund skĂ½rslu", - "rights": "RĂ©ttindi", - "runningTime": "Lengd", - "scale": "Skali", - "section": "Hluti", - "series": "Ritröð", - "seriesNumber": "NĂºmer ritraðar", - "seriesText": "Nafn eintaks Ă­ ritröð", - "seriesTitle": "Titill ritraðar", - "session": "Seta", - "shortTitle": "Stuttur titill", - "studio": "StĂºdĂ­Ă³", - "subject": "Efni", - "system": "Kerfi", - "thesisType": "Tegund", - "title": "Titill", - "university": "HĂ¡skĂ³li", - "url": "SlĂ³Ă°", - "versionNumber": "ĂtgĂ¡fa", - "videoRecordingFormat": "Upptökusnið", - "volume": "Bindi", - "websiteTitle": "Titill vefsíðu", - "websiteType": "Tegund vefs" - }, - "creatorTypes": { - "artist": "Listamaður", - "attorneyAgent": "Lögfræðingur/fulltrĂºi", - "author": "Höfundur", - "bookAuthor": "Höfundur bĂ³kar", - "cartographer": "Kortagerð", - "castMember": "Leikari", - "commenter": "Athugasemdir", - "composer": "Höfundur", - "contributor": "Aðili að verki", - "cosponsor": "StuðningsĂ¾Ă¡tttakandi", - "counsel": "RĂ¡Ă°gjöf", - "director": "LeikstjĂ³ri", - "editor": "RitstjĂ³ri", - "guest": "Gestur", - "interviewee": "Viðtal við", - "interviewer": "Hver tĂ³k viðtalið", - "inventor": "Uppfinningamaður", - "performer": "Leikari", - "podcaster": "Hlaðvörpun", - "presenter": "Kynnandi", - "producer": "Framleiðandi", - "programmer": "Forritari", - "recipient": "Viðtakandi", - "reviewedAuthor": "Yfirlestrarhöfundur", - "scriptwriter": "Handritshöfundur", - "seriesEditor": "RitstjĂ³ri ritraðar", - "sponsor": "Stuðningsaðili", - "translator": "ĂĂ½Ă°andi", - "wordsBy": "Textahöfundur" - } - }, - "it-IT": { - "itemTypes": { - "annotation": "Annotazione", - "artwork": "Grafica", - "attachment": "Allegato", - "audioRecording": "Registrazione audio", - "bill": "Legge", - "blogPost": "Messaggio di blog", - "book": "Libro", - "bookSection": "Sezione di un libro", - "case": "Sentenza", - "computerProgram": "Software", - "conferencePaper": "Atto di convegno", - "dictionaryEntry": "Voce di dizionario", - "document": "Documento", - "email": "E-mail", - "encyclopediaArticle": "Voce di enciclopedia", - "film": "Film", - "forumPost": "Messaggio di forum", - "hearing": "Udienza", - "instantMessage": "Messaggio immediato", - "interview": "Intervista", - "journalArticle": "Articolo di periodico specializzato", - "letter": "Lettera", - "magazineArticle": "Articolo di rivista", - "manuscript": "Manoscritto", - "map": "Mappa", - "newspaperArticle": "Articolo di giornale", - "note": "Nota", - "patent": "Brevetto", - "podcast": "Podcast", - "presentation": "Presentazione", - "radioBroadcast": "Trasmissione radiofonica", - "report": "Report", - "statute": "Statuto", - "thesis": "Tesi", - "tvBroadcast": "Trasmissione televisiva", - "videoRecording": "Registrazione video", - "webpage": "Pagina web" - }, - "fields": { - "abstractNote": "Abstract", - "accessDate": "Consultato", - "applicationNumber": "Numero di applicazione", - "archive": "Archivio", - "archiveLocation": "Collocazione in archivio", - "artworkMedium": "Mezzo grafico", - "artworkSize": "Dimensioni grafiche", - "assignee": "Cessionario", - "audioFileType": "Tipo di file", - "audioRecordingFormat": "Formato", - "billNumber": "Numero della legge", - "blogTitle": "Nome del blog", - "bookTitle": "Titolo del libro", - "callNumber": "Segnatura", - "caseName": "Nome del caso", - "code": "Codice", - "codeNumber": "Numero di codice", - "codePages": "Pagine del codice", - "codeVolume": "Volume del codice", - "committee": "Commissione", - "company": "SocietĂ ", - "conferenceName": "Titolo di conferenza", - "country": "Nazione", - "court": "Corte", - "date": "Data", - "dateAdded": "Aggiunto in data", - "dateDecided": "Data della sentenza", - "dateEnacted": "Data di emanazione", - "dateModified": "Modificato in data", - "dictionaryTitle": "Titolo di dizionario", - "distributor": "Distribuzione", - "docketNumber": "Numero di inventario della sentenza", - "documentNumber": "Numero di documento", - "DOI": "DOI", - "edition": "Edizione", - "encyclopediaTitle": "Titolo di enciclopedia", - "episodeNumber": "Numero di episodio", - "extra": "Extra", - "filingDate": "Data di sottomissione", - "firstPage": "Prima pagina", - "forumTitle": "Nome del forum o listserv", - "genre": "Genere", - "history": "Cronologia", - "institution": "Istituzione", - "interviewMedium": "Mezzo", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Fascicolo", - "issueDate": "Data di pubblicazione", - "issuingAuthority": "AutoritĂ  emettente", - "itemType": "Tipo", - "journalAbbreviation": "Sigla rivista", - "label": "Etichetta", - "language": "Lingua", - "legalStatus": "Stato legale", - "legislativeBody": "Corpo legislativo", - "letterType": "Tipo", - "libraryCatalog": "Catalogo della biblioteca", - "manuscriptType": "Tipo", - "mapType": "Tipo", - "meetingName": "Nome della riunione", - "nameOfAct": "Nome dell'atto", - "network": "Rete", - "number": "Numero", - "numberOfVolumes": "Numero di volumi", - "numPages": "# di Pagine", - "pages": "Pagine", - "patentNumber": "Numero di brevetto", - "place": "Luogo di edizione", - "postType": "Tipo di messaggio", - "presentationType": "Tipo", - "priorityNumbers": "Numero di prioritĂ ", - "proceedingsTitle": "Titolo degli atti", - "programmingLanguage": "Linguaggio di progr.", - "programTitle": "Titolo del programma", - "publicationTitle": "Titolo della pubblicazione", - "publicLawNumber": "Numero di legge pubblica", - "publisher": "Editore", - "references": "Riferimenti bibliografici", - "reporter": "Cancelliere", - "reporterVolume": "Volume di report", - "reportNumber": "Numero di report", - "reportType": "Tipo di report", - "rights": "Diritti", - "runningTime": "Tempo di esercizio", - "scale": "Scala", - "section": "Sezione", - "series": "Serie", - "seriesNumber": "Numero della serie", - "seriesText": "Testo della serie", - "seriesTitle": "Titolo della serie", - "session": "Sessione", - "shortTitle": "Titolo breve", - "studio": "Studio", - "subject": "Oggetto", - "system": "Sistema", - "thesisType": "Tipo", - "title": "Titolo", - "university": "UniversitĂ ", - "url": "URL", - "versionNumber": "Versione", - "videoRecordingFormat": "Formato", - "volume": "Volume", - "websiteTitle": "Nome del sito", - "websiteType": "Tipo di sito web" - }, - "creatorTypes": { - "artist": "Artista", - "attorneyAgent": "Procuratore o agente", - "author": "Autore", - "bookAuthor": "Autore del libro", - "cartographer": "Cartografo", - "castMember": "Componente del cast", - "commenter": "Commentatore", - "composer": "Compositore", - "contributor": "Collaboratore", - "cosponsor": "Co-finanziatore", - "counsel": "Consulente", - "director": "Regista", - "editor": "Curatore", - "guest": "Ospite", - "interviewee": "Intervista con", - "interviewer": "Intervistatore", - "inventor": "Inventore", - "performer": "Interprete", - "podcaster": "Autore del podcast", - "presenter": "Presentatore", - "producer": "Produttore", - "programmer": "Programmatore", - "recipient": "Beneficiario", - "reviewedAuthor": "Autore recensito", - "scriptwriter": "Sceneggiatore", - "seriesEditor": "Curatore della serie", - "sponsor": "Finanziatore", - "translator": "Convertitore", - "wordsBy": "Parole di" - } - }, - "ja-JP": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "è¸è¡“作å“", - "attachment": "æ·»ä»˜ăƒ•ă‚¡ă‚¤ăƒ«", - "audioRecording": "録音", - "bill": "議案", - "blogPost": "ăƒ–ăƒ­ă‚°è¨˜äº‹", - "book": "書ç±", - "bookSection": "書ç±ă®ç« ", - "case": "訴訟", - "computerProgram": "Software", - "conferencePaper": "å­¦ä¼ç™ºè¡¨", - "dictionaryEntry": "è¾æ›¸é …ç›®", - "document": "文書", - "email": "é›»å­ăƒ¡ăƒ¼ăƒ«", - "encyclopediaArticle": "百科事典項目", - "film": "映画", - "forumPost": "æ²ç¤ºæ¿ă¸ă®æ•稿", - "hearing": "å…¬è´ä¼", - "instantMessage": "ă‚¤ăƒ³ă‚¹ă‚¿ăƒ³ăƒˆăƒ¡ăƒƒă‚»ăƒ¼ă‚¸", - "interview": "ă‚¤ăƒ³ă‚¿ăƒ“ăƒ¥ăƒ¼", - "journalArticle": "学術論文", - "letter": "手紙", - "magazineArticle": "雑誌記事", - "manuscript": "åŸç¨¿", - "map": "地図", - "newspaperArticle": "æ–°è記事", - "note": "ăƒ¡ăƒ¢", - "patent": "特許", - "podcast": "ăƒăƒƒăƒ‰ă‚­ăƒ£ă‚¹ăƒˆ", - "presentation": "ăƒ—ăƒ¬ă‚¼ăƒ³ăƒ†ăƒ¼ă‚·ăƒ§ăƒ³", - "radioBroadcast": "ăƒ©ă‚¸ă‚ªæ”¾é€", - "report": "ăƒ¬ăƒăƒ¼ăƒˆ", - "statute": "法律", - "thesis": "å­¦ä½è«–æ–‡", - "tvBroadcast": "ăƒ†ăƒ¬ăƒ“æ”¾é€", - "videoRecording": "録画", - "webpage": "ă‚¦ă‚§ăƒ–ăƒăƒ¼ă‚¸" - }, - "fields": { - "abstractNote": "æ„録", - "accessDate": "ă‚¢ă‚¯ă‚»ă‚¹æ—¥æ™‚", - "applicationNumber": "商標登録å·", - "archive": "ă‚¢ăƒ¼ă‚«ă‚¤ăƒ–", - "archiveLocation": "ă‚¢ăƒ¼ă‚«ă‚¤ăƒ–ç•ªå·", - "artworkMedium": "ç´ æăƒ»æ€æ³•", - "artworkSize": "è¸è¡“作å“ă®ă‚µă‚¤ă‚º", - "assignee": "è­²å—人", - "audioFileType": "ăƒ•ă‚¡ă‚¤ăƒ«ă®ç¨®é¡", - "audioRecordingFormat": "ăƒ•ă‚©ăƒ¼ăƒăƒƒăƒˆ", - "billNumber": "法è¦ç•ªå·", - "blogTitle": "ăƒ–ăƒ­ă‚°å", - "bookTitle": "書ç±å", - "callNumber": "図書整ç†ç•ªå·", - "caseName": "事件å", - "code": "ă‚³ăƒ¼ăƒ‰", - "codeNumber": "ă‚³ăƒ¼ăƒ‰ç•ªå·", - "codePages": "ăƒăƒ¼ă‚¸", - "codeVolume": "å·»", - "committee": "委員ä¼", - "company": "ä¼ç¤¾å", - "conferenceName": "å­¦ä¼å", - "country": "国å", - "court": "è£åˆ¤æ‰€", - "date": "出版年月日", - "dateAdded": "è¿½å æ—¥æ™‚", - "dateDecided": "æ±ºå®æœŸæ—¥", - "dateEnacted": "施行期日", - "dateModified": "更新日時", - "dictionaryTitle": "è¾æ›¸å", - "distributor": "é…布ï¼è²©å£²ă—ă¦ă„ă‚‹ä¼ç¤¾", - "docketNumber": "ăƒ‰ă‚±ăƒƒăƒˆç•ªå·", - "documentNumber": "文書番å·", - "DOI": "DOI", - "edition": "版", - "encyclopediaTitle": "百科事典å", - "episodeNumber": "ă‚¨ăƒ”ă‚½ăƒ¼ăƒ‰ă®ç•ªå·", - "extra": "ăă®ä»–", - "filingDate": "出願日", - "firstPage": "最åˆă®ăƒăƒ¼ă‚¸", - "forumTitle": "æ²ç¤ºæ¿ï¼Listserv ă®åç§°", - "genre": "ă‚¸ăƒ£ăƒ³ăƒ«", - "history": "æ­´å²", - "institution": "機関", - "interviewMedium": "ăƒ¡ăƒ‡ă‚£ă‚¢", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "å·", - "issueDate": "発行日", - "issuingAuthority": "発行機関", - "itemType": "種é¡", - "journalAbbreviation": "雑誌略誌å", - "label": "ăƒ¬ăƒ¼ăƒ™ăƒ«", - "language": "言èª", - "legalStatus": "法ç„地ä½", - "legislativeBody": "立法機関", - "letterType": "種é¡", - "libraryCatalog": "書誌情報", - "manuscriptType": "種é¡", - "mapType": "種é¡", - "meetingName": "ä¼è­°å", - "nameOfAct": "法令å", - "network": "ăƒăƒƒăƒˆăƒ¯ăƒ¼ă‚¯", - "number": "番å·", - "numberOfVolumes": "巻数", - "numPages": "#ăƒăƒ¼ă‚¸", - "pages": "ăƒăƒ¼ă‚¸æ•°", - "patentNumber": "特許番å·", - "place": "都市", - "postType": "書ăè¾¼ă¿ă®ç¨®é¡", - "presentationType": "種é¡", - "priorityNumbers": "優先番å·", - "proceedingsTitle": "ç´€è¦å", - "programmingLanguage": "Prog. Language", - "programTitle": "ăƒ—ăƒ­ă‚°ăƒ©ăƒ å", - "publicationTitle": "雑誌", - "publicLawNumber": "法律番å·", - "publisher": "出版社", - "references": "文献", - "reporter": "ăƒ¬ăƒăƒ¼ă‚¿ăƒ¼", - "reporterVolume": "ăƒªăƒăƒ¼ă‚¿ăƒ¼å·»", - "reportNumber": "ăƒ¬ăƒăƒ¼ăƒˆç•ªå·", - "reportType": "ăƒ¬ăƒăƒ¼ăƒˆă®ç¨®é¡", - "rights": "権利", - "runningTime": "çµŒéæ™‚é–“", - "scale": "縮尺", - "section": "ç« ", - "series": "墿›¸", - "seriesNumber": "墿›¸ç•ªå·", - "seriesText": "墿›¸ăƒ†ă‚­ă‚¹ăƒˆ", - "seriesTitle": "墿›¸å", - "session": "ă‚»ăƒƒă‚·ăƒ§ăƒ³", - "shortTitle": "題å(ç•¥)", - "studio": "ă‚¹ă‚¿ă‚¸ă‚ª", - "subject": "話題", - "system": "ă‚·ă‚¹ăƒ†ăƒ ", - "thesisType": "種é¡", - "title": "題å", - "university": "大学å", - "url": "URL", - "versionNumber": "ăƒ´ă‚¡ăƒ¼ă‚¸ăƒ§ăƒ³", - "videoRecordingFormat": "ăƒ•ă‚©ăƒ¼ăƒăƒƒăƒˆ", - "volume": "å·»", - "websiteTitle": "ă‚¦ă‚§ăƒ–ă‚µă‚¤ăƒˆå", - "websiteType": "ă‚¦ă‚§ăƒ–ă‚µă‚¤ăƒˆă®ç¨®é¡" - }, - "creatorTypes": { - "artist": "ă‚¢ăƒ¼ăƒ†ă‚£ă‚¹ăƒˆ", - "attorneyAgent": "å¼è­·å£«ï¼ä»£ç†äºº", - "author": "著者å", - "bookAuthor": "書ç±è‘—者å", - "cartographer": "製図家", - "castMember": "ă‚­ăƒ£ă‚¹ăƒˆ", - "commenter": "è©•è«–å®¶", - "composer": "作曲家", - "contributor": "寄稿者å", - "cosponsor": "å…±åŒă‚¹ăƒăƒ³ă‚µăƒ¼", - "counsel": "è­°ä¼", - "director": "監ç£", - "editor": "編集者å", - "guest": "ă‚²ă‚¹ăƒˆ", - "interviewee": "ă‚¤ăƒ³ă‚¿ăƒ“ăƒ¥ăƒ¼å¯¾è±¡:", - "interviewer": "ă‚¤ăƒ³ă‚¿ăƒ“ăƒ¥ă‚¢ăƒ¼", - "inventor": "発æ˜è€…å", - "performer": "演者", - "podcaster": "ăƒăƒƒăƒ‰ă‚­ăƒ£ă‚¹ăƒˆé€ä¿¡è€…", - "presenter": "発表者", - "producer": "ăƒ—ăƒ­ăƒ‡ăƒ¥ăƒ¼ă‚µăƒ¼", - "programmer": "ăƒ—ăƒ­ă‚°ăƒ©ăƒăƒ¼", - "recipient": "å—å–人", - "reviewedAuthor": "ăƒ¬ăƒ“ăƒ¥ăƒ¼ă•ă‚ŒăŸè‘—者", - "scriptwriter": "è„æœ¬å®¶", - "seriesEditor": "墿›¸ç·¨é›†è€…å", - "sponsor": "ă‚¹ăƒăƒ³ă‚µăƒ¼", - "translator": "翻訳者å", - "wordsBy": "作è©" - } - }, - "km": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "áŸá·á›áŸ’á”ៈ", - "attachment": "á¯á€áŸá¶áá€á˜áŸ’á‡á¶á”់", - "audioRecording": "á្áŸáŸ‚á¢á¶á់áŸáŸ†á¡áŸá„", - "bill": "á‚á˜áŸ’áោá„á…្á”á¶á”់", - "blogPost": "á€á¶áá•្áŸá¶á™á‚áŸá á‘ំá–áŸáá”្á›á»á€", - "book": "áŸáŸ€áœá—ៅ", - "bookSection": "á•្á“ែá€á“ៃáŸáŸ€áœá—ៅ", - "case": "á€ááá¸/áá¿á„á€áŸ’áá¸", - "computerProgram": "Software", - "conferencePaper": "á¯á€áŸá¶ááŸá“្á“á·áŸá¸á‘", - "dictionaryEntry": "áœá…á“á¶á“á»á€áŸ’áá˜", - "document": "á¯á€áŸá¶á", - "email": "áŸá¶áá¢áŸá¡á·á…á្áá¼á“á·á…", - "encyclopediaArticle": "áŸá–្áœáœá…á“á¶á’á·á”្á”á¶á™", - "film": "á—á¶á–á™á“្á", - "forumPost": "á€á¶áá•្áŸá¶á™áœáŸá‘á·á€á¶", - "hearing": "áŸáœá“á¶á€á¶á", - "instantMessage": "áŸá¶áá”á“្á‘á¶á“់", - "interview": "á”á‘áŸá˜áŸ’á—á¶áŸá“áŸ", - "journalArticle": "á¢á្áá”á‘á‘á“á¶á“á»á”្á”áœá្áá·", - "letter": "áŸáŸ†á”á»á្á", - "magazineArticle": "á¢á្áá”á‘á‘áŸáŸ’áŸá“á¶áœá្áá¸", - "manuscript": "á á្áá¶á¢á្áá”á‘", - "map": "á•ែá“á‘á¸", - "newspaperArticle": "á¢á្áá”á‘á€á¶áŸáŸ‚á", - "note": "á€áŸ†áá់á…ំáá¶áŸ†", - "patent": "áá្áá€á˜áŸ’á˜", - "podcast": "á•ááá¶áŸáŸ’ááŸ", - "presentation": "á§á‘្á‘áŸáŸá”á‘", - "radioBroadcast": "á€á˜áŸ’á˜áœá·á’á¸áœá·á‘្á™á»", - "report": "áá”á¶á™á€á¶áááŸ", - "statute": "á…្á”á¶á”់", - "thesis": "á“á·á€áŸ’ááŸá”á”á‘", - "tvBroadcast": "á€á˜áŸ’á˜áœá·á’á¸á‘á¼áá‘áŸáŸ’áŸá“áŸ", - "videoRecording": "á្áŸáŸ‚á¢á¶á់áœá¸ááŸá¢á¼", - "webpage": "á‚áŸá á‘ំá–áŸá" - }, - "fields": { - "abstractNote": "á្á›á¹á˜áŸá¶ááŸá„្ááŸá”", - "accessDate": "á…á¼á›á˜á¾á›", - "applicationNumber": "á–á¶á€áŸ’á™áŸá»áŸ†á›áŸá", - "archive": "á”á្áá¶áŸá¶á", - "archiveLocation": "á‘á¸áá¶áŸ†á„á€áŸ’á“á»á„á”á្áá¶áŸá¶á", - "artworkMedium": "áŸá¶áá–áŸá៌á˜á¶á“", - "artworkSize": "áŸá·á›áŸ’á”ៈ", - "assignee": "á¢áŸ’á“á‘á‘á½á›á—á¶áá€á·á…្á…", - "audioFileType": "á”្áá—áŸá‘á¯á€áŸá¶á", - "audioRecordingFormat": "á‘á˜áŸ’áá„់", - "billNumber": "á›áŸáá‚á˜áŸ’áោá„á…្á”á¶á”់", - "blogTitle": "á…ំáá„á‡á¾á„á‚áŸá á‘ំá–áŸáá”្á›á»á€", - "bookTitle": "á…ំáá„á‡á¾á„áŸáŸ€áœá—ៅ", - "callNumber": "á›áŸáá áŸ…", - "caseName": "á…ំáá„á‡á¾á„á€ááá¸/áá¿á„á€áŸ’áá¸", - "code": "á€áŸ’áá˜", - "codeNumber": "á›áŸáá€áŸ’áá˜", - "codePages": "á‘ំá–áŸáá€áŸ’áá˜", - "codeVolume": "áœáŸ‰á»á›á€áŸ’áá˜", - "committee": "á‚áៈá€á˜áŸ’á˜á¶á’á·á€á¶á", - "company": "á€áŸ’áá»á˜á áŸá»á“", - "conferenceName": "áˆáŸ’á˜áŸ„ះáŸá“្á“á·áŸá¸á‘á€á¶áŸáŸ‚á", - "country": "á”្áá‘áŸáŸ", - "court": "áá»á›á¶á€á¶á", - "date": "á€á¶á›á”áá·á…្á†áŸá‘", - "dateAdded": "á€á¶á›á”áá·á…្á†áŸá‘á”á‰áŸ’á…á¼á›", - "dateDecided": "á€á¶á›á”áá·á…្á†áŸá‘áŸá˜áŸ’ááŸá…", - "dateEnacted": "á€á¶á›á”áá·á…្á†áŸá‘á¢á“á»á˜áŸá", - "dateModified": "á€áŸ‚áá˜áŸ’áá¼áœ", - "dictionaryTitle": "á…ំáá„á‡á¾á„áœá…á“á¶á“á»á€áŸ’áá˜", - "distributor": "á…ែá€á…á¶á™", - "docketNumber": "á›áŸááŸáŸ†áá»áŸ†áá¿á„", - "documentNumber": "á›áŸáá¯á€áŸá¶á", - "DOI": "áŒá¸á¢á¼á¢á¶á™", - "edition": "á€áŸ†áែáá˜áŸ’áá¼áœ", - "encyclopediaTitle": "á…ំáá„á‡á¾á„áŸá–្áœáœá…á“á¶á’á·á”្á”á¶á™", - "episodeNumber": "á›áŸáá¢á„្á‚á áŸáá»", - "extra": "á”á“្áែá˜", - "filingDate": "á€á¶á›á”áá·á…្á†áŸá‘áá˜áŸ’á€á›áŸ‹", - "firstPage": "á‘ំá–áŸáá‘á¸á˜á½á™", - "forumTitle": "á…ំáá„á‡á¾á„áœáŸá‘á·á€á¶", - "genre": "á¢á្ááŸá‰áŸ’á‰á¶áá–á·áŸáŸáŸ", - "history": "á”្ááœá្áá·áŸá¶áŸáŸ’á្á", - "institution": "áŸáŸ’áá¶á”áŸá“", - "interviewMedium": "áŸá¶áá–áŸá៌á˜á¶á“", - "ISBN": "á¢á¶á™á¢áŸáŸá”áŸá¸á¢á·á“", - "ISSN": "á¢á¶á™á¢áŸáŸá¢áŸáŸá¢á·á“", - "issue": "á…áŸá‰á•្áŸá¶á™", - "issueDate": "á€á¶á›á”áá·á…្á†á‘á…áŸá‰á•្áŸá¶á™", - "issuingAuthority": "á¢á¶á‡áŸ’á‰á¶á’áá…áŸá‰á•្áŸá¶á™", - "itemType": "á”្áá—áŸá‘", - "journalAbbreviation": "á–á¶á€áŸ’á™á€á¶á់á‘á“á¶á“á»á”á»áŸ’á”áœá្áá·", - "label": "áŸáŸ’á›á¶á€", - "language": "á—á¶áŸá¶", - "legalStatus": "á›á€áŸ’ááá្áŒá…្á”á¶á”់", - "legislativeBody": "á¢á„្á‚á“á¸áá·á”្á”á‰áŸ’á‰á្áá·", - "letterType": "á”្áá—áŸá‘", - "libraryCatalog": "á€á¶áá¶á¡á»á€á”á្áá¶á›áŸá™", - "manuscriptType": "á”្áá—áŸá‘", - "mapType": "á”្áá—áŸá‘", - "meetingName": "áˆáŸ’á˜áŸ„ះá€á·á…្á…á”្áá‡á»áŸ†", - "nameOfAct": "á…ំáá„á‡á¾á„á…្á”á¶á”់", - "network": "á”á្áá¶á‰", - "number": "á›áŸá", - "numberOfVolumes": "á›áŸááœáŸ‰á»á›", - "numPages": "á›áŸáá‘ំá–áŸá", - "pages": "á‘ំá–áŸá", - "patentNumber": "á›áŸááá្áá€á˜áŸ’á˜", - "place": "á‘á¸áá¶áŸ†á„", - "postType": "á”្áá—áŸá‘á•្áŸá¶á™", - "presentationType": "á”្áá—áŸá‘", - "priorityNumbers": "á›áŸáá¢á¶á‘á·á—á¶á–", - "proceedingsTitle": "á…ំáá„á‡á¾á„á“á¸áá·áœá·á’á¸", - "programmingLanguage": "Prog. Language", - "programTitle": "á…ំáá„á‡á¾á„á€á˜áŸ’á˜áœá·á’á¸", - "publicationTitle": "á”ោះá–á»á˜áŸ’á–á•្áŸá¶á™", - "publicLawNumber": "á›áŸáá…្á”á¶á”់", - "publisher": "á¢áŸ’á“á€á”ោះá–á»á˜áŸ’á–", - "references": "á€áŸ†áá់á™áŸ„á„", - "reporter": "á¢áŸ’á“á€á’្áœá¾áá”á¶á™á€á¶áááŸ", - "reporterVolume": "áœáŸ‰á»á›áá”á¶á™á€á¶áááŸ", - "reportNumber": "á›áŸááá”á¶á™á€á¶áááŸ", - "reportType": "á”្áá—áŸá‘áá”á¶á™á€á¶áááŸ", - "rights": "áŸá·á‘្á’á·", - "runningTime": "á˜áŸ‰áŸ„á„áំáá¾áá€á¶á", - "scale": "á€á˜áŸ’áá·á", - "section": "á•្á“ែá€", - "series": "á›áŸááៀá„", - "seriesNumber": "á›áŸ†áá¶á”់á›áŸááៀá„", - "seriesText": "á¢á្áá”á‘á›áŸááៀá„", - "seriesTitle": "á…ំáá„á‡á¾á„á›áŸááៀá„", - "session": "áŸá˜áŸá™á€á¶á›", - "shortTitle": "á…ំáá„á‡á¾á„á្á›á¸", - "studio": "áŸáŸ’áá¶á“á¸á™áááŸáŸ†á¡áŸá„", - "subject": "á”្áá’á¶á“á”á‘", - "system": "á”្áá–áŸá“្á’", - "thesisType": "á”្áá—áŸá‘", - "title": "á…ំáá„á‡á¾á„", - "university": "áŸá¶á€á›áœá·á‘្á™á¶á›áŸá™", - "url": "á‚áŸá á‘ំá–áŸá", - "versionNumber": "Version", - "videoRecordingFormat": "á‘á˜áŸ’áá„់", - "volume": "áœáŸ‰á»á›", - "websiteTitle": "á…ំáá„á‡á¾á„á‚áŸá á‘ំá–áŸá", - "websiteType": "á”្áá—áŸá‘á‚áŸá á‘ំá–áŸá" - }, - "creatorTypes": { - "artist": "áŸá·á›áŸ’á”á€á", - "attorneyAgent": "á˜áŸá’á¶áœá¸/á—្á“á¶á€áŸ‹á„á¶á", - "author": "á¢áŸ’á“á€á“á·á–á“្á’", - "bookAuthor": "á¢áŸ’á“á€á“á·á–á“្á’áŸáŸ€áœá—ៅ", - "cartographer": "á¢áŸ’á“á€áៀá”á…ំá”្á›á„់", - "castMember": "áá½áŸáŸ†áែá„", - "commenter": "á¢áŸ’á“á€á•្áá›áŸ‹á˜áá·á™áŸ„á”á›áŸ‹", - "composer": "á¢áŸ’á“á€á“á·á–á“្á’á‘ំá“á»á€", - "contributor": "á¢áŸ’á“á€á…á¼á›áá½á˜", - "cosponsor": "áŸá á¢áŸ’á“á€á§á”á្áá˜áŸ’á—", - "counsel": "á€áŸ’áá»á˜á”្áá¹á€áŸ’áŸá¶", - "director": "á“á¶á™á€", - "editor": "á¢áŸ’á“á€á€áŸ‚áá˜áŸ’áá¼áœ", - "guest": "á—្á‰áŸ€áœ", - "interviewee": "áŸá˜áŸ’á—á¶áŸá“áŸá‡á¶á˜á½á™", - "interviewer": "á¢áŸ’á“á€áŸá˜áŸ’á—á¶áŸá“áŸ", - "inventor": "á¢áŸ’á“á€á”á„្á€á¾á", - "performer": "á¢áŸ’á“á€áŸáŸ†áែá„", - "podcaster": "á¢áŸ’á“á€áááŸáŸ†á¡áŸá„á•ááá¶áŸáŸ’ááŸ", - "presenter": "á¢áŸ’á“á€á¢á្áá¶á’á·á”្á”á¶á™", - "producer": "á•á›á·áá€á", - "programmer": "á¢áŸ’á“á€áៀá”á…ំá€á˜áŸ’á˜áœá·á’á¸", - "recipient": "á¢áŸ’á“á€á‘á‘á½á›", - "reviewedAuthor": "á¢áŸ’á“á€á“á·á–á“្á’á្áá½áá–á·á“á·á្á™", - "scriptwriter": "á¢áŸ’á“á€áŸááŸáŸáá¢á្áá”á‘", - "seriesEditor": "á¢áŸ’á“á€á€áŸ‚áá˜áŸ’áá¼áœáá¶á˜á›áŸááៀá„", - "sponsor": "á¢áŸ’á“á€á§á”á្áá˜áŸ’á—", - "translator": "á¢áŸ’á“á€á”á€á”្áែ", - "wordsBy": "á–á¶á€áŸ’á™áោá™" - } - }, - "ko-KR": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "́˜ˆ́ˆ í’ˆ", - "attachment": "́²¨ë¶€", - "audioRecording": "ë…¹́Œ", - "bill": "́˜́•ˆ", - "blogPost": "블로그 게́‹œë¬¼", - "book": "́„œ́ ", - "bookSection": "́±… ́†Œê°œ ë©´", - "case": "́†Œ́†¡", - "computerProgram": "́†Œí”„í¸́›΅–´", - "conferencePaper": "íŒ́˜ë¬¸", - "dictionaryEntry": "́‚¬́ „ 항목", - "document": "문́„œ", - "email": "́´ë©”́¼", - "encyclopediaArticle": "백과́‚¬́ „ 항목", - "film": "́˜í™”", - "forumPost": "토론 게́‹œë¬¼", - "hearing": "ê³µ́²­íŒ", - "instantMessage": "긴급 ë©”́‹œ́§€", - "interview": "́¸í„°ë·°", - "journalArticle": "́ €ë„ 기́‚¬", - "letter": "í¸́§€", - "magazineArticle": "́¡́§€ 기́‚¬", - "manuscript": "́›ê³ ", - "map": "́§€ë„", - "newspaperArticle": "́‹ ë¬¸ 기́‚¬", - "note": "ë…¸í¸", - "patent": "í¹í—ˆ", - "podcast": "팟́º́¤í¸", - "presentation": "발표", - "radioBroadcast": "ë¼ë””́˜¤ ë°©́†¡", - "report": "ë³´ê³ ́„œ", - "statute": "법령", - "thesis": "í•™́œ„논문", - "tvBroadcast": "TV ë°©́†¡", - "videoRecording": "녹화", - "webpage": "́›¹ í˜́´́§€" - }, - "fields": { - "abstractNote": "́”́•½", - "accessDate": "́ ‘ê·¼́¼", - "applicationNumber": "́¶œ́› 번호", - "archive": "́•„́¹´́´ë¸Œ", - "archiveLocation": "́•„́¹´́´ë¸Œ ́œ„́¹˜", - "artworkMedium": "́†Œ́¬Â·ê¸°ë²•", - "artworkSize": "́˜ˆ́ˆ í’ˆ́˜ í¬ê¸°", - "assignee": "́–‘́ˆ˜́¸", - "audioFileType": "파́¼ 형́‹", - "audioRecordingFormat": "형́‹", - "billNumber": "́˜́•ˆ 번호", - "blogTitle": "블로그 ́ œëª©", - "bookTitle": "́±… ́ œëª©", - "callNumber": "ë„́„œ 번호", - "caseName": "́‚¬ê±´ëª…", - "code": "́½”드", - "codeNumber": "́½”드 번호", - "codePages": "법́ „ í˜́´́§€", - "codeVolume": "법́ œëª©", - "committee": "́œ„́›íŒ", - "company": "íŒ́‚¬ëª…", - "conferenceName": "협́˜ 명", - "country": "êµ­ê°€", - "court": "법́›", - "date": "ë‚ ́§œ", - "dateAdded": "́…ë ¥́¼", - "dateDecided": "íŒê²°́¼", - "dateEnacted": "́ œ́ •́¼", - "dateModified": "변경́¼", - "dictionaryTitle": "́‚¬́ „ 명", - "distributor": "배급́", - "docketNumber": "́‚¬ê±´ 번호", - "documentNumber": "문́„œ 번호", - "DOI": "DOI", - "edition": "íŒë³¸", - "encyclopediaTitle": "백과́‚¬́ „ 명", - "episodeNumber": "́—피́†Œë“œ 번호", - "extra": "́¶”ê°€́‚¬í•­", - "filingDate": "Filing Date", - "firstPage": "́²« í˜́´́§€", - "forumTitle": "토론/Listserv ́ œëª©", - "genre": "́¥ë¥´", - "history": "́—­́‚¬", - "institution": "í•™íŒ", - "interviewMedium": "매́²´", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "호", - "issueDate": "발행́¼", - "issuingAuthority": "Issuing Authority", - "itemType": "형́‹", - "journalAbbreviation": "́ €ë„ ́•½́–´", - "label": "ë ˆ́´ë¸”", - "language": "́–¸́–´", - "legalStatus": "법́ ́§€́œ„", - "legislativeBody": "́…법 기관", - "letterType": "형́‹", - "libraryCatalog": "ë„́„œ 목ë¡", - "manuscriptType": "형́‹", - "mapType": "형́‹", - "meetingName": "íŒ́˜ëª…", - "nameOfAct": "법령 ́´ë¦„", - "network": "네í¸́›Œí¬", - "number": "번호", - "numberOfVolumes": "ê¶Œ́ˆ˜", - "numPages": "́´ í˜́´́§€́ˆ˜", - "pages": "́ª½", - "patentNumber": "í¹í—ˆ 번호", - "place": "발행́§€", - "postType": "게́‹œë¬¼ ́¢…류", - "presentationType": "형́‹", - "priorityNumbers": "́°́„  번호", - "proceedingsTitle": "́˜́‚¬ë¡", - "programmingLanguage": "프로그ë˜ë° ́–¸́–´", - "programTitle": "í”„ë¡œê·¸ë¨ ́ œëª©", - "publicationTitle": "ê°„í–‰", - "publicLawNumber": "공법 번호", - "publisher": "́¶œíŒ́‚¬", - "references": "́°¸́¡°", - "reporter": "ë³´ê³ ́", - "reporterVolume": "ë³´ê³ ́„œ ê¶Œ́ˆ˜", - "reportNumber": "ë³´ê³ ́„œ 번호", - "reportType": "ë³´ê³  형́‹", - "rights": "́†Œ́œ ê¶Œ", - "runningTime": "ë™́‘ ́‹œê°„", - "scale": "́¶•́²™", - "section": "구́—­", - "series": "́‹œë¦¬́¦ˆ", - "seriesNumber": "́‹œë¦¬́¦ˆ 번호", - "seriesText": "́‹œë¦¬́¦ˆ í…́¤í¸", - "seriesTitle": "́‹œë¦¬́¦ˆ ́ œëª©", - "session": "́„¸́…˜", - "shortTitle": "́§§́€ ́ œëª©", - "studio": "́¤íœë””́˜¤", - "subject": "ë¶€́ œ", - "system": "́‹œ́¤í…œ", - "thesisType": "형́‹", - "title": "́ œëª©", - "university": "대학", - "url": "URL", - "versionNumber": "버́ „", - "videoRecordingFormat": "형́‹", - "volume": "ê¶Œ", - "websiteTitle": "́›¹́‚¬́´í¸ 명", - "websiteType": "́›¹́‚¬́´í¸ 형́‹" - }, - "creatorTypes": { - "artist": "́˜ˆ́ˆ ê°€", - "attorneyAgent": "변호́‚¬/대리́¸", - "author": "́ €́", - "bookAuthor": "́±… ́ €́", - "cartographer": "́§€ë„ ́ œ́‘́", - "castMember": "́¶œ́—°́", - "commenter": "비í‰ê°€", - "composer": "́‘곡가", - "contributor": "공헌́", - "cosponsor": "Cosponsor", - "counsel": "íŒ́˜", - "director": "ê°ë…", - "editor": "í¸́§‘́", - "guest": "́†ë‹˜", - "interviewee": "́¸í„°ë·°ï¼", - "interviewer": "́¸í„°ë·°́§„í–‰́", - "inventor": "발명́", - "performer": "́—°́£¼́", - "podcaster": "팟́º́¤í„°", - "presenter": "́ œ́¶œ́", - "producer": "́ œ́‘́", - "programmer": "프로그ë˜ë¨¸", - "recipient": "́ˆ˜ë ¹́¸", - "reviewedAuthor": "í‰ë¡ ê°€", - "scriptwriter": "ê°ë³¸ê°€", - "seriesEditor": "́‹œë¦¬́¦ˆ í¸́§‘́", - "sponsor": "후́›́", - "translator": "번́—­́", - "wordsBy": "́‘́‚¬" - } - }, - "lt-LT": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Iliustracija", - "attachment": "Priedas", - "audioRecording": "Garso įraÅ¡as", - "bill": "Ä®statymo projektas", - "blogPost": "TinklaraÅ¡Äio įraÅ¡as", - "book": "Knyga", - "bookSection": "Knygos skyrius", - "case": "Byla", - "computerProgram": "PrograminÄ— įranga", - "conferencePaper": "PraneÅ¡imas konferencijoje", - "dictionaryEntry": "Žodyno įraÅ¡as", - "document": "Dokumentas", - "email": "El. laiÅ¡kas", - "encyclopediaArticle": "Straipsnelis enciklopedijoje", - "film": "Filmas", - "forumPost": "ŽinutÄ— forume", - "hearing": "Bylos nagrinÄ—jimas, svarstymas", - "instantMessage": "ŽinutÄ—", - "interview": "Pokalbis", - "journalArticle": "Žurnalo straipsnis", - "letter": "LaiÅ¡kas", - "magazineArticle": "Periodinio žurnalo straipsnis", - "manuscript": "RankraÅ¡tis", - "map": "ŽemÄ—lapis", - "newspaperArticle": "LaikraÅ¡Äio straipsnis", - "note": "Pastaba", - "patent": "Patentas", - "podcast": "TinklalaidÄ—", - "presentation": "Pateiktis", - "radioBroadcast": "Radijo laida", - "report": "Ataskaita/praneÅ¡imas", - "statute": "Ä®statymas", - "thesis": "Disertacija, baigiamasis darbas", - "tvBroadcast": "TV laida", - "videoRecording": "Vaizdo įraÅ¡as", - "webpage": "Tinklalapis" - }, - "fields": { - "abstractNote": "Santrauka", - "accessDate": "ŽiÅ«rÄ—ta", - "applicationNumber": "PareiÅ¡kimo numeris", - "archive": "Archyvas", - "archiveLocation": "Vieta archyve", - "artworkMedium": "Laikmena", - "artworkSize": "Paveikslo dydis", - "assignee": "Atstovas", - "audioFileType": "Failo tipas", - "audioRecordingFormat": "Formatas", - "billNumber": "Ä®statymo numeris", - "blogTitle": "TinklaraÅ¡Äio pavadinimas", - "bookTitle": "Knygos pavad.", - "callNumber": "Å ifras", - "caseName": "Bylos pavadinimas", - "code": "Kodas", - "codeNumber": "Kodekso numeris", - "codePages": "Puslapiai kodekse", - "codeVolume": "Kodekso tomas", - "committee": "Komisija", - "company": "Ä®monÄ—", - "conferenceName": "Konferencijos pavadinimas", - "country": "ValstybÄ—", - "court": "Teismas", - "date": "Data", - "dateAdded": "PridÄ—ta", - "dateDecided": "Sprendimo data", - "dateEnacted": "Paskelbimo data", - "dateModified": "Pakeista", - "dictionaryTitle": "Žodyno pavadinimas", - "distributor": "Platintojas", - "docketNumber": "Priedo numeris", - "documentNumber": "Dokumento numeris", - "DOI": "DOI", - "edition": "Leidimas, Nr.", - "encyclopediaTitle": "Enciklopedijos pavadinimas", - "episodeNumber": "Epizodo numeris", - "extra": "Papildoma", - "filingDate": "Užpildymo data", - "firstPage": "Pirmas puslapis", - "forumTitle": "Forumo pavadinimas", - "genre": "Žanras", - "history": "Istorija", - "institution": "Ä®staiga", - "interviewMedium": "Laikmena", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Numeris", - "issueDate": "IÅ¡leidimo data", - "issuingAuthority": "IÅ¡davusi įstaiga", - "itemType": "Tipas", - "journalAbbreviation": "Žurnalo santrumpa", - "label": "EtiketÄ—", - "language": "Kalba", - "legalStatus": "Teisinis statusas", - "legislativeBody": "Ä®statymų leidžiamoji valdžia", - "letterType": "Tipas", - "libraryCatalog": "Bibl. katalogas", - "manuscriptType": "Tipas", - "mapType": "Tipas", - "meetingName": "Susitikimo pavadinimas", - "nameOfAct": "Akto pavadinimas", - "network": "Tinklas", - "number": "Numeris", - "numberOfVolumes": "Tomų skaiÄius", - "numPages": "Puslapių kiekis", - "pages": "Puslapiai", - "patentNumber": "Patento numeris", - "place": "Vieta", - "postType": "PraneÅ¡imo tipas", - "presentationType": "Tipas", - "priorityNumbers": "Prioriteto numeris", - "proceedingsTitle": "Ä®vykio pavadinimas", - "programmingLanguage": "Prog. kalba", - "programTitle": "Programos pavadinimas", - "publicationTitle": "Leidinys", - "publicLawNumber": "Oficialaus raÅ¡to numeris", - "publisher": "LeidÄ—jas", - "references": "Nuorodos", - "reporter": "Pranešėjas", - "reporterVolume": "PraneÅ¡imo tomas", - "reportNumber": "PraneÅ¡imo numeris", - "reportType": "PraneÅ¡imo tipas", - "rights": "TeisÄ—s", - "runningTime": "TrukmÄ—", - "scale": "SkalÄ—", - "section": "Skirsnis", - "series": "Serija", - "seriesNumber": "Serijos Nr.", - "seriesText": "Serijos tekstas", - "seriesTitle": "Serijos pavadinimas", - "session": "Sesija", - "shortTitle": "Trumpas pavad.", - "studio": "DirbtuvÄ—/studija", - "subject": "Tema", - "system": "Sistema", - "thesisType": "Tipas", - "title": "Pavadinimas", - "university": "Universitetas", - "url": "URL", - "versionNumber": "Versija", - "videoRecordingFormat": "Formatas", - "volume": "Tomas", - "websiteTitle": "SvetainÄ—s pavadinimas", - "websiteType": "SvetainÄ—s tipas" - }, - "creatorTypes": { - "artist": "Menininkas/aktorius", - "attorneyAgent": "Ä®galiotasis asmuo", - "author": "Autorius", - "bookAuthor": "Knygos autorius", - "cartographer": "Kartografas", - "castMember": "AtlikÄ—jas/artistas", - "commenter": "Komentuotojas", - "composer": "KÅ«rÄ—jas/kompozitorius", - "contributor": "Bendradarbis", - "cosponsor": "Kitas rÄ—mÄ—jas", - "counsel": "Advokatas", - "director": "Vadovas", - "editor": "Redaktorius", - "guest": "SveÄias", - "interviewee": "Pokalbis su", - "interviewer": "ApklausÄ—jas", - "inventor": "iÅ¡radÄ—jas", - "performer": "AtlikÄ—jas", - "podcaster": "Transliuotojas", - "presenter": "VedÄ—jas", - "producer": "Prodiuseris", - "programmer": "Programuotojas", - "recipient": "GavÄ—jas", - "reviewedAuthor": "PeržiÅ«rÄ—tas autorius", - "scriptwriter": "Scenaristas", - "seriesEditor": "Serijos sudarytojas", - "sponsor": "RÄ—mÄ—jas", - "translator": "VertÄ—jas", - "wordsBy": "Žodžiai" - } - }, - "mn-MN": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Artwork", - "attachment": "Đ¥Đ°Đ²ÑÑ€Đ°Đ»Ñ‚", - "audioRecording": "Audio Recording", - "bill": "Bill", - "blogPost": "Đ‘Đ»Đ¾Đ³ Đ±Đ¸Ñ‡Đ»ÑĐ³", - "book": "ĐĐ¾Đ¼", - "bookSection": "ĐĐ¾Đ¼Ñ‹Đ½ Ñ…ÑÑÑĐ³", - "case": "Case", - "computerProgram": "Software", - "conferencePaper": "Đ¥ÑƒÑ€Đ»Ñ‹Đ½ Ó©Đ³̉¯̉¯Đ»ÑĐ»", - "dictionaryEntry": "Dictionary Entry", - "document": "Đ‘Đ°Ñ€Đ¸Đ¼Ñ‚", - "email": "Đ­Đ»ĐµĐºÑ‚Ñ€Đ¾Đ½ ÑˆÑƒÑƒĐ´Đ°Đ½", - "encyclopediaArticle": "Đ¢Đ°Đ¹Đ»Đ±Đ°Ñ€ Ñ‚Đ¾Đ»Đ¸Đ¹Đ½ Ó©Đ³̉¯̉¯Đ»ÑĐ»", - "film": "ĐĐ¸Đ½Đ¾", - "forumPost": "Forum Post", - "hearing": "Hearing", - "instantMessage": "Instant Message", - "interview": "Đ¯Ñ€Đ¸Đ»Ñ†Đ»Đ°Đ³Đ°", - "journalArticle": "Đ¡ÑÑ‚Đ³̉¯̉¯Đ»Đ¸Đ¹Đ½ Ó©Đ³̉¯̉¯Đ»ÑĐ»", - "letter": "Đ—Đ°Ñ…Đ¸Đ°", - "magazineArticle": "Magazine Article", - "manuscript": "Manuscript", - "map": "Đ“Đ°Đ·Ñ€Ñ‹Đ½ Đ·ÑƒÑ€Đ°Đ³", - "newspaperArticle": "Đ¡Đ¾Đ½Đ¸Đ½Ñ‹ Đ½Đ¸Đ¹Ñ‚Đ»ÑĐ»", - "note": "Đ¢ÑĐ¼Đ´ÑĐ³Đ»ÑĐ»", - "patent": "ĐŸĐ°Ñ‚ĐµĐ½Ñ‚", - "podcast": "Podcast", - "presentation": "Presentation", - "radioBroadcast": "Radio Broadcast", - "report": "Đ¢Đ°Đ¹Đ»Đ°Đ½", - "statute": "Statute", - "thesis": "Thesis", - "tvBroadcast": "TV Broadcast", - "videoRecording": "Video Recording", - "webpage": "Đ’Ñб Ñ…ÑƒÑƒĐ´Đ°Ñ" - }, - "fields": { - "abstractNote": "Abstract", - "accessDate": "Accessed", - "applicationNumber": "Application Number", - "archive": "Archive", - "archiveLocation": "Loc. in Archive", - "artworkMedium": "Đ”ÑƒĐ½Đ´", - "artworkSize": "Artwork Size", - "assignee": "Assignee", - "audioFileType": "Đ¤Đ°Đ¹Đ»Ñ‹Đ½ Ñ‚Ó©Ñ€Ó©Đ»", - "audioRecordingFormat": "Format", - "billNumber": "Bill Number", - "blogTitle": "Đ‘Đ»Đ¾Đ³ Đ³Đ°Ñ€Ñ‡Đ¸Đ³", - "bookTitle": "ĐĐ¾Đ¼Ñ‹Đ½ Đ³Đ°Ñ€Ñ‡Đ¸Đ³", - "callNumber": "Call Number", - "caseName": "Case Name", - "code": "ĐĐ¾Đ´", - "codeNumber": "ĐĐ¾Đ´Ñ‹Đ½ Đ´ÑƒĐ³Đ°Đ°Ñ€", - "codePages": "Code Pages", - "codeVolume": "Code Volume", - "committee": "Committee", - "company": "ĐĐ¾Đ¼Đ¿Đ°Đ½Đ¸", - "conferenceName": "Đ¥ÑƒÑ€Đ»Ñ‹Đ½ Đ½ÑÑ€", - "country": "Đ£Đ»Ñ", - "court": "Court", - "date": "ĐĐ½ ÑĐ°Ñ€ Ó©Đ´Ó©Ñ€", - "dateAdded": "Date Added", - "dateDecided": "Date Decided", - "dateEnacted": "Date Enacted", - "dateModified": "Modified", - "dictionaryTitle": "Đ¢Đ¾Đ»ÑŒ Đ±Đ¸Ñ‡Đ³Đ¸Đ¹Đ½ Đ³Đ°Ñ€Ñ‡Đ¸Đ³", - "distributor": "Distributor", - "docketNumber": "Docket Number", - "documentNumber": "Đ‘Đ°Ñ€Đ¸Đ¼Ñ‚ Đ±Đ¸Ñ‡Đ³Đ¸Đ¹Đ½ Đ´ÑƒĐ³Đ°Đ°Ñ€", - "DOI": "DOI", - "edition": "Edition", - "encyclopediaTitle": "ĐÑĐ²Ñ‚ÑÑ€Ñ…Đ¸Đ¹ Ñ‚Đ¾Đ»ÑŒĐ½Ñ‹ Đ³Đ°Ñ€Ñ‡Đ¸Đ³", - "episodeNumber": "Episode Number", - "extra": "Extra", - "filingDate": "Filing Date", - "firstPage": "Đ­Ñ…Đ½Đ¸Đ¹ Ñ…ÑƒÑƒĐ´Đ°Ñ", - "forumTitle": "Forum/Listserv Title", - "genre": "Genre", - "history": "Đ¢̉¯̉¯Ñ…", - "institution": "Đ¥̉¯Ñ€ÑÑĐ»ÑĐ½/ĐĐ»Đ±Đ°Đ½ Đ±Đ°Đ¹Đ³ÑƒÑƒĐ»Đ»Đ°Đ³Đ°", - "interviewMedium": "Đ”ÑƒĐ½Đ´", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Issue", - "issueDate": "Issue Date", - "issuingAuthority": "Issuing Authority", - "itemType": "Đ¢Ó©Ñ€Ó©Đ»", - "journalAbbreviation": "Journal Abbr", - "label": "Đ¨Đ¾ÑˆĐ³Đ¾", - "language": "Đ¥ÑĐ»", - "legalStatus": "Legal Status", - "legislativeBody": "Legislative Body", - "letterType": "Đ¢Ó©Ñ€Ó©Đ»", - "libraryCatalog": "Library Catalog", - "manuscriptType": "Đ¢Ó©Ñ€Ó©Đ»", - "mapType": "Đ¢Ó©Ñ€Ó©Đ»", - "meetingName": "Đ£ÑƒĐ»Đ·Đ°Đ»Ñ‚Ñ‹Đ½ Đ½ÑÑ€", - "nameOfAct": "Name of Act", - "network": "Đ¡̉¯Đ»Đ¶ÑÑ", - "number": "Đ¢Đ¾Đ¾", - "numberOfVolumes": "# of Volumes", - "numPages": "# of Pages", - "pages": "Đ¥ÑƒÑƒĐ´Đ°ÑÑƒÑƒĐ´", - "patentNumber": "ĐŸĐ°Ñ‚ĐµĐ½Ñ‚Ñ‹Đ½ Đ´ÑƒĐ³Đ°Đ°Ñ€", - "place": "Place", - "postType": "Đ‘Đ¸Ñ‡Đ»ÑĐ³Đ¸Đ¹Đ½ Ñ‚Ó©Ñ€Ó©Đ»", - "presentationType": "Đ¢Ó©Ñ€Ó©Đ»", - "priorityNumbers": "Priority Numbers", - "proceedingsTitle": "Proceedings Title", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "Đ¥ÑĐ²Đ»ÑĐ»", - "publicLawNumber": "Public Law Number", - "publisher": "Đ¥ÑĐ²Đ»ÑĐ³Ñ‡", - "references": "References", - "reporter": "Reporter", - "reporterVolume": "Reporter Volume", - "reportNumber": "Đ¢Đ°Đ¹Đ»Đ°Đ½Đ³Đ¸Đ¹Đ½ Đ´ÑƒĐ³Đ°Đ°Ñ€", - "reportType": "Đ¢Đ°Đ¹Đ»Đ°Đ½Đ³Đ¸Đ¹Đ½ Ñ‚Ó©Ñ€Ó©Đ»", - "rights": "Đ­Ñ€Ñ…̉¯̉¯Đ´", - "runningTime": "Running Time", - "scale": "ĐœĐ°ÑÑˆÑ‚Đ°Đ±", - "section": "Section", - "series": "Series", - "seriesNumber": "Series Number", - "seriesText": "Series Text", - "seriesTitle": "Series Title", - "session": "Session", - "shortTitle": "Đ‘Đ¾Đ³Đ¸Đ½Đ¾ Đ³Đ°Ñ€Ñ‡Đ¸Đ³", - "studio": "Studio", - "subject": "Subject", - "system": "Đ¡Đ¸ÑÑ‚ĐµĐ¼", - "thesisType": "Đ¢Ó©Ñ€Ó©Đ»", - "title": "Đ“Đ°Ñ€Ñ‡Đ¸Đ³", - "university": "Đ˜Ñ… ÑÑƒÑ€Đ³ÑƒÑƒĐ»ÑŒ", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volume", - "websiteTitle": "Đ’Ñб ÑĐ°Đ¹Ñ‚Ñ‹Đ½ Đ³Đ°Ñ€Ñ‡Đ¸Đ³", - "websiteType": "Đ’Ñб ÑĐ°Đ¹Ñ‚Ñ‹Đ½ Ñ‚Ó©Ñ€Ó©Đ»" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Attorney/Agent", - "author": "Đ—Đ¾Ñ…Đ¸Đ¾Đ³Ñ‡", - "bookAuthor": "Book Author", - "cartographer": "Cartographer", - "castMember": "Cast Member", - "commenter": "Commenter", - "composer": "Composer", - "contributor": "Contributor", - "cosponsor": "Cosponsor", - "counsel": "Counsel", - "director": "Đ—Đ°Ñ…Đ¸Ñ€Đ°Đ»", - "editor": "Editor", - "guest": "Guest", - "interviewee": "Interview With", - "interviewer": "Interviewer", - "inventor": "Inventor", - "performer": "Performer", - "podcaster": "Podcaster", - "presenter": "Presenter", - "producer": "Producer", - "programmer": "Programmer", - "recipient": "Recipient", - "reviewedAuthor": "Reviewed Author", - "scriptwriter": "Scriptwriter", - "seriesEditor": "Series Editor", - "sponsor": "Đ˜Đ²ÑÑĐ½ Ñ‚ÑÑ‚Đ³ÑĐ³Ñ‡", - "translator": "ĐÑ€Ñ‡ÑƒÑƒĐ»Đ°Đ³Ñ‡", - "wordsBy": "Words By" - } - }, - "nb-NO": { - "itemTypes": { - "annotation": "Merknad", - "artwork": "Kunstverk", - "attachment": "Vedlegg", - "audioRecording": "Lydopptak", - "bill": "Lovforslag", - "blogPost": "Blogginnlegg", - "book": "Bok", - "bookSection": "Del av bok", - "case": "Sak", - "computerProgram": "Programvare", - "conferencePaper": "Konferanseinnlegg", - "dictionaryEntry": "Oppslag i ordbok", - "document": "Dokument", - "email": "E-post", - "encyclopediaArticle": "Artikkel i oppslagsverk", - "film": "Film", - "forumPost": "Foruminnlegg", - "hearing": "Høring", - "instantMessage": "Hurtigmelding", - "interview": "Intervju", - "journalArticle": "Tidsskriftsartikkel", - "letter": "Brev", - "magazineArticle": "Magasinartikkel", - "manuscript": "Manuskript", - "map": "Kart", - "newspaperArticle": "Avisartikkel", - "note": "Notat", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Presentasjon", - "radioBroadcast": "Radiosending", - "report": "Rapport", - "statute": "Statutt", - "thesis": "Avhandling", - "tvBroadcast": "TV-sending", - "videoRecording": "Videoopptak", - "webpage": "Nettside" - }, - "fields": { - "abstractNote": "Sammendrag", - "accessDate": "Lest", - "applicationNumber": "Programvarenummer", - "archive": "Arkiv", - "archiveLocation": "Lokalisering i arkiv", - "artworkMedium": "Medium", - "artworkSize": "Kunstverk-størrelse", - "assignee": "Fullmektig", - "audioFileType": "Filtype", - "audioRecordingFormat": "Format", - "billNumber": "Lov-nummer", - "blogTitle": "Bloggtittel", - "bookTitle": "Boktittel", - "callNumber": "Plass-signatur", - "caseName": "Saksnavn", - "code": "Kode", - "codeNumber": "Tekst nummer", - "codePages": "Sider i tekst", - "codeVolume": "Lov-volum", - "committee": "KomitĂ©", - "company": "Selskap", - "conferenceName": "Konferansens navn", - "country": "Land", - "court": "Rett", - "date": "Dato", - "dateAdded": "Dato lagt til", - "dateDecided": "Avgjort (dato)", - "dateEnacted": "Innført (dato)", - "dateModified": "Endret", - "dictionaryTitle": "Ordbok", - "distributor": "Distributør", - "docketNumber": "Registreringsnummer", - "documentNumber": "Dokumentnummer", - "DOI": "DOI", - "edition": "Utgave", - "encyclopediaTitle": "Oppslagverk", - "episodeNumber": "Episodenummer", - "extra": "Ekstra", - "filingDate": "Innleveringsdato", - "firstPage": "Første side", - "forumTitle": "Forum-/listserv-tittel", - "genre": "Sjanger", - "history": "Historie", - "institution": "Institusjon", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Nummer", - "issueDate": "Kjennelsesdato", - "issuingAuthority": "Utstedende myndighet", - "itemType": "Type", - "journalAbbreviation": "Tidsskriftsforkortelse", - "label": "Plateselskap", - "language": "SprĂ¥k", - "legalStatus": "Rettslig status", - "legislativeBody": "Lovgivende organ", - "letterType": "Type", - "libraryCatalog": "Bibliotekskatalog", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Møtenavn", - "nameOfAct": "Navn pĂ¥ loven", - "network": "Nettverk", - "number": "Nummer", - "numberOfVolumes": "# av volumer", - "numPages": "# av sider", - "pages": "Sider", - "patentNumber": "Patentnummer", - "place": "Sted", - "postType": "Posttype", - "presentationType": "Type", - "priorityNumbers": "Prioritetsnummer", - "proceedingsTitle": "Sakstittel", - "programmingLanguage": "ProgrammeringssprĂ¥k", - "programTitle": "Program tittel", - "publicationTitle": "Publikasjon", - "publicLawNumber": "Offentlig lov, nummer", - "publisher": "Utgiver", - "references": "Referanser", - "reporter": "Reporter", - "reporterVolume": "Reporter volum", - "reportNumber": "Rapportnummer", - "reportType": "Rapporttype", - "rights": "Rettigheter", - "runningTime": "Lengde", - "scale": "Skala", - "section": "Seksjon", - "series": "Serie", - "seriesNumber": "Serienummer", - "seriesText": "Serietekst", - "seriesTitle": "Serietittel", - "session": "Sesjon", - "shortTitle": "Kort tittel", - "studio": "Studio", - "subject": "Emne", - "system": "System", - "thesisType": "Type", - "title": "Tittel", - "university": "Universitet", - "url": "URL", - "versionNumber": "Versjon", - "videoRecordingFormat": "Format", - "volume": "Volum", - "websiteTitle": "Nettsidens tittel", - "websiteType": "Nettstedtype" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Advokat/Agent", - "author": "Forfatter", - "bookAuthor": "Bokforfatter", - "cartographer": "Kartograf", - "castMember": "Skuespiller", - "commenter": "Kommentator", - "composer": "Komponist", - "contributor": "Medforfatter", - "cosponsor": "Medsponsor", - "counsel": "RĂ¥dgiver", - "director": "Instruktør", - "editor": "Redaktør", - "guest": "Gjest", - "interviewee": "Intervju med", - "interviewer": "Intervjuer", - "inventor": "Oppfinner", - "performer": "Utøver", - "podcaster": "Podcaster", - "presenter": "Presentatør", - "producer": "Produsent", - "programmer": "Programmerer", - "recipient": "Mottaker", - "reviewedAuthor": "Anmeldt forfatter", - "scriptwriter": "Manusforfatter", - "seriesEditor": "Serieredaktør", - "sponsor": "Sponsor", - "translator": "Oversetter", - "wordsBy": "Tekster av" - } - }, - "nl-NL": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Kunstwerk", - "attachment": "Bijlage", - "audioRecording": "Geluidsopname", - "bill": "Kamerstukken / Handelingen / Wetsvoorstel", - "blogPost": "Blogbericht", - "book": "Boek", - "bookSection": "Boek-sectie", - "case": "Rechtszaak", - "computerProgram": "Software", - "conferencePaper": "Conferentiebijdrage", - "dictionaryEntry": "Lemma", - "document": "Document", - "email": "E-mail", - "encyclopediaArticle": "Encyclopedie-artikel", - "film": "Film", - "forumPost": "Forumbericht", - "hearing": "Hoorzitting", - "instantMessage": "Instant message", - "interview": "Interview", - "journalArticle": "Artikel in academisch tijdschrift", - "letter": "Brief", - "magazineArticle": "Artikel in magazine", - "manuscript": "Manuscript", - "map": "Kaart", - "newspaperArticle": "Krantenartikel", - "note": "Aantekening", - "patent": "Patent / Octrooi", - "podcast": "Podcast", - "presentation": "Presentatie", - "radioBroadcast": "Radio-uitzending", - "report": "Rapport", - "statute": "Wet", - "thesis": "Proefschrift", - "tvBroadcast": "Televisie-uitzending", - "videoRecording": "Video-opname", - "webpage": "Webpagina" - }, - "fields": { - "abstractNote": "Samenvatting", - "accessDate": "Geraadpleegd", - "applicationNumber": "Aanvraagnummer", - "archive": "Archief", - "archiveLocation": "Locatie in archief", - "artworkMedium": "Medium", - "artworkSize": "Afmetingen kunstwerk", - "assignee": "Rechthebbende", - "audioFileType": "Bestandstype", - "audioRecordingFormat": "Formaat", - "billNumber": "(Dossier)nummer", - "blogTitle": "Titel blog", - "bookTitle": "Boektitel", - "callNumber": "Indexnummer", - "caseName": "Naam rechtszaak", - "code": "Publicatiemedium", - "codeNumber": "... tranche van wet", - "codePages": "Nummer (binnen dossier)", - "codeVolume": "Wetgevingsjaargang", - "committee": "Commissie", - "company": "Bedrijf", - "conferenceName": "Conferentienaam", - "country": "Land", - "court": "Rechtbank", - "date": "Datum", - "dateAdded": "Datum toegevoegd", - "dateDecided": "Datum beslissing", - "dateEnacted": "Datum publicatie", - "dateModified": "Bewerkt", - "dictionaryTitle": "Woordenboek-titel", - "distributor": "Distributeur", - "docketNumber": "ECLI / Zaaknummer", - "documentNumber": "Documentnummer", - "DOI": "DOI", - "edition": "Druk", - "encyclopediaTitle": "Encyclopedie-titel", - "episodeNumber": "Afleveringsnummer", - "extra": "Extra", - "filingDate": "Indieningsdatum", - "firstPage": "Eerste pagina", - "forumTitle": "Naam forum", - "genre": "Genre", - "history": "Geschiedenis", - "institution": "(Onderzoeks)instituut", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Editie", - "issueDate": "Publicatiedatum", - "issuingAuthority": "Uitgevende authoriteit", - "itemType": "Type", - "journalAbbreviation": "Tijdschrift-afkorting", - "label": "Label", - "language": "Taal", - "legalStatus": "Wettelijke status", - "legislativeBody": "(Wetgevend) orgaan", - "letterType": "Type", - "libraryCatalog": "Bibliotheekscatalogus", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Naam bijeenkomst", - "nameOfAct": "Citeertitel wet", - "network": "Netwerk", - "number": "Nummer", - "numberOfVolumes": "# delen", - "numPages": "Aantal pagina's", - "pages": "Pagina's", - "patentNumber": "Patentnummer", - "place": "Plaats", - "postType": "Type post", - "presentationType": "Type", - "priorityNumbers": "Prioriteitsnummers", - "proceedingsTitle": "Titel notulen", - "programmingLanguage": "Prog. taal", - "programTitle": "Programmatitel", - "publicationTitle": "Titel uitgave", - "publicLawNumber": "Public Law Number", - "publisher": "Uitgever", - "references": "Verwijzingen", - "reporter": "Jurisprudentietijdschrift", - "reporterVolume": "Jaargang(, Editie)", - "reportNumber": "Nummer (van het rapport)", - "reportType": "Rapport-type", - "rights": "Rechten", - "runningTime": "Duur", - "scale": "Schaal", - "section": "Sectie", - "series": "Reeks", - "seriesNumber": "Nummer (binnen de reeks)", - "seriesText": "Reeks (extra tekst)", - "seriesTitle": "Titel van de reeks", - "session": "Sessie", - "shortTitle": "Korte Titel", - "studio": "Studio", - "subject": "Onderwerp", - "system": "Systeem", - "thesisType": "Type", - "title": "Titel", - "university": "Universiteit", - "url": "URL", - "versionNumber": "Versie", - "videoRecordingFormat": "Formaat", - "volume": "Deel", - "websiteTitle": "Titel webpagina", - "websiteType": "Type website" - }, - "creatorTypes": { - "artist": "Kunstenaar", - "attorneyAgent": "Advocaat/Agent", - "author": "Auteur", - "bookAuthor": "Auteur van het boek", - "cartographer": "Cartograaf", - "castMember": "Cast-member", - "commenter": "Commentator", - "composer": "Componist", - "contributor": "Coauteur", - "cosponsor": "Cosponsor", - "counsel": "Raad", - "director": "Regisseur", - "editor": "Redacteur", - "guest": "Gast", - "interviewee": "Interview met", - "interviewer": "Interviewer", - "inventor": "Uitvinder", - "performer": "Uitvoerder", - "podcaster": "Podcaster", - "presenter": "Presentator", - "producer": "Producent", - "programmer": "Programmeur", - "recipient": "Ontvanger", - "reviewedAuthor": "Besproken auteur", - "scriptwriter": "Tekstschrijver", - "seriesEditor": "Redacteur van de reeks", - "sponsor": "Sponsor", - "translator": "Vertaler", - "wordsBy": "Tekst door" - } - }, - "nn-NO": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Kunstverk", - "attachment": "Vedlegg", - "audioRecording": "Lydopptak", - "bill": "Lovforslag", - "blogPost": "Blogginnlegg", - "book": "Bok", - "bookSection": "Del av bok", - "case": "Sak", - "computerProgram": "Software", - "conferencePaper": "Konferanseinnlegg", - "dictionaryEntry": "Ordbokoppslag", - "document": "Dokument", - "email": "E-post", - "encyclopediaArticle": "Artikkel i oppslagsverk", - "film": "Film", - "forumPost": "Foruminnlegg", - "hearing": "Høyring", - "instantMessage": "Snøggmelding", - "interview": "Intervju", - "journalArticle": "Tidsskriftartikkel", - "letter": "Brev", - "magazineArticle": "Magasinartikkel", - "manuscript": "Manuskript", - "map": "Kart", - "newspaperArticle": "Avisartikkel", - "note": "Notat", - "patent": "Patent", - "podcast": "Podkast", - "presentation": "Presentasjon", - "radioBroadcast": "Radiosending", - "report": "Rapport", - "statute": "Statutt", - "thesis": "Avhandling", - "tvBroadcast": "TV-sending", - "videoRecording": "Videoopptak", - "webpage": "Nettside" - }, - "fields": { - "abstractNote": "Samandrag", - "accessDate": "Lest", - "applicationNumber": "Program-nummer", - "archive": "Arkiv\\n", - "archiveLocation": "Lokalisering i arkiv", - "artworkMedium": "Medium", - "artworkSize": "Kunstverk-storleik", - "assignee": "Fullmektig", - "audioFileType": "Filtype", - "audioRecordingFormat": "Format", - "billNumber": "Lov-nummer", - "blogTitle": "Bloggtittel", - "bookTitle": "Boktittel", - "callNumber": "Plass-signatur", - "caseName": "Saksnamn", - "code": "Kode", - "codeNumber": "Tekst nummer", - "codePages": "Sider i tekst", - "codeVolume": "Lov-volum", - "committee": "KomitĂ©", - "company": "Selskap", - "conferenceName": "Namnet pĂ¥ konferansen", - "country": "Land", - "court": "Rett", - "date": "Dato", - "dateAdded": "Lagt til", - "dateDecided": "Avgjort (dato)", - "dateEnacted": "Innført (dato)", - "dateModified": "Sist endra", - "dictionaryTitle": "Ordbok", - "distributor": "Distributør", - "docketNumber": "Docket Number", - "documentNumber": "Dokumentnummer", - "DOI": "DOI", - "edition": "UtgĂ¥ve", - "encyclopediaTitle": "Oppslagverk", - "episodeNumber": "Episodenummer", - "extra": "Ekstra", - "filingDate": "Arkiveringsdato", - "firstPage": "Første side", - "forumTitle": "Forum-/listserv-tittel", - "genre": "Sjanger", - "history": "Historie", - "institution": "Institusjon", - "interviewMedium": "Medium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Nummer", - "issueDate": "Kjennelsesdato", - "issuingAuthority": "Issuing Authority", - "itemType": "Type", - "journalAbbreviation": "Tidsskriftforkorting", - "label": "Plateselskap", - "language": "SprĂ¥k", - "legalStatus": "Rettsleg status", - "legislativeBody": "Lovgjevande organ", - "letterType": "Type", - "libraryCatalog": "Bibliotek-katalog", - "manuscriptType": "Type", - "mapType": "Type", - "meetingName": "Møtenamn", - "nameOfAct": "Namn pĂ¥ lova", - "network": "Nettverk", - "number": "Nummer", - "numberOfVolumes": "# av volum", - "numPages": "Tal sider", - "pages": "Sidetal", - "patentNumber": "Patentnummer", - "place": "Stad", - "postType": "Posttype", - "presentationType": "Type", - "priorityNumbers": "Prioritetnummer", - "proceedingsTitle": "Sakstittel", - "programmingLanguage": "Prog. Language", - "programTitle": "Programtittel", - "publicationTitle": "Publikasjon", - "publicLawNumber": "Offentleg lov, nummer", - "publisher": "Utgjevar", - "references": "Referansar", - "reporter": "Reporter", - "reporterVolume": "Reporter volum", - "reportNumber": "Rapportnummer", - "reportType": "Rapporttype", - "rights": "Rettar", - "runningTime": "Lengd", - "scale": "Skala", - "section": "Seksjon", - "series": "Serie", - "seriesNumber": "Serienummer", - "seriesText": "Serietekst", - "seriesTitle": "Serietittel", - "session": "Sesjon", - "shortTitle": "Kort tittel", - "studio": "Studio", - "subject": "Emne", - "system": "System", - "thesisType": "Type", - "title": "Tittel", - "university": "Universitet", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Volum", - "websiteTitle": "Nettstadtittel", - "websiteType": "Nettstadtype" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Advokat/Agent", - "author": "Forfattar", - "bookAuthor": "Bokforfattar", - "cartographer": "Kartograf", - "castMember": "Skodespelar", - "commenter": "Kommentator", - "composer": "Komponist", - "contributor": "Medforfatter", - "cosponsor": "Medsponsor", - "counsel": "RĂ¥dgjevar", - "director": "Instruktør", - "editor": "Redaktør", - "guest": "Gjest", - "interviewee": "Intervju med", - "interviewer": "Intervjuar", - "inventor": "Oppfinnar", - "performer": "Utøvar", - "podcaster": "Podkastar", - "presenter": "Presentatør", - "producer": "Produsent", - "programmer": "Programmerar", - "recipient": "Mottakar", - "reviewedAuthor": "Meld forfattar", - "scriptwriter": "Manusforfattar", - "seriesEditor": "Serieredaktør", - "sponsor": "Sponsor", - "translator": "Omsetjar", - "wordsBy": "Tekstar av" - } - }, - "pl-PL": { - "itemTypes": { - "annotation": "Adnotacja", - "artwork": "DzieÅ‚o sztuki", - "attachment": "Załącznik", - "audioRecording": "Nagranie audio", - "bill": "Projekt ustawy", - "blogPost": "Wpis w blogu", - "book": "Książka", - "bookSection": "RozdziaÅ‚", - "case": "Sprawa sÄ…dowa", - "computerProgram": "Oprogramowanie", - "conferencePaper": "MateriaÅ‚ konferencyjny", - "dictionaryEntry": "HasÅ‚o sÅ‚ownikowe", - "document": "Dokument", - "email": "E-mail", - "encyclopediaArticle": "ArtykuÅ‚ w encyklopedii", - "film": "Film", - "forumPost": "Wpis na forum", - "hearing": "Rozprawa", - "instantMessage": "KrĂ³tka wiadomość", - "interview": "Wywiad", - "journalArticle": "ArtykuÅ‚ z czasopisma", - "letter": "List", - "magazineArticle": "ArtykuÅ‚ z magazynu", - "manuscript": "RÄ™kopis", - "map": "Mapa", - "newspaperArticle": "ArtykuÅ‚ z gazety", - "note": "Notatka", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Prezentacja", - "radioBroadcast": "Audycja radiowa", - "report": "Raport", - "statute": "Statut", - "thesis": "Praca dyplomowa", - "tvBroadcast": "Program telewizyjny", - "videoRecording": "Nagranie wideo", - "webpage": "Strona internetowa" - }, - "fields": { - "abstractNote": "KrĂ³tki opis", - "accessDate": "DostÄ™p", - "applicationNumber": "Numer zgÅ‚oszenia", - "archive": "Archiwum", - "archiveLocation": "Miejsce w archiwum", - "artworkMedium": "Technika", - "artworkSize": "Wielkość dzieÅ‚a", - "assignee": "Beneficjent", - "audioFileType": "Typ pliku", - "audioRecordingFormat": "Format", - "billNumber": "Numer projektu ustawy", - "blogTitle": "TytuÅ‚ blogu", - "bookTitle": "TytuÅ‚ książki", - "callNumber": "Nr klasyfikacyjny", - "caseName": "TytuÅ‚ sprawy", - "code": "Kod", - "codeNumber": "Numer kodu", - "codePages": "Kod stron", - "codeVolume": "Kod tomu", - "committee": "Komitet", - "company": "Firma", - "conferenceName": "Nazwa konferencji", - "country": "Kraj", - "court": "SÄ…d", - "date": "Data", - "dateAdded": "Data dodania", - "dateDecided": "Data decyzji", - "dateEnacted": "Data wydania", - "dateModified": "Zmodyfikowany", - "dictionaryTitle": "TytuÅ‚ sÅ‚ownika", - "distributor": "Dystrybutor", - "docketNumber": "Numer wokandy", - "documentNumber": "Numer dokumentu", - "DOI": "DOI", - "edition": "Wydanie", - "encyclopediaTitle": "TytuÅ‚ encyklopedii", - "episodeNumber": "Numer odcinka", - "extra": "Dodatkowe", - "filingDate": "Data wypeÅ‚nienia", - "firstPage": "Pierwsza strona", - "forumTitle": "Nazwa Forum/Listserv", - "genre": "Rodzaj", - "history": "Historia", - "institution": "Instytucja", - "interviewMedium": "NoÅ›nik", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Numer", - "issueDate": "Data wydania", - "issuingAuthority": "Organ wydajÄ…cy", - "itemType": "Typ", - "journalAbbreviation": "SkrĂ³t czasopisma", - "label": "Etykieta", - "language": "JÄ™zyk", - "legalStatus": "Status prawny", - "legislativeBody": "CiaÅ‚o ustawodawcze", - "letterType": "Typ", - "libraryCatalog": "UsÅ‚uga katalogowa", - "manuscriptType": "Typ", - "mapType": "Typ", - "meetingName": "Nazwa spotkania", - "nameOfAct": "TytuÅ‚ aktu", - "network": "Sieć", - "number": "Numer", - "numberOfVolumes": "Liczba tomĂ³w", - "numPages": "Liczba stron", - "pages": "Strony", - "patentNumber": "Numer patentu", - "place": "Miejsce", - "postType": "Typ wpisu", - "presentationType": "Typ", - "priorityNumbers": "Numery priorytetu", - "proceedingsTitle": "TytuÅ‚ sprawozdania", - "programmingLanguage": "JÄ™z. programowania", - "programTitle": "TytuÅ‚ programu", - "publicationTitle": "Publikacja", - "publicLawNumber": "Numer prawa publicznego", - "publisher": "Wydawca", - "references": "Referencje", - "reporter": "ZbiĂ³r orzecznictwa", - "reporterVolume": "Tom w zbiorze orzecznictwa", - "reportNumber": "Numer raportu", - "reportType": "Typ raportu", - "rights": "Przepisy/Prawa", - "runningTime": "Czas trwania", - "scale": "Skala", - "section": "Sekcja", - "series": "Seria", - "seriesNumber": "Numer serii", - "seriesText": "Tekst serii", - "seriesTitle": "TytuÅ‚ serii", - "session": "Sesja", - "shortTitle": "KrĂ³tki tytuÅ‚", - "studio": "Studio", - "subject": "Temat", - "system": "System", - "thesisType": "Typ", - "title": "TytuÅ‚", - "university": "Uniwersytet", - "url": "Adres URL", - "versionNumber": "Wersja", - "videoRecordingFormat": "Format", - "volume": "Tom", - "websiteTitle": "TytuÅ‚ strony", - "websiteType": "Typ witryny" - }, - "creatorTypes": { - "artist": "Artysta", - "attorneyAgent": "Adwokat/Agent", - "author": "Autor", - "bookAuthor": "Autor książki", - "cartographer": "Kartograf", - "castMember": "Aktor", - "commenter": "Komentator", - "composer": "Kompozytor", - "contributor": "WspĂ³Å‚autor", - "cosponsor": "WspĂ³Å‚sponsor", - "counsel": "Prawnik", - "director": "Reżyser", - "editor": "Redaktor", - "guest": "Gość", - "interviewee": "Wywiad z", - "interviewer": "ProwadzÄ…cy wywiad", - "inventor": "Wynalazca", - "performer": "OdtwĂ³rca", - "podcaster": "Autor podcastu", - "presenter": "Prezenter", - "producer": "Producent", - "programmer": "Programista", - "recipient": "Odbiorca", - "reviewedAuthor": "Autor recenzji", - "scriptwriter": "Scenarzysta", - "seriesEditor": "Redaktor serii", - "sponsor": "Fundator", - "translator": "TÅ‚umacz", - "wordsBy": "Autor sÅ‚Ă³w" - } - }, - "pt-BR": { - "itemTypes": { - "annotation": "AnotaĂ§Ă£o", - "artwork": "Obra de arte", - "attachment": "Anexo", - "audioRecording": "GravaĂ§Ă£o de Ă¡udio", - "bill": "LegislaĂ§Ă£o", - "blogPost": "Envio de blog", - "book": "Livro", - "bookSection": "SeĂ§Ă£o de livro", - "case": "Caso", - "computerProgram": "Programa", - "conferencePaper": "ConferĂªncia", - "dictionaryEntry": "Verbete de dicionĂ¡rio", - "document": "Documento", - "email": "Correio eletrĂ´nico", - "encyclopediaArticle": "Verbete de enciclopĂ©dia", - "film": "Filme", - "forumPost": "Envio de fĂ³rum", - "hearing": "AudiĂªncia", - "instantMessage": "Mensagem instantĂ¢nea", - "interview": "Entrevista", - "journalArticle": "Artigo de periĂ³dico", - "letter": "Carta", - "magazineArticle": "Artigo de revista", - "manuscript": "Manuscrito", - "map": "Mapa", - "newspaperArticle": "Artigo de jornal", - "note": "Nota", - "patent": "Patente", - "podcast": "Podcast", - "presentation": "ApresentaĂ§Ă£o", - "radioBroadcast": "TransmissĂ£o de rĂ¡dio", - "report": "RelatĂ³rio", - "statute": "Estatuto", - "thesis": "Tese", - "tvBroadcast": "TransmissĂ£o de TV", - "videoRecording": "GravaĂ§Ă£o de vĂ­deo", - "webpage": "PĂ¡gina web" - }, - "fields": { - "abstractNote": "Resumo", - "accessDate": "Data de acesso", - "applicationNumber": "NĂºmero da inscriĂ§Ă£o", - "archive": "Arquivo", - "archiveLocation": "LocalizaĂ§Ă£o no arquivo", - "artworkMedium": "Suporte", - "artworkSize": "Dimensões", - "assignee": "BeneficiĂ¡rio", - "audioFileType": "Tipo de arquivo", - "audioRecordingFormat": "Formato", - "billNumber": "NĂºmero da lei", - "blogTitle": "TĂ­tulo do blog", - "bookTitle": "TĂ­tulo do livro", - "callNumber": "NĂºmero de chamada", - "caseName": "Nome do caso", - "code": "CĂ³digo", - "codeNumber": "NĂºmero de cĂ³digo", - "codePages": "PĂ¡ginas do cĂ³digo", - "codeVolume": "Volume do cĂ³digo", - "committee": "ComitĂª", - "company": "Companhia", - "conferenceName": "Nome da conferĂªncia", - "country": "PaĂ­s", - "court": "Corte", - "date": "Data", - "dateAdded": "Data de adiĂ§Ă£o", - "dateDecided": "Data da decisĂ£o", - "dateEnacted": "Data de aprovaĂ§Ă£o", - "dateModified": "Data de modificaĂ§Ă£o", - "dictionaryTitle": "TĂ­tulo do dicionĂ¡rio", - "distributor": "Distribuidor", - "docketNumber": "NĂºmero da ata", - "documentNumber": "NĂºmero do documento", - "DOI": "DOI", - "edition": "NĂºmero da ediĂ§Ă£o", - "encyclopediaTitle": "TĂ­tulo da enciclopĂ©dia", - "episodeNumber": "NĂºmero do episĂ³dio", - "extra": "Extra", - "filingDate": "Data de arquivamento", - "firstPage": "Primeira pĂ¡gina", - "forumTitle": "TĂ­tulo do fĂ³rum", - "genre": "GĂªnero", - "history": "HistĂ³rico", - "institution": "InstituiĂ§Ă£o", - "interviewMedium": "Suporte", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "EdiĂ§Ă£o", - "issueDate": "Data da ediĂ§Ă£o", - "issuingAuthority": "Autoridade emissora", - "itemType": "Tipo", - "journalAbbreviation": "Abreviatura do periĂ³dico", - "label": "Etiqueta", - "language": "Idioma", - "legalStatus": "Estatuto legal", - "legislativeBody": "Corpo legislativo", - "letterType": "Tipo", - "libraryCatalog": "CatĂ¡logo de biblioteca", - "manuscriptType": "Tipo", - "mapType": "Tipo", - "meetingName": "Nome do evento", - "nameOfAct": "Nome da lei", - "network": "Rede", - "number": "NĂºmero", - "numberOfVolumes": "# de volumes", - "numPages": "# de pĂ¡ginas", - "pages": "PĂ¡ginas", - "patentNumber": "NĂºmero da Patente", - "place": "Lugar", - "postType": "Tipo de envio", - "presentationType": "Tipo", - "priorityNumbers": "NĂºmeros prioritĂ¡rios", - "proceedingsTitle": "TĂ­tulo dos anais", - "programmingLanguage": "Linguagem de programaĂ§Ă£o", - "programTitle": "TĂ­tulo do programa", - "publicationTitle": "TĂ­tulo da publicaĂ§Ă£o", - "publicLawNumber": "NĂºmero da lei", - "publisher": "Editor", - "references": "ReferĂªncias", - "reporter": "Relator", - "reporterVolume": "Volume do Reporter", - "reportNumber": "NĂºmero do relatĂ³rio", - "reportType": "Tipo de relatĂ³rio", - "rights": "Direitos", - "runningTime": "Tempo de execuĂ§Ă£o", - "scale": "Escala", - "section": "SeĂ§Ă£o", - "series": "SĂ©rie", - "seriesNumber": "NĂºmero na sĂ©rie", - "seriesText": "Texto da sĂ©rie", - "seriesTitle": "TĂ­tulo da sĂ©rie", - "session": "SessĂ£o", - "shortTitle": "TĂ­tulo curto", - "studio": "EstĂºdio", - "subject": "Assunto", - "system": "Sistema", - "thesisType": "Tipo", - "title": "TĂ­tulo", - "university": "Universidade", - "url": "URL", - "versionNumber": "VersĂ£o", - "videoRecordingFormat": "Formato", - "volume": "Volume", - "websiteTitle": "TĂ­tulo do site", - "websiteType": "Tipo de site" - }, - "creatorTypes": { - "artist": "Artista", - "attorneyAgent": "Procurador/Agente", - "author": "Autor", - "bookAuthor": "Autor do livro", - "cartographer": "CartĂ³grafo", - "castMember": "Membro do elenco", - "commenter": "Comentarista", - "composer": "Compositor", - "contributor": "Contribuidor", - "cosponsor": "Co-patrocinador", - "counsel": "Conselho", - "director": "Diretor", - "editor": "Organizador", - "guest": "Convidado", - "interviewee": "Entrevista com", - "interviewer": "Entrevistador", - "inventor": "Inventor", - "performer": "Ator", - "podcaster": "Fonte do podcast", - "presenter": "Apresentador", - "producer": "Produtor", - "programmer": "Programador", - "recipient": "DestinatĂ¡rio", - "reviewedAuthor": "Autor resenhado", - "scriptwriter": "Roteirista", - "seriesEditor": "Editor da sĂ©rie", - "sponsor": "Propositor", - "translator": "Tradutor", - "wordsBy": "Escrito por" - } - }, - "pt-PT": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Obra de Arte", - "attachment": "Anexo", - "audioRecording": "GravaĂ§Ă£o Ăudio", - "bill": "Diploma Legal", - "blogPost": "Entrada em Blogue", - "book": "Livro", - "bookSection": "SecĂ§Ă£o de Livro", - "case": "Caso", - "computerProgram": "Programa de Computador", - "conferencePaper": "Artigo em ConferĂªncia", - "dictionaryEntry": "Verbete de DicionĂ¡rio", - "document": "Documento", - "email": "Mensagem de Correio ElectrĂ³nico", - "encyclopediaArticle": "Artigo de EnciclopĂ©dia", - "film": "Filme", - "forumPost": "Entrada em FĂ³rum", - "hearing": "AudiĂ§Ă£o", - "instantMessage": "Mensagem InstantĂ¢nea", - "interview": "Entrevista", - "journalArticle": "Artigo em Revista CientĂ­fica", - "letter": "Carta", - "magazineArticle": "Artigo em Revista", - "manuscript": "Manuscrito", - "map": "Mapa", - "newspaperArticle": "Artigo em Jornal", - "note": "Nota", - "patent": "Patente", - "podcast": "EmissĂ£o Pod", - "presentation": "ApresentaĂ§Ă£o", - "radioBroadcast": "EmissĂ£o RadiofĂ³nica", - "report": "RelatĂ³rio", - "statute": "Estatuto", - "thesis": "DissertaĂ§Ă£o", - "tvBroadcast": "EmissĂ£o Televisiva", - "videoRecording": "GravaĂ§Ă£o VĂ­deo", - "webpage": "PĂ¡gina Web" - }, - "fields": { - "abstractNote": "Resumo", - "accessDate": "Acedido", - "applicationNumber": "NĂºmero da Candidatura", - "archive": "Arquivo", - "archiveLocation": "LocalizaĂ§Ă£o no Arquivo", - "artworkMedium": "Suporte ArtĂ­stico", - "artworkSize": "DimensĂ£o da Obra de Arte", - "assignee": "ResponsĂ¡vel", - "audioFileType": "Tipo do Arquivo", - "audioRecordingFormat": "Formato", - "billNumber": "NĂºmero do Diploma Legal", - "blogTitle": "TĂ­tulo do Blogue", - "bookTitle": "TĂ­tulo do Livro", - "callNumber": "NĂºmero de Chamada", - "caseName": "Nome do Caso", - "code": "CĂ³digo", - "codeNumber": "NĂºmero de CĂ³digo", - "codePages": "PĂ¡ginas do CĂ³digo", - "codeVolume": "Volume do CĂ³digo", - "committee": "ComitĂ©", - "company": "Empresa", - "conferenceName": "Nome da ConferĂªncia", - "country": "PaĂ­s", - "court": "Tribunal", - "date": "Data", - "dateAdded": "Data de AdiĂ§Ă£o", - "dateDecided": "Data da DecisĂ£o", - "dateEnacted": "Data de PromulgaĂ§Ă£o", - "dateModified": "Modificado", - "dictionaryTitle": "TĂ­tulo do DicionĂ¡rio", - "distributor": "Distribuidor", - "docketNumber": "NĂºmero de Expediente", - "documentNumber": "NĂºmero do Documento", - "DOI": "DOI", - "edition": "EdiĂ§Ă£o", - "encyclopediaTitle": "TĂ­tulo da EnciclopĂ©dia", - "episodeNumber": "NĂºmero do EpisĂ³dio", - "extra": "Extra", - "filingDate": "Data de Arquivo", - "firstPage": "Primeira PĂ¡gina", - "forumTitle": "TĂ­tulo do FĂ³rum/Lista de Correio ElectrĂ³nico", - "genre": "GĂ©nero", - "history": "HistĂ³ria", - "institution": "InstituiĂ§Ă£o", - "interviewMedium": "Suporte", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "NĂºmero", - "issueDate": "Data de EmissĂ£o", - "issuingAuthority": "Autoridade Emissora", - "itemType": "Tipo", - "journalAbbreviation": "Abreviatura da PublicaĂ§Ă£o", - "label": "Etiqueta", - "language": "LĂ­ngua", - "legalStatus": "Estado Legal", - "legislativeBody": "Entidade Legislativa", - "letterType": "Tipo", - "libraryCatalog": "CatĂ¡logo de Biblioteca", - "manuscriptType": "Tipo", - "mapType": "Tipo", - "meetingName": "Nome da ReuniĂ£o", - "nameOfAct": "Nome do Decreto", - "network": "Rede", - "number": "NĂºmero", - "numberOfVolumes": "N.º de Volumes", - "numPages": "N.º de PĂ¡ginas", - "pages": "PĂ¡ginas", - "patentNumber": "NĂºmero de Patente", - "place": "Local", - "postType": "PĂ³s-Tipo", - "presentationType": "Tipo", - "priorityNumbers": "NĂºmeros de Prioridade", - "proceedingsTitle": "TĂ­tulo das Actas", - "programmingLanguage": "Linguagem de ProgramaĂ§Ă£o", - "programTitle": "TĂ­tulo do Programa", - "publicationTitle": "PublicaĂ§Ă£o", - "publicLawNumber": "NĂºmero da Lei PĂºblica", - "publisher": "Editora", - "references": "ReferĂªncias", - "reporter": "Relator", - "reporterVolume": "Volume do Relator", - "reportNumber": "NĂºmero do RelatĂ³rio", - "reportType": "Tipo de RelatĂ³rio", - "rights": "Direitos", - "runningTime": "DuraĂ§Ă£o", - "scale": "Escala", - "section": "SecĂ§Ă£o", - "series": "SĂ©rie", - "seriesNumber": "NĂºmero da SĂ©rie", - "seriesText": "Texto da SĂ©rie", - "seriesTitle": "TĂ­tulo da SĂ©rie", - "session": "SessĂ£o", - "shortTitle": "TĂ­tulo Curto", - "studio": "EstĂºdio", - "subject": "Assunto", - "system": "Sistema", - "thesisType": "Tipo", - "title": "TĂ­tulo", - "university": "Universidade", - "url": "URL", - "versionNumber": "VersĂ£o", - "videoRecordingFormat": "Formato", - "volume": "Volume", - "websiteTitle": "TĂ­tulo da PĂ¡gina Web", - "websiteType": "Tipo de PĂ¡gina Web" - }, - "creatorTypes": { - "artist": "Artista", - "attorneyAgent": "Advogado/Agente", - "author": "Autor", - "bookAuthor": "Autor do Livro", - "cartographer": "CartĂ³grafo", - "castMember": "Membro do Elenco", - "commenter": "Comentador", - "composer": "Compositor", - "contributor": "Colaborador", - "cosponsor": "Co-patrocinador", - "counsel": "Conselho", - "director": "Realizador", - "editor": "Editor", - "guest": "Convidado", - "interviewee": "Entrevista Com", - "interviewer": "Entrevistador", - "inventor": "Inventor", - "performer": "Performer", - "podcaster": "Locutor de EmissĂ£o Pod", - "presenter": "Apresentador", - "producer": "Produtor", - "programmer": "Programador", - "recipient": "Receptor", - "reviewedAuthor": "Autor Revisto", - "scriptwriter": "Guionista", - "seriesEditor": "Editor da SĂ©rie", - "sponsor": "Patrocinador", - "translator": "Tradutor", - "wordsBy": "Texto De" - } - }, - "ro-RO": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Lucrare de artă", - "attachment": "Anexă", - "audioRecording": "Ănregistrare audio", - "bill": "Proiect de lege", - "blogPost": "Articol blog", - "book": "Carte", - "bookSection": "SecÈ›iune de carte", - "case": "Proces", - "computerProgram": "Software", - "conferencePaper": "Conferință", - "dictionaryEntry": "Articol de dicÈ›ionar", - "document": "Document", - "email": "E-mail", - "encyclopediaArticle": "Articol de enciclopedie", - "film": "Film", - "forumPost": "Comentariu forum", - "hearing": "Audiere", - "instantMessage": "Mesaj instantaneu", - "interview": "Interviu", - "journalArticle": "Articol de revistă", - "letter": "Scrisoare", - "magazineArticle": "Articol de revistă magazin", - "manuscript": "Manuscris", - "map": "Hartă", - "newspaperArticle": "Articol de ziar", - "note": "Notă", - "patent": "Brevet", - "podcast": "Multimedia", - "presentation": "Prezentare", - "radioBroadcast": "Emisiune radio", - "report": "Raport", - "statute": "Statut", - "thesis": "Teză", - "tvBroadcast": "Emisiune TV", - "videoRecording": "Ănregistrare video", - "webpage": "Pagină web" - }, - "fields": { - "abstractNote": "Rezumat", - "accessDate": "Data accesării", - "applicationNumber": "Număr aplicaÈ›ie", - "archive": "Arhivă", - "archiveLocation": "LocaÈ›ie Ă®n arhivă", - "artworkMedium": "Mediu", - "artworkSize": "Mărime lucrare de artă", - "assignee": "Reprezentant", - "audioFileType": "Tip de fiÈ™ier", - "audioRecordingFormat": "Formatare", - "billNumber": "Număr proiect de lege", - "blogTitle": "Titlu blog", - "bookTitle": "Titlu carte", - "callNumber": "Număr de tel.", - "caseName": "Nume proces", - "code": "Cod", - "codeNumber": "Număr de cod", - "codePages": "Cod pagini", - "codeVolume": "Cod volum", - "committee": "Comitet", - "company": "Companie", - "conferenceName": "Titlu conferință", - "country": "Èară", - "court": "Curte", - "date": "Dată", - "dateAdded": "Adăugat la data", - "dateDecided": "Data deciziei", - "dateEnacted": "Dată decret", - "dateModified": "Modificat", - "dictionaryTitle": "Titlu dicÈ›ionar", - "distributor": "Distribuitor", - "docketNumber": "Număr agendă de birou", - "documentNumber": "Număr document", - "DOI": "DOI", - "edition": "EdiÈ›ie", - "encyclopediaTitle": "Titlu enciclopedie", - "episodeNumber": "Număr episod", - "extra": "Extra", - "filingDate": "Data completării", - "firstPage": "Prima pagină", - "forumTitle": "Titlu forum", - "genre": "Gen", - "history": "Istorie", - "institution": "InstituÈ›ie", - "interviewMedium": "Mediu", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Număr", - "issueDate": "Data apariÈ›iei", - "issuingAuthority": "Autoritate emitentă", - "itemType": "Tip", - "journalAbbreviation": "Abreviere jurnal", - "label": "Etichetă", - "language": "Limbă", - "legalStatus": "Statut legal", - "legislativeBody": "Corp legislativ", - "letterType": "Tip", - "libraryCatalog": "Catalog bibliotecă", - "manuscriptType": "Tip", - "mapType": "Tip", - "meetingName": "Nume de contact", - "nameOfAct": "Nume act", - "network": "ReÈ›ea", - "number": "Număr", - "numberOfVolumes": "Nr. de volume", - "numPages": "Nr. de pagini", - "pages": "Pagini", - "patentNumber": "Număr brevet", - "place": "Loc", - "postType": "Tip de comentariu", - "presentationType": "Tip", - "priorityNumbers": "Numere de prioritate", - "proceedingsTitle": "Titlu dare de seamă", - "programmingLanguage": "Limbaj de programare", - "programTitle": "Titlu program", - "publicationTitle": "PublicaÈ›ie", - "publicLawNumber": "Număr lege", - "publisher": "Editură", - "references": "ReferinÈ›e", - "reporter": "Reporter", - "reporterVolume": "Volum reporter", - "reportNumber": "Număr raport", - "reportType": "Tip de raport", - "rights": "Drepturi", - "runningTime": "Timp de funcÈ›ionare", - "scale": "Scară", - "section": "SecÈ›iune", - "series": "ColecÈ›ie", - "seriesNumber": "Număr colecÈ›ie", - "seriesText": "Text colecÈ›ie", - "seriesTitle": "Titlu colecÈ›ie", - "session": "Sesiune", - "shortTitle": "Titlu scurt", - "studio": "Studio", - "subject": "Subiect", - "system": "Sistem", - "thesisType": "Tip", - "title": "Titlu", - "university": "Universitate", - "url": "URL", - "versionNumber": "Versiune", - "videoRecordingFormat": "Formatare", - "volume": "Volum", - "websiteTitle": "Titlu site web", - "websiteType": "Tip de site web" - }, - "creatorTypes": { - "artist": "Artist", - "attorneyAgent": "Avocat/Agent", - "author": "Autor", - "bookAuthor": "Autor carte", - "cartographer": "Cartograf", - "castMember": "Membru Ă®n distribuÈ›ie", - "commenter": "Comentator", - "composer": "Compozitor", - "contributor": "Colaborator", - "cosponsor": "Sponsor asociat", - "counsel": "Consiliu", - "director": "Director", - "editor": "Editor (coord.)", - "guest": "Oaspete", - "interviewee": "Interviu cu", - "interviewer": "Interviu de", - "inventor": "Inventator", - "performer": "Interpret", - "podcaster": "Autor multimedia", - "presenter": "Prezentator", - "producer": "Producător", - "programmer": "Programator", - "recipient": "Recipient", - "reviewedAuthor": "Autor recenzat", - "scriptwriter": "Scriitor (de mĂ¢nă)", - "seriesEditor": "Coordonator colecÈ›ie", - "sponsor": "Sponsor", - "translator": "Traducător", - "wordsBy": "Cuvinte de" - } - }, - "ru-RU": { - "itemTypes": { - "annotation": "ĐĐ½Đ½Đ¾Ñ‚Đ°Ñ†Đ¸Ñ", - "artwork": "Đ¥ÑƒĐ´Đ¾Đ¶ĐµÑÑ‚Đ²ĐµĐ½Đ½Đ°Ñ Ñ€Đ°Đ±Đ¾Ñ‚Đ°", - "attachment": "Đ’Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ", - "audioRecording": "Đ—Đ²ÑƒĐºĐ¾Đ·Đ°Đ¿Đ¸ÑÑŒ", - "bill": "Đ—Đ°ĐºĐ¾Đ½Đ¾Đ¿Ñ€Đ¾ĐµĐºÑ‚", - "blogPost": "Đ¡Đ¾Đ¾Đ±Ñ‰ĐµĐ½Đ¸Đµ Đ² Đ±Đ»Đ¾Đ³Đµ", - "book": "ĐĐ½Đ¸Đ³Đ°", - "bookSection": "Раздел ĐºĐ½Đ¸Đ³Đ¸", - "case": "Đ”ĐµĐ»Đ¾", - "computerProgram": "ĐĐ¾Đ¼Đ¿ÑŒÑÑ‚ĐµÑ€Đ½Đ°Ñ Đ¿Ñ€Đ¾Đ³Ñ€Đ°Đ¼Đ¼Đ°", - "conferencePaper": "Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚ ĐºĐ¾Đ½Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Đ¸", - "dictionaryEntry": "Đ¡Đ»Đ¾Đ²Đ°Ñ€Đ½Đ°Ñ ÑÑ‚Đ°Ñ‚ÑŒÑ", - "document": "Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚", - "email": "Đ­Đ»ĐµĐºÑ‚Ñ€Đ¾Đ½Đ½Đ°Ñ Đ¿Đ¾Ñ‡Ñ‚Đ°", - "encyclopediaArticle": "Đ¡Ñ‚Đ°Ñ‚ÑŒÑ Đ¸Đ· ÑĐ½Ñ†Đ¸ĐºĐ»Đ¾Đ¿ĐµĐ´Đ¸Đ¸", - "film": "Đ¤Đ¸Đ»ÑŒĐ¼", - "forumPost": "Đ¡Đ¾Đ¾Đ±Ñ‰ĐµĐ½Đ¸Đµ Đ½Đ° Ñ„Đ¾Ñ€ÑƒĐ¼Đµ", - "hearing": "Đ¡Đ»ÑƒÑˆĐ°Đ½Đ¸Đµ", - "instantMessage": "ĐœĐ³Đ½Đ¾Đ²ĐµĐ½Đ½Đ¾Đµ ÑĐ¾Đ¾Đ±Ñ‰ĐµĐ½Đ¸Đµ", - "interview": "Đ˜Đ½Ñ‚ĐµÑ€Đ²ÑŒÑ", - "journalArticle": "Đ¡Ñ‚Đ°Ñ‚ÑŒÑ Đ¸Đ· Ñ€ĐµÑ†ĐµĐ½Đ·Đ¸Ñ€ÑƒĐµĐ¼Đ¾Đ³Đ¾ Đ¶ÑƒÑ€Đ½Đ°Đ»Đ°", - "letter": "ĐŸĐ¸ÑÑŒĐ¼Đ¾", - "magazineArticle": "Đ¡Ñ‚Đ°Ñ‚ÑŒÑ Đ¸Đ· Đ¿Ñ€Đ¾Ñ‡ĐµĐ¹ Đ¿ĐµÑ€Đ¸Đ¾Đ´Đ¸ĐºĐ¸", - "manuscript": "Đ ÑƒĐºĐ¾Đ¿Đ¸ÑÑŒ", - "map": "ĐĐ°Ñ€Ñ‚Đ°", - "newspaperArticle": "Đ“Đ°Đ·ĐµÑ‚Đ½Đ°Ñ ÑÑ‚Đ°Ñ‚ÑŒÑ", - "note": "Đ—Đ°Đ¼ĐµÑ‚ĐºĐ°", - "patent": "ĐŸĐ°Ñ‚ĐµĐ½Ñ‚", - "podcast": "ĐŸĐ¾Đ´ĐºĐ°ÑÑ‚", - "presentation": "ĐŸÑ€ĐµĐ·ĐµĐ½Ñ‚Đ°Ñ†Đ¸Ñ", - "radioBroadcast": "Đ Đ°Đ´Đ¸Đ¾Đ¿ĐµÑ€ĐµĐ´Đ°Ñ‡Đ°", - "report": "ĐÑ‚Ñ‡ĐµÑ‚", - "statute": "ĐĐ¾Ñ€Đ¼. Đ¿Ñ€Đ°Đ². Đ°ĐºÑ‚", - "thesis": "ДиÑÑĐµÑ€Ñ‚Đ°Ñ†Đ¸Ñ", - "tvBroadcast": "Đ¢ĐµĐ»ĐµĐ¿ĐµÑ€ĐµĐ´Đ°Ñ‡Đ°", - "videoRecording": "Đ’Đ¸Đ´ĐµĐ¾Đ·Đ°Đ¿Đ¸ÑÑŒ", - "webpage": "Веб-ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°" - }, - "fields": { - "abstractNote": "ĐĐ½Đ½Đ¾Ñ‚Đ°Ñ†Đ¸Ñ", - "accessDate": "Đ”Đ°Ñ‚Đ° Đ´Đ¾ÑÑ‚ÑƒĐ¿Đ°", - "applicationNumber": "ĐĐ¾Đ¼ĐµÑ€ заÑĐ²ĐºĐ¸", - "archive": "ĐÑ€Ñ…Đ¸Đ²", - "archiveLocation": "ĐœĐµÑÑ‚Đ¾ Đ² Đ°Ñ€Ñ…Đ¸Đ²Đµ", - "artworkMedium": "Đ¥ÑƒĐ´Đ¾Đ¶. ÑÑ€ĐµĐ´ÑÑ‚Đ²Đ¾", - "artworkSize": "Đ Đ°Đ·Đ¼ĐµÑ€ Ñ€Đ°Đ±Đ¾Ñ‚Ñ‹", - "assignee": "ĐŸÑ€ĐµĐ´ÑÑ‚Đ°Đ²Đ¸Ñ‚ĐµĐ»ÑŒ", - "audioFileType": "Đ¢Đ¸Đ¿ Ñ„Đ°Đ¹Đ»Đ°", - "audioRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "billNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ·Đ°ĐºĐ¾Đ½Đ¾Đ¿Ñ€.", - "blogTitle": "ĐĐ°Đ·Đ²Đ°Đ½Đ¸Đµ Đ±Đ»Đ¾Đ³Đ°", - "bookTitle": "ĐĐ°Đ·Đ²Đ°Đ½Đ¸Đµ ĐºĐ½Đ¸Đ³Đ¸", - "callNumber": "Đ¨Đ¸Ñ„Ñ€ (Đ½Đ¾Đ¼ĐµÑ€ Đ²Ñ‹Đ·Đ¾Đ²Đ°)", - "caseName": "ĐĐ¾Đ¼ĐµÑ€ дела", - "code": "ĐĐ¾Đ´ĐµĐºÑ/ÑĐ±Đ¾Ñ€Đ½Đ¸Đº", - "codeNumber": "Đ¢Đ¾Đ¼ ĐºĐ¾Đ´ĐµĐºÑа", - "codePages": "Đ¡Ñ‚Ñ€Đ°Đ½Đ¸Ñ†Ñ‹ ĐºĐ¾Đ´ĐµĐºÑа", - "codeVolume": "Đ¢Đ¾Đ¼ ĐºĐ¾Đ´ĐµĐºÑа", - "committee": "ĐĐ¾Đ¼Đ¸Ñ‚ĐµÑ‚", - "company": "ĐĐ¾Đ¼Đ¿Đ°Đ½Đ¸Ñ", - "conferenceName": "ĐĐ°Đ·Đ². ĐºĐ¾Đ½Ñ„ĐµÑ€.", - "country": "Đ¡Ñ‚Ñ€Đ°Đ½Đ°", - "court": "Đ¡ÑƒĐ´", - "date": "Đ”Đ°Ñ‚Đ°", - "dateAdded": "Đ”Đ¾Đ±Đ°Đ²Đ»ĐµĐ½", - "dateDecided": "Đ”Đ°Ñ‚Đ° Ñ€ĐµÑˆĐµĐ½Đ¸Ñ", - "dateEnacted": "Đ”Đ°Ñ‚Đ° Đ°ĐºÑ‚Đ°", - "dateModified": "Đ˜Đ·Đ¼ĐµĐ½Ñ‘Đ½", - "dictionaryTitle": "ĐĐ°Đ·Đ². ÑĐ»Đ¾Đ²Đ°Ñ€Ñ", - "distributor": "РаÑĐ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ĐµĐ»ÑŒ", - "docketNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ²Ñ‹Đ¿Đ¸ÑĐºĐ¸", - "documentNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚Đ°", - "DOI": "Đ¦Đ˜Đ/DOI", - "edition": "Đ˜Đ·Đ´Đ°Đ½Đ¸Đµ", - "encyclopediaTitle": "ĐĐ°Đ·Đ². ÑĐ½Ñ†Đ¸ĐºĐ».", - "episodeNumber": "ĐĐ¾Đ¼ĐµÑ€ ÑĐ¿Đ¸Đ·Đ¾Đ´Đ°", - "extra": "Đ”Đ¾Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ĐµĐ»ÑŒĐ½Đ¾", - "filingDate": "Đ”Đ°Ñ‚Đ° заÑĐ²ĐºĐ¸", - "firstPage": "ĐŸĐµÑ€Đ²Đ°Ñ Ñтр.", - "forumTitle": "Đ¤Đ¾Ñ€ÑƒĐ¼/Listserv", - "genre": "Đ–Đ°Đ½Ñ€", - "history": "Đ˜ÑÑ‚Đ¾Ñ€Đ¸Ñ", - "institution": "Đ£Ñ‡Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Đµ", - "interviewMedium": "Đ¡Ñ€ĐµĐ´ÑÑ‚Đ²Đ¾", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Đ’Ñ‹Đ¿ÑƒÑĐº", - "issueDate": "Đ”Đ°Ñ‚Đ° Đ²Ñ‹Đ¿ÑƒÑĐºĐ°", - "issuingAuthority": "ĐĐµĐ¼ Đ²Ñ‹Đ´Đ°Đ½", - "itemType": "Đ¢Đ¸Đ¿", - "journalAbbreviation": "Đ¡Đ¾ĐºÑ€Đ°Ñ‰. Đ¶ÑƒÑ€Đ½Đ°Đ»Đ°", - "label": "ĐĐ°Đ´Đ¿Đ¸ÑÑŒ", - "language": "Đ¯Đ·Ñ‹Đº", - "legalStatus": "ĐŸÑ€Đ°Đ²Đ¾Đ²Đ¾Đ¹ ÑÑ‚Đ°Ñ‚ÑƒÑ", - "legislativeBody": "Đ—Đ°ĐºĐ¾Đ½Đ¾Đ´. Đ¾Ñ€Đ³Đ°Đ½", - "letterType": "Đ¢Đ¸Đ¿ Đ¿Đ¸ÑÑŒĐ¼Đ°", - "libraryCatalog": "Библ. ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³", - "manuscriptType": "Đ¢Đ¸Đ¿ Ñ€ÑƒĐºĐ¾Đ¿Đ¸Ñи", - "mapType": "Đ¢Đ¸Đ¿ ĐºĐ°Ñ€Ñ‚Ñ‹", - "meetingName": "ĐĐ°Đ·Đ². Đ²ÑÑ‚Ñ€ĐµÑ‡Đ¸", - "nameOfAct": "ĐĐ°Đ·Đ². Đ°ĐºÑ‚Đ°.", - "network": "Đ¡ĐµÑ‚ÑŒ", - "number": "ĐĐ¾Đ¼ĐµÑ€", - "numberOfVolumes": "ĐĐ¾Đ»-Đ²Đ¾ Ñ‚Đ¾Đ¼Đ¾Đ²", - "numPages": "ЧиÑĐ»Đ¾ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†", - "pages": "Đ¡Ñ‚Ñ€Đ°Đ½Đ¸Ñ†Ñ‹", - "patentNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ¿Đ°Ñ‚ĐµĐ½Ñ‚Đ°", - "place": "ĐœĐµÑÑ‚Đ¾", - "postType": "Đ¢Đ¸Đ¿ ÑĐ¾Đ¾Đ±Ñ‰ĐµĐ½Đ¸Ñ", - "presentationType": "Đ¢Đ¸Đ¿", - "priorityNumbers": "ĐĐ¾Đ¼ĐµÑ€Đ° Đ¿Ñ€Đ¸Đ¾Ñ€Đ¸Ñ‚ĐµÑ‚Đ¾Đ²", - "proceedingsTitle": "ĐĐ°Đ·Đ². Ñ‚Ñ€ÑƒĐ´Đ¾Đ²", - "programmingLanguage": "ĐŸÑ€Đ¾Đ³Ñ€. ÑĐ·.", - "programTitle": "ĐĐ°Đ·Đ². Đ¿Ñ€Đ¾Đ³Ñ€Đ°Đ¼Đ¼Ñ‹", - "publicationTitle": "Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº Đ¿ÑƒĐ±Đ»Đ¸ĐºĐ°Ñ†Đ¸Đ¸", - "publicLawNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ°ĐºÑ‚Đ°", - "publisher": "Đ˜Đ·Đ´Đ°Ñ‚ĐµĐ»ÑŒ", - "references": "Đ¡ÑÑ‹Đ»ĐºĐ¸", - "reporter": "Đ¡Đ±Đ¾Ñ€Đ½Đ¸Đº ÑÑƒĐ´. Ñ€ĐµÑˆ.", - "reporterVolume": "Đ¢Đ¾Đ¼ Đ¾Ñ‚Ñ‡ĐµÑ‚Đ°", - "reportNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ¾Ñ‚Ñ‡ĐµÑ‚Đ°", - "reportType": "Đ¢Đ¸Đ¿ Đ¾Ñ‚Ñ‡ĐµÑ‚Đ°", - "rights": "ĐŸÑ€Đ°Đ²Đ°", - "runningTime": "ĐŸÑ€Đ¾Đ´Đ¾Đ»Đ¶Đ¸Ñ‚.", - "scale": "ĐœĐ°ÑÑˆÑ‚Đ°Đ±", - "section": "Раздел", - "series": "Đ¡ĐµÑ€Đ¸Ñ", - "seriesNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ² ÑĐµÑ€Đ¸Đ¸", - "seriesText": "Đ¢ĐµĐºÑÑ‚ ÑĐµÑ€Đ¸Đ¸", - "seriesTitle": "ĐĐ°Đ·Đ²Đ°Đ½Đ¸Đµ ÑĐµÑ€Đ¸Đ¸", - "session": "Đ¡ĐµÑÑиÑ", - "shortTitle": "ĐÑ€Đ°Ñ‚ĐºĐ¾Đµ Đ½Đ°Đ·Đ².", - "studio": "Đ¡Ñ‚ÑƒĐ´Đ¸Ñ", - "subject": "Đ¢ĐµĐ¼Đ°", - "system": "Đ¡Đ¸ÑÑ‚ĐµĐ¼Đ°", - "thesisType": "Đ¢Đ¸Đ¿", - "title": "ĐĐ°Đ·Đ²Đ°Đ½Đ¸Đµ", - "university": "Đ£Đ½Đ¸Đ²ĐµÑ€ÑĐ¸Ñ‚ĐµÑ‚", - "url": "URL-Đ°Đ´Ñ€ĐµÑ", - "versionNumber": "Đ’ĐµÑ€ÑиÑ", - "videoRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "volume": "Đ¢Đ¾Đ¼", - "websiteTitle": "ĐĐ°Đ·Đ². Đ²ĐµĐ±-ÑĐ°Đ¹Ñ‚Đ°", - "websiteType": "Đ¢Đ¸Đ¿ Đ²ĐµĐ±-ÑĐ°Đ¹Ñ‚Đ°" - }, - "creatorTypes": { - "artist": "Đ¥ÑƒĐ´Đ¾Đ¶Đ½Đ¸Đº", - "attorneyAgent": "ĐĐ´Đ²Đ¾ĐºĐ°Ñ‚/ĐĐ³ĐµĐ½Ñ‚", - "author": "ĐĐ²Ñ‚Đ¾Ñ€", - "bookAuthor": "ĐĐ²Ñ‚Đ¾Ñ€ ĐºĐ½Đ¸Đ³Đ¸", - "cartographer": "ĐĐ°Ñ€Ñ‚Đ¾Đ³Ñ€Đ°Ñ„", - "castMember": "ĐĐºÑ‚ĐµÑ€", - "commenter": "ĐĐ¾Đ¼Đ¼ĐµĐ½Ñ‚Đ°Ñ‚Đ¾Ñ€", - "composer": "ĐĐ¾Đ¼Đ¿Đ¾Đ·Đ¸Ñ‚Đ¾Ñ€", - "contributor": "Đ¡Đ¾Đ°Đ²Ñ‚Đ¾Ñ€", - "cosponsor": "Đ¡Đ¾Đ²Đ¼. ÑĐ¿Đ¾Đ½ÑĐ¾Ñ€", - "counsel": "Đ¡Đ¾Đ²ĐµÑ‚Đ½Đ¸Đº", - "director": "РежиÑÑĐµÑ€", - "editor": "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€", - "guest": "Đ“Đ¾Ñть", - "interviewee": "Đ˜Đ½Ñ‚ĐµÑ€Đ²ÑŒÑ Ñ", - "interviewer": "Đ˜Đ½Ñ‚ĐµÑ€Đ²ÑŒÑĐµÑ€", - "inventor": "Đ˜Đ·Đ¾Đ±Ñ€ĐµÑ‚Đ°Ñ‚ĐµĐ»ÑŒ", - "performer": "Đ˜ÑĐ¿Đ¾Đ»Đ½Đ¸Ñ‚ĐµĐ»ÑŒ", - "podcaster": "ĐŸĐ¾Đ´ĐºĐ°ÑÑ‚ĐµÑ€", - "presenter": "Đ”Đ¾ĐºĐ»Đ°Đ´Ñ‡Đ¸Đº", - "producer": "ĐŸÑ€Đ¾Đ´ÑÑĐµÑ€", - "programmer": "ĐŸÑ€Đ¾Đ³Ñ€Đ°Đ¼Đ¼Đ¸ÑÑ‚", - "recipient": "ĐŸĐ¾Đ»ÑƒÑ‡Đ°Ñ‚ĐµĐ»ÑŒ", - "reviewedAuthor": "Đ ĐµÑ†ĐµĐ½Đ·. Đ°Đ²Ñ‚Đ¾Ñ€", - "scriptwriter": "Đ¡Ñ†ĐµĐ½Đ°Ñ€Đ¸ÑÑ‚", - "seriesEditor": "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ ÑĐµÑ€Đ¸Đ¸", - "sponsor": "Đ¡Đ¿Đ¾Đ½ÑĐ¾Ñ€", - "translator": "ĐŸĐµÑ€ĐµĐ²Đ¾Đ´Ñ‡Đ¸Đº", - "wordsBy": "ĐĐ²Ñ‚Đ¾Ñ€ ÑĐ»Đ¾Đ²" - } - }, - "sk-SK": { - "itemTypes": { - "annotation": "AnotĂ¡cia", - "artwork": "UmeleckĂ© dielo", - "attachment": "PrĂ­loha", - "audioRecording": "AudionahrĂ¡vka", - "bill": "LegislatĂ­vny dokument", - "blogPost": "PrĂ­spevok na blogu", - "book": "Kniha", - "bookSection": "ÄŒasÅ¥ knihy", - "case": "PrĂ­pad (sĂºdny)", - "computerProgram": "PoÄĂ­taÄovĂ½ program", - "conferencePaper": "PrĂ­spevok na konferenciu", - "dictionaryEntry": "Heslo v slovnĂ­ku", - "document": "Dokument", - "email": "E-mail", - "encyclopediaArticle": "ÄŒlĂ¡nok v encyklopĂ©dii", - "film": "Film", - "forumPost": "PrĂ­spevok do fĂ³ra", - "hearing": "VĂ½sluch (konanie)", - "instantMessage": "ChatovĂ¡ sprĂ¡va", - "interview": "OsobnĂ¡ komunikĂ¡cia", - "journalArticle": "ÄŒlĂ¡nok v odbornom Äasopise", - "letter": "List", - "magazineArticle": "ÄŒlĂ¡nok v populĂ¡rnom Äasopise", - "manuscript": "Rukopis", - "map": "Mapa", - "newspaperArticle": "ÄŒlĂ¡nok v novinĂ¡ch", - "note": "PoznĂ¡mka", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "PrezentĂ¡cia", - "radioBroadcast": "RĂ¡dio", - "report": "SprĂ¡va", - "statute": "Nariadenie", - "thesis": "ZĂ¡vereÄnĂ¡ prĂ¡ca", - "tvBroadcast": "TelevĂ­zne vysielanie", - "videoRecording": "VideonahrĂ¡vka", - "webpage": "WebovĂ¡ strĂ¡nka" - }, - "fields": { - "abstractNote": "Abstrakt", - "accessDate": "CitovanĂ©", - "applicationNumber": "ÄŒĂ­slo prihlĂ¡Å¡ky", - "archive": "ArchĂ­v", - "archiveLocation": "LokĂ¡cia", - "artworkMedium": "MĂ©dium", - "artworkSize": "Rozmery diela", - "assignee": "Prihlasovateľ", - "audioFileType": "Typ sĂºboru", - "audioRecordingFormat": "FormĂ¡t", - "billNumber": "ÄŒĂ­slo", - "blogTitle": "NĂ¡zov blogu", - "bookTitle": "NĂ¡zov knihy", - "callNumber": "SignatĂºra", - "caseName": "NĂ¡zov prĂ­padu", - "code": "ZĂ¡konnĂ­k", - "codeNumber": "KĂ³dovĂ© ÄĂ­slo", - "codePages": "Strany", - "codeVolume": "RoÄnĂ­k", - "committee": "VĂ½bor/porota", - "company": "SpoloÄnosÅ¥", - "conferenceName": "NĂ¡zov konferencie", - "country": "Å tĂ¡t", - "court": "SĂºd", - "date": "DĂ¡tum", - "dateAdded": "PridanĂ©", - "dateDecided": "DĂ¡tum rozhodnutia", - "dateEnacted": "D. vstĂºp. do platnosti", - "dateModified": "ZmenenĂ©", - "dictionaryTitle": "NĂ¡zov slovnĂ­ka", - "distributor": "DistribĂºtor", - "docketNumber": "ÄŒĂ­slo konania", - "documentNumber": "ÄŒĂ­slo dokumentu", - "DOI": "DOI", - "edition": "Vydanie", - "encyclopediaTitle": "NĂ¡zov encyklopĂ©die", - "episodeNumber": "ÄŒĂ­slo epizĂ³dy", - "extra": "Extra", - "filingDate": "DĂ¡tum zĂ¡pisu", - "firstPage": "PrvĂ¡ strana", - "forumTitle": "NĂ¡zov fĂ³ra/disk. sk.", - "genre": "Å½Ă¡ner", - "history": "HistĂ³ria", - "institution": "InÅ¡titĂºcia", - "interviewMedium": "MĂ©dium", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "ÄŒĂ­slo", - "issueDate": "DĂ¡tum vydania", - "issuingAuthority": "VydĂ¡vajĂºci Ăºrad", - "itemType": "Typ", - "journalAbbreviation": "Skratka Äasopisu", - "label": "Vydavateľstvo", - "language": "Jazyk", - "legalStatus": "PrĂ¡vny status", - "legislativeBody": "LegislatĂ­vny orgĂ¡n", - "letterType": "Druh listu", - "libraryCatalog": "KnižniÄnĂ½ katalĂ³g", - "manuscriptType": "Druh rukopisu", - "mapType": "Druh mapy", - "meetingName": "NĂ¡zov stretnutia", - "nameOfAct": "NĂ¡zov zĂ¡kona", - "network": "SieÅ¥", - "number": "ÄŒĂ­slo", - "numberOfVolumes": "PoÄet zväzkov", - "numPages": "PoÄet strĂ¡n", - "pages": "Strany", - "patentNumber": "ÄŒĂ­slo patentu", - "place": "Miesto", - "postType": "Druh prĂ­spevku", - "presentationType": "Typ prezentĂ¡cie", - "priorityNumbers": "ÄŒĂ­sla priority", - "proceedingsTitle": "NĂ¡zov zbornĂ­ka", - "programmingLanguage": "Program. jazyk", - "programTitle": "NĂ¡zov programu", - "publicationTitle": "NĂ¡zov publikĂ¡cie", - "publicLawNumber": "ÄŒĂ­slo zĂ¡kona", - "publisher": "Vydavateľ", - "references": "Odkazy", - "reporter": "Zbierka sĂºd. rozhodnutĂ­", - "reporterVolume": "RoÄnĂ­k", - "reportNumber": "ÄŒĂ­slo sprĂ¡vy", - "reportType": "Druh sprĂ¡vy", - "rights": "PrĂ¡va", - "runningTime": "Dĺžka", - "scale": "Mierka", - "section": "Sekcia", - "series": "EdĂ­cia", - "seriesNumber": "ÄŒĂ­slo edĂ­cie", - "seriesText": "Text edĂ­cie", - "seriesTitle": "NĂ¡zov edĂ­cie", - "session": "Zasadnutie", - "shortTitle": "KrĂ¡tky nĂ¡zov", - "studio": "Å tĂºdio", - "subject": "Predmet", - "system": "OperaÄnĂ½ systĂ©m", - "thesisType": "Druh zĂ¡v. prĂ¡ce", - "title": "NĂ¡zov", - "university": "Univerzita", - "url": "URL", - "versionNumber": "Verzia", - "videoRecordingFormat": "FormĂ¡t", - "volume": "Zväzok", - "websiteTitle": "NĂ¡zov strĂ¡nky", - "websiteType": "Druh sĂ­dla" - }, - "creatorTypes": { - "artist": "Umelec", - "attorneyAgent": "AdvokĂ¡t/ZĂ¡stupca", - "author": "Autor", - "bookAuthor": "Autor knihy", - "cartographer": "Kartograf", - "castMember": "ĂÄinkujĂºci", - "commenter": "KomentĂ¡tor", - "composer": "Skladateľ", - "contributor": "Prispievateľ", - "cosponsor": "Spolusponzor", - "counsel": "PrĂ¡vny zĂ¡stupca", - "director": "RežisĂ©r", - "editor": "Zostavovateľ", - "guest": "HosÅ¥", - "interviewee": "Rozhovor s", - "interviewer": "SpytujĂºci sa", - "inventor": "VynĂ¡lezca", - "performer": "Interpret", - "podcaster": "Autor podcastu", - "presenter": "PrezentujĂºci", - "producer": "Producent", - "programmer": "ProgramĂ¡tor", - "recipient": "PrĂ­jemca", - "reviewedAuthor": "Recenzent", - "scriptwriter": "ScenĂ¡rista", - "seriesEditor": "Zostavovateľ edĂ­cie", - "sponsor": "Navrhovateľ", - "translator": "Prekladateľ", - "wordsBy": "Autor textu" - } - }, - "sl-SI": { - "itemTypes": { - "annotation": "Zaznamek", - "artwork": "UmetniÅ¡ko delo", - "attachment": "Priponka", - "audioRecording": "ZvoÄni posnetek", - "bill": "GledaliÅ¡ki list", - "blogPost": "Objava na blogu", - "book": "Knjiga", - "bookSection": "Odsek knjige", - "case": "Primer", - "computerProgram": "Programje", - "conferencePaper": "KonferenÄni Älanek", - "dictionaryEntry": "Slovarski vnos", - "document": "Dokument", - "email": "E-pismo", - "encyclopediaArticle": "EnciklopediÄni Älanek", - "film": "Film", - "forumPost": "Objava na forumu", - "hearing": "ZasliÅ¡anje", - "instantMessage": "Neposredno sporoÄilo", - "interview": "Intervju", - "journalArticle": "Strokovni Älanek", - "letter": "Pismo", - "magazineArticle": "Revijalni Älanek", - "manuscript": "Rokopis", - "map": "Zemljevid", - "newspaperArticle": "ÄŒasopisni Älanek", - "note": "Opomba", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Predstavitev", - "radioBroadcast": "Radijska oddaja", - "report": "PoroÄilo", - "statute": "Statut", - "thesis": "Teza", - "tvBroadcast": "TV oddaja", - "videoRecording": "Videoposnetek", - "webpage": "Spletna stran" - }, - "fields": { - "abstractNote": "Povzetek", - "accessDate": "Dostopano", - "applicationNumber": "Å tevilka vloge", - "archive": "Arhiv", - "archiveLocation": "Mesto v arhivu", - "artworkMedium": "Medij", - "artworkSize": "Velikost umetniÅ¡kega dela", - "assignee": "Dodeljeni", - "audioFileType": "Vrsta datoteke", - "audioRecordingFormat": "Zapis", - "billNumber": "Å tevilka raÄuna", - "blogTitle": "Naslov bloga", - "bookTitle": "Naslov knjige", - "callNumber": "Å tevilka klica", - "caseName": "Ime primera", - "code": "Koda", - "codeNumber": "Å tevilka kode", - "codePages": "Strani kode", - "codeVolume": "Zbirka kode", - "committee": "Odbor", - "company": "Družba", - "conferenceName": "Ime konference", - "country": "Država", - "court": "SodiÅ¡Äe", - "date": "Datum", - "dateAdded": "Dodano dne", - "dateDecided": "Datum odloÄbe", - "dateEnacted": "Datum uveljavitve", - "dateModified": "Spremenjeno", - "dictionaryTitle": "Naslov slovarja", - "distributor": "Distributer", - "docketNumber": "Seznamska Å¡tevilka", - "documentNumber": "Å tevilka dokumenta", - "DOI": "DOI", - "edition": "Edicija", - "encyclopediaTitle": "Naslov enciklopedije", - "episodeNumber": "Å tevilka epizode", - "extra": "Dodatno", - "filingDate": "Datum vknjižbe", - "firstPage": "Naslovnica", - "forumTitle": "Naslov foruma", - "genre": "Žanr", - "history": "Zgodovina", - "institution": "Ustanova", - "interviewMedium": "Medij", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Å tevilka", - "issueDate": "Datum objave", - "issuingAuthority": "Izdajatelj", - "itemType": "Vrsta", - "journalAbbreviation": "Okraj. revije", - "label": "Vrsta", - "language": "Jezik", - "legalStatus": "Pravni status", - "legislativeBody": "Zakonodajno telo", - "letterType": "Vrsta", - "libraryCatalog": "KnjižniÄni katalog", - "manuscriptType": "Vrsta", - "mapType": "Vrsta", - "meetingName": "Ime sreÄanja", - "nameOfAct": "Ime akta", - "network": "TV postaja", - "number": "Å tevilka", - "numberOfVolumes": "Å t. letnikov", - "numPages": "Å t. strani", - "pages": "Strani", - "patentNumber": "Å tevilka patenta", - "place": "Kraj", - "postType": "Vrsta objave", - "presentationType": "Vrsta", - "priorityNumbers": "Å tevilke prioritete", - "proceedingsTitle": "Naslov zapisnika razprave", - "programmingLanguage": "Programski jezik", - "programTitle": "Naslov programa", - "publicationTitle": "Publikacija", - "publicLawNumber": "Javna pravna Å¡tevilka", - "publisher": "Izdajatelj", - "references": "Sklici", - "reporter": "PoroÄevalec", - "reporterVolume": "Zbirka poroÄil", - "reportNumber": "Å tevilka poroÄila", - "reportType": "Vrsta poroÄila", - "rights": "Pravice", - "runningTime": "Dolžina", - "scale": "Merilo", - "section": "Odsek", - "series": "Zbirka", - "seriesNumber": "Å tevilka zbirke", - "seriesText": "Besedilo zbirke", - "seriesTitle": "Naslov zbirke", - "session": "Zasedanje", - "shortTitle": "Kratki naslov", - "studio": "Studio", - "subject": "Zadeva", - "system": "Sistem", - "thesisType": "Vrsta", - "title": "Naslov", - "university": "Univerza", - "url": "URL", - "versionNumber": "RazliÄica", - "videoRecordingFormat": "Zapis", - "volume": "Letnik", - "websiteTitle": "Naslov spletne strani", - "websiteType": "Vrsta spletnega mesta" - }, - "creatorTypes": { - "artist": "Umetnik", - "attorneyAgent": "Odvetnik/agent", - "author": "Avtor", - "bookAuthor": "Avtor knjige", - "cartographer": "Kartograf", - "castMember": "NastopajoÄi", - "commenter": "Komentator", - "composer": "Skladatelj", - "contributor": "Avtor prispevka", - "cosponsor": "Sosponzor", - "counsel": "Odvetnik", - "director": "Režiser", - "editor": "Urednik", - "guest": "Gost", - "interviewee": "Intervju z", - "interviewer": "Intervju opravil", - "inventor": "Izumitelj", - "performer": "Izvajalec", - "podcaster": "Avtor podcasta", - "presenter": "Predstavitelj", - "producer": "Producent", - "programmer": "Programer", - "recipient": "Prejemnik", - "reviewedAuthor": "Ocenjeni avtor", - "scriptwriter": "Scenarist", - "seriesEditor": "Urednik zbirke", - "sponsor": "Sponzor", - "translator": "Prevajalec", - "wordsBy": "Pisec besedila" - } - }, - "sr-RS": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Đ£Đ¼ĐµÑ‚Đ½Đ¸Ñ‡ĐºĐ¾ Đ´ĐµĐ»Đ¾", - "attachment": "ĐŸÑ€Đ¸Đ»Đ¾Đ³", - "audioRecording": "Đ—Đ²ÑƒÑ‡Đ½Đ¸ ÑĐ½Đ¸Đ¼Đ°Đº", - "bill": "Đ Đ°Ñ‡ÑƒĐ½", - "blogPost": "Đ‘Đ»Đ¾Đ³ Đ¿Đ¾Ñ€ÑƒĐºĐ°", - "book": "ĐÑĐ¸Đ³Đ°", - "bookSection": "ĐŸĐ¾Đ³Đ»Đ°Đ²Ñ™Đµ у ĐºÑизи", - "case": "Đ¡Đ»ÑƒÑ‡Đ°Ñ˜", - "computerProgram": "Software", - "conferencePaper": "ĐŸĐ°Đ¿Đ¸Ñ€ Ñа ĐºĐ¾Đ½Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Ñ˜Đµ", - "dictionaryEntry": "Đ£Đ½Đ¾Ñ Đ¸Đ· Ñ€ĐµÑ‡Đ½Đ¸ĐºĐ°", - "document": "Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚", - "email": "Đ•-Đ¿Đ¾ÑˆÑ‚Đ°", - "encyclopediaArticle": "Đ§Đ»Đ°Đ½Đ°Đº из ĐµĐ½Ñ†Đ¸ĐºĐ»Đ¾Đ¿ĐµĐ´Đ¸Ñ˜Đµ", - "film": "Đ¤Đ¸Đ»Đ¼", - "forumPost": "ĐŸĐ¾Ñ€ÑƒĐºĐ° Đ½Đ° Ñ„Đ¾Ñ€ÑƒĐ¼Ñƒ", - "hearing": "Đ¡Đ°ÑĐ»ÑƒÑˆĐ°Ñе", - "instantMessage": "Đ‘Ñ€Đ·Đ° Đ¿Đ¾Ñ€ÑƒĐºĐ°", - "interview": "Đ˜Đ½Ñ‚ĐµÑ€Đ²Ñ˜Ñƒ", - "journalArticle": "Đ§Đ»Đ°Đ½Đ°Đº у Ñ‡Đ°ÑĐ¾Đ¿Đ¸Ñу", - "letter": "ĐŸĐ¸ÑĐ¼Đ¾", - "magazineArticle": "Đ§Đ»Đ°Đ½Đ°Đº у Đ¼Đ°Đ³Đ°Đ·Đ¸Đ½Ñƒ", - "manuscript": "Đ ÑƒĐºĐ¾Đ¿Đ¸Ñ", - "map": "ĐœĐ°Đ¿Đ°", - "newspaperArticle": "Đ§Đ»Đ°Đ½Đ°Đº из Đ½Đ¾Đ²Đ¸Đ½Đ°", - "note": "Đ‘ĐµĐ»ĐµÑˆĐºĐ°", - "patent": "ĐŸĐ°Ñ‚ĐµĐ½Ñ‚", - "podcast": "ĐŸĐ¾Đ´ĐºĐ°ÑÑ‚", - "presentation": "ĐŸÑ€ĐµĐ·ĐµĐ½Ñ‚Đ°Ñ†Đ¸Ñ˜Đ°", - "radioBroadcast": "Đ Đ°Đ´Đ¸Đ¾ Đ¿Ñ€ĐµĐ½Đ¾Ñ", - "report": "Đ˜Đ·Đ²ĐµÑˆÑ‚Đ°Ñ˜", - "statute": "Đ£Ñ€ĐµĐ´Đ±Đ°", - "thesis": "Đ¢ĐµĐ·Đ°", - "tvBroadcast": "Đ¢Đ’ Đ¿Ñ€ĐµĐ½Đ¾Ñ", - "videoRecording": "Đ’Đ¸Đ´ĐµĐ¾ ÑĐ½Đ¸Đ¼Đ°Đº", - "webpage": "Веб ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°" - }, - "fields": { - "abstractNote": "Đ¡Đ°Đ¶ĐµÑ‚Đ°Đº", - "accessDate": "ĐŸÑ€Đ¸ÑÑ‚ÑƒĐ¿Ñ™ĐµĐ½Đ¾", - "applicationNumber": "Đ‘Ñ€Đ¾Ñ˜ Đ°Đ¿Đ»Đ¸ĐºĐ°Ñ†Đ¸Ñ˜Đµ", - "archive": "ĐÑ€Ñ…Đ¸Đ²Đ°", - "archiveLocation": "ĐœĐµÑÑ‚Đ¾ у Đ°Ñ€Ñ…Đ¸Đ²Đ¸", - "artworkMedium": "ĐœĐµĐ´Đ¸Ñ˜ÑƒĐ¼", - "artworkSize": "Đ’ĐµĐ»Đ¸Ñ‡Đ¸Đ½Đ° ÑƒĐ¼ĐµÑ‚Đ½Đ¸Ñ‡ĐºĐ¾Đ³ дела", - "assignee": "ĐŸÑƒĐ½Đ¾Đ¼Đ¾Ñ›Đ½Đ¸Đº", - "audioFileType": "Đ’Ñ€ÑÑ‚Đ° Đ´Đ°Ñ‚Đ¾Ñ‚ĐµĐºĐµ", - "audioRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "billNumber": "Đ‘Ñ€Đ¾Ñ˜ Ñ€Đ°Ñ‡ÑƒĐ½Đ°", - "blogTitle": "ĐаÑĐ»Đ¾Đ² Đ±Đ»Đ¾Đ³Đ°", - "bookTitle": "ĐаÑĐ»Đ¾Đ² ĐºÑĐ¸Đ³Đµ", - "callNumber": "Đ¡Đ¸Đ³Đ½Đ°Ñ‚ÑƒÑ€Đ°", - "caseName": "Đ‘Ñ€Đ¾Ñ˜ ÑĐ»ÑƒÑ‡Đ°Ñ˜Đ°", - "code": "ĐĐ¾Đ´", - "codeNumber": "Đ‘Ñ€Đ¾Ñ˜ ĐºĐ¾Đ´Đ°", - "codePages": "ĐĐ¾Đ´ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°", - "codeVolume": "ĐĐ¾Đ´ Ñ‚Đ¾Đ¼Đ°", - "committee": "ĐĐ¾Đ¼Đ¸ÑĐ¸Ñ˜Đ°", - "company": "ĐŸÑ€ĐµĐ´ÑƒĐ·ĐµÑ›Đµ", - "conferenceName": "Đ˜Đ¼Đµ ĐºĐ¾Đ½Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Ñ˜Đµ", - "country": "Đ”Ñ€Đ¶Đ°Đ²Đ°", - "court": "Đ¡ÑƒĐ´", - "date": "Đ”Đ°Ñ‚ÑƒĐ¼", - "dateAdded": "Đ”Đ°Ñ‚ÑƒĐ¼ Đ´Đ¾Đ´Đ°Đ²Đ°Ñа", - "dateDecided": "Đ”Đ°Ñ‚ÑƒĐ¼ Đ¾Đ´Đ»ÑƒĐºĐµ", - "dateEnacted": "Đ”Đ°Ñ‚ÑƒĐ¼ Đ¾Đ·Đ°ĐºĐ¾ÑĐµĐ½Đ°", - "dateModified": "Đ”Đ°Ñ‚ÑƒĐ¼ Đ¸Đ·Đ¼ĐµĐ½Đµ", - "dictionaryTitle": "ĐаÑĐ»Đ¾Đ² Ñ€ĐµÑ‡Đ½Đ¸ĐºĐ°", - "distributor": "ДиÑÑ‚Ñ€Đ¸Đ±ÑƒÑ‚ĐµÑ€", - "docketNumber": "Docket Number", - "documentNumber": "Đ‘Ñ€Đ¾Ñ˜ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚Đ°", - "DOI": "Đ”ĐĐ˜", - "edition": "Đ•Đ´Đ¸Ñ†Đ¸Ñ˜Đ°", - "encyclopediaTitle": "ĐаÑĐ»Đ¾Đ² ĐµĐ½Ñ†Đ¸ĐºĐ»Đ¾Đ¿ĐµĐ´Đ¸Ñ˜Đµ", - "episodeNumber": "Đ‘Ñ€Đ¾Ñ˜ ĐµĐ¿Đ¸Đ·Đ¾Đ´Đµ", - "extra": "Đ”Đ¾Đ´Đ°Ñ‚Đ½Đ¸ Đ¿Đ¾Đ´Đ°Ñ†Đ¸", - "filingDate": "Filing Date", - "firstPage": "ĐŸÑ€Đ²Đ° ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°", - "forumTitle": "ĐаÑĐ»Đ¾Đ² Ñ„Đ¾Ñ€ÑƒĐ¼Đ° или listserv-а", - "genre": "Đ–Đ°Đ½Ñ€", - "history": "Đ˜ÑÑ‚Đ¾Ñ€Đ¸Ñ˜Đ°", - "institution": "Đ˜Đ½ÑÑ‚Đ¸Ñ‚ÑƒÑ†Đ¸Ñ˜Đ°", - "interviewMedium": "ĐœĐµĐ´Đ¸Ñ˜ÑƒĐ¼", - "ISBN": "Đ˜Đ¡Đ‘Đ", - "ISSN": "Đ˜Đ¡Đ¡Đ", - "issue": "Đ‘Ñ€oj издаÑа", - "issueDate": "Đ”Đ°Ñ‚ÑƒĐ¼ издаÑа", - "issuingAuthority": "Issuing Authority", - "itemType": "Đ’Ñ€ÑÑ‚Đ°", - "journalAbbreviation": "Đ¡ĐºÑ€Đ°Ñ›ĐµĐ½Đ¸Ñ†Đ° Ñ‡Đ°ÑĐ¾Đ¿Đ¸Ñа", - "label": "ĐĐ·Đ½Đ°ĐºĐ°", - "language": "ĐˆĐµĐ·Đ¸Đº", - "legalStatus": "ĐŸÑ€Đ°Đ²Đ½Đ¸ ÑÑ‚Đ°Ñ‚ÑƒÑ", - "legislativeBody": "Đ—Đ°ĐºĐ¾Đ½Đ¾Đ´Đ°Đ²Đ½Đ¾ Ñ‚ĐµĐ»Đ¾", - "letterType": "Đ’Ñ€ÑÑ‚Đ°", - "libraryCatalog": "ĐĐ°Ñ‚Đ°Đ»Đ¾Đ³ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐµ", - "manuscriptType": "Đ’Ñ€ÑÑ‚Đ°", - "mapType": "Đ’Ñ€ÑÑ‚Đ°", - "meetingName": "Đ˜Đ¼Đµ ÑаÑÑ‚Đ°Đ½ĐºĐ°", - "nameOfAct": "Đ˜Đ¼Đµ ÑƒĐºĐ°Đ·Đ°", - "network": "ĐœÑ€ĐµĐ¶Đ°", - "number": "Đ‘Ñ€Đ¾Ñ˜", - "numberOfVolumes": "Đ‘Ñ€. Ñ‚Đ¾Đ¼Đ¾Đ²Đ°", - "numPages": "Đ‘Ñ€oj ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°", - "pages": "Đ¡Ñ‚Ñ€Đ°Đ½Đ¸Ñ†Đµ", - "patentNumber": "Đ‘Ñ€Đ¾Ñ˜ Đ¿Đ°Ñ‚ĐµĐ½Ñ‚Đ°", - "place": "ĐœĐµÑÑ‚Đ¾", - "postType": "Đ’Ñ€ÑÑ‚Đ° Đ¿Đ¾Ñ€ÑƒĐºĐµ", - "presentationType": "Đ’Ñ€ÑÑ‚Đ°", - "priorityNumbers": "Đ‘Ñ€Đ¾Ñ˜ĐµĐ²Đ¸ Đ¿Ñ€Đ¸Đ¾Ñ€Đ¸Ñ‚ĐµÑ‚Đ°", - "proceedingsTitle": "ĐаÑĐ»Đ¾Đ² Đ·Đ±Đ¾Ñ€Đ½Đ¸ĐºĐ°", - "programmingLanguage": "Prog. Language", - "programTitle": "ĐĐ°Đ·Đ¸Đ² Đ¿Ñ€Đ¾Đ³Ñ€Đ°Đ¼Đ°", - "publicationTitle": "Đ˜Đ·Đ´Đ°Ñе", - "publicLawNumber": "Đ‘Ñ€Đ¾Ñ˜ Ñ˜Đ°Đ²Đ½Đ¾Đ³ Đ·Đ°ĐºĐ¾Đ½Đ°", - "publisher": "Đ˜Đ·Đ´Đ°Đ²Đ°Ñ‡", - "references": "Đ ĐµÑ„ĐµÑ€ĐµĐ½Ñ†Đµ", - "reporter": "Đ˜Đ·Đ²ĐµÑÑ‚Đ¸Đ»Đ°Ñ†", - "reporterVolume": "Đ¢Đ¾Đ¼ Đ¸Đ·Đ²ĐµÑÑ‚Đ¸Đ¾Ñ†Đ°", - "reportNumber": "Đ‘Ñ€Đ¾Ñ˜ Đ¸Đ·Đ²ĐµÑˆÑ‚Đ°Ñ˜Đ°", - "reportType": "Đ’Ñ€ÑÑ‚Đ° Đ¸Đ·Đ²ĐµÑˆÑ‚Đ°Ñ˜Đ°", - "rights": "ĐŸÑ€Đ°Đ²Đ°", - "runningTime": "Đ”ÑƒĐ¶Đ¸Đ½Đ° Ñ‚Ñ€Đ°Ñ˜Đ°Ñа", - "scale": "ĐĐ¿ÑĐµĐ³", - "section": "Đ¡ĐµĐºÑ†Đ¸Ñ˜Đ°", - "series": "Đ¡ĐµÑ€Đ¸Ñ˜Đµ", - "seriesNumber": "Đ‘Ñ€Đ¾Ñ˜ ÑĐµÑ€Đ¸Ñ˜Đµ", - "seriesText": "Đ¢ĐµĐºÑÑ‚ ÑĐµÑ€Đ¸Ñ˜Đµ", - "seriesTitle": "ĐаÑĐ»Đ¾Đ² ÑĐµÑ€Đ¸Ñ˜Đµ", - "session": "Đ¡ĐµÑĐ¸Ñ˜Đ°", - "shortTitle": "Đ¡ĐºÑ€Đ°Ñ›ĐµĐ½Đ¸ Đ½Đ°ÑĐ»Đ¾Đ²", - "studio": "Đ¡Ñ‚ÑƒĐ´Đ¸Đ¾", - "subject": "Đ¡ÑƒĐ±Ñ˜ĐµĐºĐ°Ñ‚", - "system": "Đ¡Đ¸ÑÑ‚ĐµĐ¼", - "thesisType": "Đ’Ñ€ÑÑ‚Đ°", - "title": "ĐаÑĐ»Đ¾Đ²", - "university": "Đ£Đ½Đ¸Đ²ĐµÑ€Đ·Đ¸Ñ‚ĐµÑ‚", - "url": "Đ£Đ Đ›", - "versionNumber": "Version", - "videoRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "volume": "Đ¢Đ¾Đ¼", - "websiteTitle": "ĐаÑĐ»Đ¾Đ² Đ²ĐµĐ± ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đµ", - "websiteType": "Đ’Ñ€ÑÑ‚Đ° Đ²ĐµĐ± Đ¼ĐµÑÑ‚Đ°" - }, - "creatorTypes": { - "artist": "Đ£Đ¼ĐµÑ‚Đ½Đ¸Đº", - "attorneyAgent": "ĐĐ´Đ²Đ¾ĐºĐ°Ñ‚/ĐŸÑ€ĐµĐ´ÑÑ‚Đ°Đ²Đ½Đ¸Đº", - "author": "ĐÑƒÑ‚Đ¾Ñ€", - "bookAuthor": "ĐÑƒÑ‚Đ¾Ñ€ ĐºÑĐ¸Đ³Đµ", - "cartographer": "ĐĐ°Ñ€Ñ‚Đ¾Đ³Ñ€Đ°Ñ„", - "castMember": "Đ“Đ»ÑƒĐ¼Đ°Ñ†", - "commenter": "ĐĐ¾Đ¼ĐµĐ½Ñ‚Đ°Ñ‚Đ¾Ñ€", - "composer": "ĐĐ¾Đ¼Đ¿Đ¾Đ·Đ¸Ñ‚Đ¾Ñ€", - "contributor": "Đ¡Đ°Ñ€Đ°Đ´Đ½Đ¸Đº", - "cosponsor": "Cosponsor", - "counsel": "Đ¡Đ°Đ²ĐµÑ‚", - "director": "Đ”Đ¸Ñ€ĐµĐºÑ‚Đ¾Ñ€", - "editor": "Đ£Ñ€ĐµĐ´Đ½Đ¸Đº", - "guest": "Đ“Đ¾ÑÑ‚", - "interviewee": "Đ Đ°Đ·Đ³Đ¾Đ²Đ¾Ñ€ Ñа", - "interviewer": "Đ’Đ¾Đ´Đ¸Ñ‡ Đ¸Đ½Ñ‚ĐµÑ€Đ²Ñ˜ÑƒĐ°", - "inventor": "ĐŸÑ€Đ¾Đ½Đ°Đ»Đ°Đ·Đ°Ñ‡", - "performer": "Đ˜Đ·Đ²Đ¾Ñ’Đ°Ñ‡", - "podcaster": "ĐŸĐ¾Đ´ĐºĐ°ÑÑ‚ĐµÑ€", - "presenter": "ĐŸÑ€ĐµĐ·ĐµĐ½Ñ‚ĐµÑ€", - "producer": "ĐŸÑ€Đ¾Đ´ÑƒÑ†ĐµĐ½Ñ‚", - "programmer": "ĐŸÑ€Đ¾Đ³Ñ€Đ°Đ¼ĐµÑ€", - "recipient": "ĐŸÑ€Đ¸Đ¼Đ°Đ»Đ°Ñ†", - "reviewedAuthor": "ĐÑ†ĐµÑĐµĐ½Đ¸ Đ°ÑƒÑ‚Đ¾Ñ€", - "scriptwriter": "Đ¡Ñ†ĐµĐ½Đ°Ñ€Đ¸ÑÑ‚Đ°", - "seriesEditor": "Đ£Ñ€ĐµĐ´Đ½Đ¸Đº ÑĐµÑ€Đ¸Ñ˜Đµ", - "sponsor": "Đ¡Đ¿Đ¾Đ½Đ·Đ¾Ñ€", - "translator": "ĐŸÑ€ĐµĐ²Đ¾Đ´Đ¸Đ»Đ°Ñ†", - "wordsBy": "Đ ĐµÑ‡Đ¸ Đ½Đ°Đ¿Đ¸ÑĐ°Đ¾" - } - }, - "sv-SE": { - "itemTypes": { - "annotation": "Kommentar", - "artwork": "Konstverk", - "attachment": "Bilaga", - "audioRecording": "Ljudinspelning", - "bill": "Lagförarbete", - "blogPost": "Blogginlägg", - "book": "Bok", - "bookSection": "Bokavsnitt", - "case": "Rättsfall", - "computerProgram": "Programvara", - "conferencePaper": "Konferensartikel", - "dictionaryEntry": "Uppslag i ordbok", - "document": "Dokument", - "email": "E-postbrev", - "encyclopediaArticle": "Artikel i uppslagsverk", - "film": "Film", - "forumPost": "Foruminlägg", - "hearing": "Offentlig utfrĂ¥gning", - "instantMessage": "Chattmeddelande", - "interview": "Intervju", - "journalArticle": "Tidskriftsartikel", - "letter": "Brev", - "magazineArticle": "Magasinsartikel", - "manuscript": "Manuskript", - "map": "Karta", - "newspaperArticle": "Dagstidningsartikel", - "note": "Anteckning", - "patent": "Patent", - "podcast": "Poddsändning", - "presentation": "Presentation", - "radioBroadcast": "Radiosändning", - "report": "Rapport", - "statute": "Författning", - "thesis": "Uppsats", - "tvBroadcast": "TV-sändning", - "videoRecording": "Videoinspelning", - "webpage": "Webbsida" - }, - "fields": { - "abstractNote": "Sammanfattning", - "accessDate": "Hämtad den", - "applicationNumber": "Anmälningsnummer", - "archive": "Arkiv", - "archiveLocation": "Plats i arkiv", - "artworkMedium": "Medium för konstverk", - "artworkSize": "Storlek pĂ¥ konstverk", - "assignee": "Representant", - "audioFileType": "Filtyp", - "audioRecordingFormat": "Format", - "billNumber": "Förarbetets ref. nr.", - "blogTitle": "Bloggnamn", - "bookTitle": "Boktitel", - "callNumber": "Hyllkod", - "caseName": "Rättsfallsnamn", - "code": "Författningssamling", - "codeNumber": "Författningsnummer", - "codePages": "Sidkod", - "codeVolume": "Lagband", - "committee": "KommittĂ©", - "company": "Företag", - "conferenceName": "Namn pĂ¥ konferens", - "country": "Land", - "court": "Domstol", - "date": "Datum", - "dateAdded": "Tillagd den", - "dateDecided": "Avgörandedatum", - "dateEnacted": "Datum för ikraftträdande", - "dateModified": "Ă„ndrad den", - "dictionaryTitle": "Ordbokstitel", - "distributor": "Distributör", - "docketNumber": "MĂ¥lnummer", - "documentNumber": "Dokumentnummer", - "DOI": "DOI", - "edition": "Upplaga", - "encyclopediaTitle": "Uppslagsverkstitel", - "episodeNumber": "Avsnittsnummer", - "extra": "Extra", - "filingDate": "Ansökningsdatum", - "firstPage": "Första sida", - "forumTitle": "Titel pĂ¥ forum/listserver", - "genre": "Genre", - "history": "Historia", - "institution": "Institution", - "interviewMedium": "Media", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Nummer", - "issueDate": "Utgivningsdatum", - "issuingAuthority": "Utgivare", - "itemType": "Typ", - "journalAbbreviation": "Tidskriftsförkortning", - "label": "Stämpel", - "language": "SprĂ¥k", - "legalStatus": "Rättslig status", - "legislativeBody": "Lagstiftande organ", - "letterType": "Brevtyp", - "libraryCatalog": "Bibliotekskatalog", - "manuscriptType": "Manustyp", - "mapType": "Karttyp", - "meetingName": "Namn pĂ¥ möte", - "nameOfAct": "Författningens namn", - "network": "Nätverk", - "number": "Nummer", - "numberOfVolumes": "# volymer", - "numPages": "# sidor", - "pages": "Sidor", - "patentNumber": "Patentnummer", - "place": "Ort", - "postType": "Källtyp", - "presentationType": "Presentationstyp", - "priorityNumbers": "Prioritetsnummer", - "proceedingsTitle": "Protokolltitel", - "programmingLanguage": "Prog. sprĂ¥k", - "programTitle": "Programtitel", - "publicationTitle": "Publikation", - "publicLawNumber": "Public Law Number", - "publisher": "Utgivare", - "references": "Källhänvisningar", - "reporter": "Referatsamling", - "reporterVolume": "Referattyp", - "reportNumber": "Rapportnummer", - "reportType": "Rapporttyp", - "rights": "Rättigheter", - "runningTime": "Inspelningslängd", - "scale": "Skala", - "section": "Avsnitt", - "series": "Bokserie", - "seriesNumber": "Nummer i bokserie", - "seriesText": "Bokseries text", - "seriesTitle": "Titel pĂ¥ bokserie", - "session": "Session", - "shortTitle": "Kort titel", - "studio": "Studio", - "subject": "Ă„mne", - "system": "System", - "thesisType": "Uppsatstyp", - "title": "Titel", - "university": "Lärosäte", - "url": "Webbadress", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Band/Ă…rgĂ¥ng", - "websiteTitle": "Titel pĂ¥ webbplats", - "websiteType": "Webbplatstyp" - }, - "creatorTypes": { - "artist": "Konstnär", - "attorneyAgent": "Ombud/Agent", - "author": "Författare", - "bookAuthor": "Bokförfattare", - "cartographer": "Kartograf", - "castMember": "SkĂ¥despelare", - "commenter": "Kommentator", - "composer": "Kompositör", - "contributor": "Medarbetare", - "cosponsor": "Medsponsor", - "counsel": "Handledare", - "director": "Regissör", - "editor": "Redaktör", - "guest": "Gäst", - "interviewee": "Intervju med", - "interviewer": "Intervjuare", - "inventor": "Uppfinnare", - "performer": "Artist", - "podcaster": "Poddsändare", - "presenter": "Presentatör", - "producer": "Producent", - "programmer": "Programmerare", - "recipient": "Mottagare", - "reviewedAuthor": "Recenserad författare", - "scriptwriter": "Manusförfattare", - "seriesEditor": "Redaktör för bokserie", - "sponsor": "Förslagsläggare", - "translator": "Ă–versättare", - "wordsBy": "Text av" - } - }, - "th-TH": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "งานศิลป์", - "attachment": "à¹à¸Ÿà¹‰à¸¡à¹à¸™à¸", - "audioRecording": "โสตวัสดุ", - "bill": "เอà¸à¸ªà¸²à¸£à¸à¸à¸«à¸¡à¸²à¸¢", - "blogPost": "à¸à¸—ความà¸à¸¥à¹‡à¸­à¸", - "book": "หนังสือ", - "bookSection": "à¸à¸—หนึ่งในหนังสือ", - "case": "เหตุà¸à¸²à¸£à¸“์/คดี", - "computerProgram": "Software", - "conferencePaper": "เอà¸à¸ªà¸²à¸£à¸›à¸£à¸°à¸à¸¸à¸¡à¸§à¸´à¸à¸²à¸à¸²à¸£", - "dictionaryEntry": "à¸à¸ˆà¸™à¸²à¸™à¸¸à¸à¸£à¸¡", - "document": "เอà¸à¸ªà¸²à¸£", - "email": "อีเมล", - "encyclopediaArticle": "à¸à¸—ความสารานุà¸à¸£à¸¡", - "film": "ภาà¸à¸¢à¸™à¸•ร์", - "forumPost": "ข้อความในฟอรั่ม", - "hearing": "à¸à¸²à¸£à¸Ÿà¸±à¸‡à¸„วามคิดเห็น", - "instantMessage": "ข้อความด่วน", - "interview": "à¸à¸—สัมภาษณ์", - "journalArticle": "à¸à¸—ความวารสาร", - "letter": "จดหมาย", - "magazineArticle": "à¸à¸—ความนิตยสาร", - "manuscript": "เอà¸à¸ªà¸²à¸£à¸•้นฉà¸à¸±à¸", - "map": "à¹à¸œà¸™à¸—ี่", - "newspaperArticle": "à¸à¸—ความหนังสือà¸à¸´à¸¡à¸à¹Œ", - "note": "à¸à¸±à¸™à¸—ึà¸", - "patent": "สิทธิà¸à¸±à¸•ร", - "podcast": "à¸à¸­à¸”คาสต์", - "presentation": "เอà¸à¸ªà¸²à¸£à¸à¸²à¸£à¸™à¸³à¹€à¸ªà¸™à¸­", - "radioBroadcast": "รายà¸à¸²à¸£à¸§à¸´à¸—ยุ", - "report": "รายงาน", - "statute": "à¸à¸±à¸à¸à¸±à¸•ิ", - "thesis": "วิทยานิà¸à¸™à¸˜à¹Œ", - "tvBroadcast": "รายà¸à¸²à¸£à¹‚ทรทัศน์", - "videoRecording": "วีดิทัศน์", - "webpage": "หน้าเว็à¸" - }, - "fields": { - "abstractNote": "à¸à¸—คัดย่อ", - "accessDate": "สืà¸à¸„้นเมื่อ", - "applicationNumber": "หมายเลขคำขอ", - "archive": "เอà¸à¸ªà¸²à¸£à¸ªà¸³à¸„ัà¸", - "archiveLocation": "ที่เà¸à¹‡à¸à¹€à¸­à¸à¸ªà¸²à¸£à¸ªà¸³à¸„ัà¸", - "artworkMedium": "สื่อ", - "artworkSize": "ขนาดอาร์ตเวิร์à¸", - "assignee": "ผู้รัà¸à¹‚อนสิทธิ์", - "audioFileType": "ประเภทà¹à¸Ÿà¹‰à¸¡", - "audioRecordingFormat": "รูปà¹à¸à¸", - "billNumber": "หมายเลขเอà¸à¸ªà¸²à¸£à¸à¸à¸«à¸¡à¸²à¸¢", - "blogTitle": "à¸à¸·à¹ˆà¸­à¸à¸¥à¹‡à¸­à¸", - "bookTitle": "à¸à¸·à¹ˆà¸­à¸«à¸™à¸±à¸‡à¸ªà¸·à¸­", - "callNumber": "หมายเลขหิ้งหนังสือ", - "caseName": "หมายเลขคดี", - "code": "ประมวลà¸à¸à¸«à¸¡à¸²à¸¢", - "codeNumber": "หมายเลขประมวลà¸à¸à¸«à¸¡à¸²à¸¢", - "codePages": "เลขหน้าประมวลà¸à¸à¸«à¸¡à¸²à¸¢", - "codeVolume": "หมวดประมวลà¸à¸à¸«à¸¡à¸²à¸¢", - "committee": "คณะà¸à¸£à¸£à¸¡à¸à¸²à¸£", - "company": "à¸à¸£à¸´à¸©à¸±à¸—", - "conferenceName": "à¸à¸·à¹ˆà¸­à¸à¸²à¸£à¸›à¸£à¸°à¸à¸¸à¸¡", - "country": "ประเทศ", - "court": "ศาล", - "date": "วันที่", - "dateAdded": "วันที่เà¸à¸´à¹ˆà¸¡", - "dateDecided": "วันที่à¸à¸´à¸ˆà¸²à¸£à¸“า", - "dateEnacted": "วันที่ออà¸à¸à¸à¸«à¸¡à¸²à¸¢", - "dateModified": "à¹à¸à¹‰à¹„ข", - "dictionaryTitle": "à¸à¸·à¹ˆà¸­à¸à¸ˆà¸™à¸²à¸™à¸¸à¸à¸£à¸¡", - "distributor": "ผู้à¹à¸ˆà¸à¸ˆà¹ˆà¸²à¸¢", - "docketNumber": "หมายเลขคำà¸à¸´à¸à¸²à¸à¸©à¸²", - "documentNumber": "หมายเลขเอà¸à¸ªà¸²à¸£", - "DOI": "DOI", - "edition": "ครั้งที่à¸à¸´à¸¡à¸à¹Œ", - "encyclopediaTitle": "à¸à¸·à¹ˆà¸­à¸ªà¸²à¸£à¸²à¸™à¸¸à¸à¸£à¸¡", - "episodeNumber": "ตอนที่", - "extra": "สิ่งที่เà¸à¸´à¹ˆà¸¡à¹€à¸•ิม", - "filingDate": "วันที่เข้าà¹à¸Ÿà¹‰à¸¡", - "firstPage": "หน้าà¹à¸£à¸", - "forumTitle": "à¸à¸·à¹ˆà¸­à¸Ÿà¸­à¸£à¸±à¹ˆà¸¡", - "genre": "ประเภท", - "history": "ประวัติ", - "institution": "สถาà¸à¸±à¸™", - "interviewMedium": "สื่อ", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "ฉà¸à¸±à¸à¸—ี่", - "issueDate": "วันที่ออà¸à¸«à¸™à¸±à¸‡à¸ªà¸·à¸­", - "issuingAuthority": "อำนาจà¸à¸²à¸£à¸­à¸­à¸à¹€à¸­à¸à¸ªà¸²à¸£", - "itemType": "ประเภท", - "journalAbbreviation": "à¸à¸·à¹ˆà¸­à¸¢à¹ˆà¸­à¸§à¸²à¸£à¸ªà¸²à¸£", - "label": "ป้าย", - "language": "ภาษา", - "legalStatus": "สถานภาà¸à¸•ามà¸à¸à¸«à¸¡à¸²à¸¢", - "legislativeBody": "สภานิติà¸à¸±à¸à¸à¸±à¸•ิ", - "letterType": "ประเภท", - "libraryCatalog": "à¸à¸²à¸™à¸‚้อมูลห้องสมุด", - "manuscriptType": "ประเภท", - "mapType": "ประเภท", - "meetingName": "à¸à¸·à¹ˆà¸­à¸à¸²à¸£à¸›à¸£à¸°à¸à¸¸à¸¡", - "nameOfAct": "à¸à¸·à¹ˆà¸­à¸.ร.à¸.", - "network": "เครือข่าย", - "number": "หมายเลข", - "numberOfVolumes": "จำนวนเล่ม", - "numPages": "จำนวนหน้า", - "pages": "เลขหน้า", - "patentNumber": "หมายเลขสิทธิà¸à¸±à¸•ร", - "place": "สถานที่à¸à¸´à¸¡à¸à¹Œ", - "postType": "ประเภทข้อความ", - "presentationType": "ประเภท", - "priorityNumbers": "หมายเลขลำดัà¸à¸à¹ˆà¸­à¸™", - "proceedingsTitle": "à¸à¸·à¹ˆà¸­à¹€à¸­à¸à¸ªà¸²à¸£à¸à¸²à¸£à¸›à¸£à¸°à¸à¸¸à¸¡", - "programmingLanguage": "Prog. Language", - "programTitle": "à¸à¸·à¹ˆà¸­à¹‚ปรà¹à¸à¸£à¸¡", - "publicationTitle": "สิ่งà¸à¸´à¸¡à¸à¹Œà¹€à¸œà¸¢à¹à¸à¸£à¹ˆ", - "publicLawNumber": "หมายเลขà¸à¸à¸«à¸¡à¸²à¸¢à¸¡à¸«à¸²à¸à¸™", - "publisher": "สำนัà¸à¸à¸´à¸¡à¸à¹Œ", - "references": "เอà¸à¸ªà¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡", - "reporter": "ผู้รายงาน", - "reporterVolume": "รายงานเล่มที่", - "reportNumber": "หมายเลขรายงาน", - "reportType": "ประเภทรายงาน", - "rights": "ลิขสิทธิ์", - "runningTime": "ระยะเวลาเล่นต่อเนื่อง", - "scale": "มาตราส่วน", - "section": "ส่วน", - "series": "à¸à¸¸à¸”", - "seriesNumber": "หมายเลขà¸à¸¸à¸”", - "seriesText": "หัวข้อà¸à¸¸à¸”", - "seriesTitle": "à¸à¸·à¹ˆà¸­à¸à¸¸à¸”", - "session": "สมัยประà¸à¸¸à¸¡", - "shortTitle": "à¸à¸·à¹ˆà¸­à¸¢à¹ˆà¸­à¹€à¸£à¸·à¹ˆà¸­à¸‡", - "studio": "สตูดิโอ", - "subject": "เรื่อง", - "system": "ระà¸à¸", - "thesisType": "ประเภท", - "title": "à¸à¸·à¹ˆà¸­à¹€à¸£à¸·à¹ˆà¸­à¸‡", - "university": "มหาวิทยาลัย", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "รูปà¹à¸à¸", - "volume": "ปีที่à¸à¸´à¸¡à¸à¹Œ", - "websiteTitle": "à¸à¸·à¹ˆà¸­à¹€à¸§à¹‡à¸à¹„ซต์", - "websiteType": "ประเภทเว็à¸à¹„ซต์" - }, - "creatorTypes": { - "artist": "ศิลปิน", - "attorneyAgent": "ผู้รัà¸à¸¡à¸­à¸à¸­à¸³à¸™à¸²à¸ˆ/ตัวà¹à¸—น", - "author": "ผู้à¹à¸•่ง", - "bookAuthor": "ผู้à¹à¸•่งหนังสือ", - "cartographer": "ผู้ทำà¹à¸œà¸™à¸—ี่", - "castMember": "นัà¸à¹à¸ªà¸”ง", - "commenter": "ผู้ออà¸à¸„วามเห็น", - "composer": "นัà¸à¹à¸•่งเà¸à¸¥à¸‡", - "contributor": "ผู้à¸à¹ˆà¸§à¸¢à¹€à¸«à¸¥à¸·à¸­", - "cosponsor": "ผู้อุปถัมภ์ร่วม", - "counsel": "ทนายความ", - "director": "ผู้อำนวยà¸à¸²à¸£", - "editor": "à¸à¸£à¸£à¸“าธิà¸à¸²à¸£", - "guest": "ผู้รัà¸à¹€à¸à¸´à¸", - "interviewee": "สัมภาษณ์à¸à¸±à¸", - "interviewer": "ผู้สัมภาษณ์", - "inventor": "ผู้ประดิษà¸à¹Œ", - "performer": "นัà¸à¹à¸ªà¸”ง", - "podcaster": "ผู้สร้างà¸à¸­à¸”คาสต์", - "presenter": "ผู้นำเสนอ", - "producer": "ผู้à¸à¸³à¸à¸±à¸", - "programmer": "นัà¸à¹€à¸‚ียนโปรà¹à¸à¸£à¸¡", - "recipient": "ผู้รัà¸", - "reviewedAuthor": "ผู้เขียนà¸à¸—วิจารณ์", - "scriptwriter": "ผู้เขียนà¸à¸—", - "seriesEditor": "à¸à¸£à¸£à¸“าธิà¸à¸²à¸£à¸à¸¸à¸”ย่อย", - "sponsor": "ผู้อุปถัมภ์", - "translator": "ผู้à¹à¸›à¸¥", - "wordsBy": "สุนทรà¸à¸ˆà¸™à¹Œà¹‚ดย" - } - }, - "tr-TR": { - "itemTypes": { - "annotation": "Ek Açıklama", - "artwork": "Sanat eseri", - "attachment": "Ek", - "audioRecording": "Ses Kaydı", - "bill": "Kanun önergesi", - "blogPost": "GĂ¼nlĂ¼k Yazısı", - "book": "Kitap", - "bookSection": "Kitap BölĂ¼mĂ¼", - "case": "Dava", - "computerProgram": "Yazılım", - "conferencePaper": "Konferans Bildirisi", - "dictionaryEntry": "SözlĂ¼k Girdisi", - "document": "DokĂ¼man", - "email": "E-posta", - "encyclopediaArticle": "Ansiklopedi Makalesi", - "film": "Film", - "forumPost": "Forum İletisi", - "hearing": "Kurul ifadesi", - "instantMessage": "Anlık İleti", - "interview": "GörĂ¼ÅŸme", - "journalArticle": "Bilimsel Dergi Makalesi", - "letter": "Mektup", - "magazineArticle": "Genel Dergi Makalesi", - "manuscript": "El Yazması", - "map": "Harita", - "newspaperArticle": "Gazete Makalesi", - "note": "Not", - "patent": "Patent", - "podcast": "Podcast", - "presentation": "Sunum", - "radioBroadcast": "Radyo Yayını", - "report": "Rapor", - "statute": "Kanun", - "thesis": "Tez", - "tvBroadcast": "TV Yayını", - "videoRecording": "Video Kaydı", - "webpage": "Web Sayfası" - }, - "fields": { - "abstractNote": "Ă–zet", - "accessDate": "Son EriÅŸim", - "applicationNumber": "Uygulama Numarası", - "archive": "ArÅŸiv", - "archiveLocation": "ArÅŸivdeki Yeri", - "artworkMedium": "Sanat Eseri Ortamı", - "artworkSize": "Sanat Eserinin Boyutu", - "assignee": "Devralan", - "audioFileType": "Dosya TĂ¼rĂ¼", - "audioRecordingFormat": "Biçim", - "billNumber": "Kanun Ă–nerge Numarası", - "blogTitle": "Blog BaÅŸlığı", - "bookTitle": "Kitap BaÅŸlığı", - "callNumber": "Yer Numarası", - "caseName": "Dava Adı", - "code": "Kanun", - "codeNumber": "Kanun Numarası", - "codePages": "Kanun Sayfası", - "codeVolume": "Kanun Cildi", - "committee": "Kurul", - "company": "Åirket", - "conferenceName": "Konferans Adı", - "country": "Ăœlke", - "court": "Mahkeme", - "date": "Tarih", - "dateAdded": "EklendiÄŸi Tarih", - "dateDecided": "Kesin Tarih", - "dateEnacted": "Kabul Tarihi", - "dateModified": "DeÄŸiÅŸtirme", - "dictionaryTitle": "SözlĂ¼k BaÅŸlığı", - "distributor": "Dağıtımcı", - "docketNumber": "Dava Numarası", - "documentNumber": "DokĂ¼man Numarası", - "DOI": "DOI", - "edition": "Baskı", - "encyclopediaTitle": "Ansiklopedi BaÅŸlığı", - "episodeNumber": "BölĂ¼m Numarası", - "extra": "İlave", - "filingDate": "BaÅŸvuru Tarihi", - "firstPage": "İlk Sayfa", - "forumTitle": "Forum/Liste BaÅŸlığı", - "genre": "ÇeÅŸit", - "history": "Tarihçe", - "institution": "Kurum", - "interviewMedium": "Ortam", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Sayı", - "issueDate": "Yayın Tarihi", - "issuingAuthority": "DĂ¼zenleyen Makam", - "itemType": "TĂ¼r", - "journalAbbreviation": "Dergi Kısaltması", - "label": "Plak ÅŸirketi", - "language": "Dil", - "legalStatus": "Hukuki Durum", - "legislativeBody": "Yasama Organı", - "letterType": "TĂ¼r", - "libraryCatalog": "KĂ¼tĂ¼phane KataloÄŸu", - "manuscriptType": "TĂ¼r", - "mapType": "TĂ¼r", - "meetingName": "Toplantı Adı", - "nameOfAct": "Kanun Adı", - "network": "AÄŸ", - "number": "Numara", - "numberOfVolumes": "Cilt Sayısı", - "numPages": "Sayfa Sayısı", - "pages": "Sayfa", - "patentNumber": "Patent Numarası", - "place": "Yayın Yeri", - "postType": "Post TĂ¼rĂ¼", - "presentationType": "TĂ¼r", - "priorityNumbers": "RĂ¼Ă§han Numarası", - "proceedingsTitle": "Bildiriler BaÅŸlığı", - "programmingLanguage": "Prog. Dili", - "programTitle": "Program BaÅŸlığı", - "publicationTitle": "Yayın", - "publicLawNumber": "Kamu Hukuku Numarası", - "publisher": "Yayıncı", - "references": "Kaynakça", - "reporter": "Raporlayan Kitap", - "reporterVolume": "Raporlayon Kitabın Cildi", - "reportNumber": "Rapor Numarası", - "reportType": "Rapor TĂ¼rĂ¼", - "rights": "Telif", - "runningTime": "Çalma SĂ¼resi", - "scale": "Boyutları", - "section": "BölĂ¼m", - "series": "Dizi", - "seriesNumber": "Dizi Numarası", - "seriesText": "Dizi Metni", - "seriesTitle": "Dizi BaÅŸlığı", - "session": "Oturum", - "shortTitle": "Kısa BaÅŸlık", - "studio": "StĂ¼dyo", - "subject": "Konu", - "system": "Sistem", - "thesisType": "TĂ¼r", - "title": "BaÅŸlık", - "university": "Ăœniversite", - "url": "URL", - "versionNumber": "SĂ¼rĂ¼m", - "videoRecordingFormat": "Biçim", - "volume": "Cilt", - "websiteTitle": "Web sitesi BaÅŸlığı", - "websiteType": "Website TĂ¼rĂ¼" - }, - "creatorTypes": { - "artist": "Sanatçı", - "attorneyAgent": "Avukat/Vekil", - "author": "Yazar", - "bookAuthor": "Kitap Yazarı", - "cartographer": "Haritacı", - "castMember": "Oyuncu", - "commenter": "Yorumcu", - "composer": "Besteci", - "contributor": "Katkıda Bulunan", - "cosponsor": "Birlikte Destekleyen", - "counsel": "Avukat", - "director": "Yönetmen", - "editor": "Editör", - "guest": "Konuk", - "interviewee": "GörĂ¼ÅŸme Yapılan", - "interviewer": "GörĂ¼ÅŸmeci", - "inventor": "BuluÅŸ Sahibi", - "performer": "Yorumcu", - "podcaster": "Podcast yapan", - "presenter": "Sunucu", - "producer": "Yapımcı", - "programmer": "Programcı", - "recipient": "Alıcı", - "reviewedAuthor": "EleÅŸtirilen Yazar", - "scriptwriter": "Senaryo Yazarı", - "seriesEditor": "Dizi EditörĂ¼", - "sponsor": "Destekleyen", - "translator": "Çevirmen", - "wordsBy": "Yazan" - } - }, - "uk-UA": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Đ’Đ¸Ñ‚Đ²Ñ–Ñ€ Đ¼Đ¸ÑÑ‚ĐµÑ†Ñ‚Đ²Đ°", - "attachment": "Đ’ĐºĐ»Đ°Đ´ĐµĐ½Đ½Ñ", - "audioRecording": "ĐÑƒĐ´Ñ–Đ¾Đ·Đ°Đ¿Đ¸Ñ", - "bill": "Đ—Đ°ĐºĐ¾Đ½Đ¾Đ¿Ñ€Đ¾ĐµĐºÑ‚", - "blogPost": "Đ—Đ°Đ¿Đ¸Ñ Đ² Đ±Đ»Đ¾Đ·Ñ–", - "book": "ĐĐ½Đ¸Đ³Đ°", - "bookSection": "Đ“Đ»Đ°Đ²Đ° ĐºĐ½Đ¸Đ³Đ¸", - "case": "Đ¡Đ¿Ñ€Đ°Đ²Đ°", - "computerProgram": "Software", - "conferencePaper": "Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚ ĐºĐ¾Đ½Ñ„ĐµÑ€ĐµĐ½Ñ†Ñ–Ñ—", - "dictionaryEntry": "Đ¡Ñ‚Đ°Ñ‚Ñ‚Ñ Đ·Ñ– ÑĐ»Đ¾Đ²Đ½Đ¸ĐºĐ°", - "document": "Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚", - "email": "E-mail", - "encyclopediaArticle": "Đ¡Ñ‚Đ°Ñ‚Ñ‚Ñ Đ· ĐµĐºÑ†Đ¸ĐºĐ»Đ¾Đ¿ĐµĐ´Ñ–Ñ—", - "film": "Đ¤Ñ–Đ»ÑŒĐ¼", - "forumPost": "Đ—Đ°Đ¿Đ¸Ñ Đ½Đ° Ñ„Đ¾Ñ€ÑƒĐ¼Ñ–", - "hearing": "Đ¡Đ»ÑƒÑ…Đ°Đ½Đ½Ñ", - "instantMessage": "ĐœĐ¸Ñ‚Ñ‚Ñ”Đ²Đµ Đ¿Đ¾Đ²Ñ–Đ´Đ¾Đ¼Đ»ĐµĐ½Đ½Ñ", - "interview": "Đ†Đ½Ñ‚ĐµÑ€Đ²'Ñ", - "journalArticle": "Đ¡Ñ‚Đ°Ñ‚Ñ‚Ñ Đ· Đ¶ÑƒÑ€Đ½Đ°Đ»Ñƒ", - "letter": "ЛиÑÑ‚", - "magazineArticle": "Đ¡Ñ‚Đ°Ñ‚Ñ‚Ñ Đ· Đ¿ĐµÑ€Ñ–Đ¾Đ´Đ¸ĐºĐ¸", - "manuscript": "Đ ÑƒĐºĐ¾Đ¿Đ¸Ñ", - "map": "ĐĐ°Ñ€Ñ‚Đ°", - "newspaperArticle": "Đ¡Ñ‚Đ°Ñ‚Ñ‚Ñ Đ· Đ³Đ°Đ·ĐµÑ‚Đ¸", - "note": "ĐŸÑ€Đ¸Đ¼Ñ–Ñ‚ĐºĐ°", - "patent": "ĐŸĐ°Ñ‚ĐµĐ½Ñ‚", - "podcast": "ĐŸĐ¾Đ´ĐºĐ°ÑÑ‚", - "presentation": "ĐŸÑ€ĐµĐ·ĐµĐ½Ñ‚Đ°Ñ†Ñ–Ñ", - "radioBroadcast": "Đ Đ°Đ´Ñ–Đ¾ Đ¿ĐµÑ€ĐµĐ´Đ°Ñ‡Đ°", - "report": "Đ—Đ²Ñ–Ñ‚", - "statute": "Đ¡Ñ‚Đ°Ñ‚ÑƒÑ‚", - "thesis": "ДиÑĐµÑ€Ñ‚Đ°Ñ†Ñ–Ñ", - "tvBroadcast": "Đ¢ĐµĐ»ĐµĐ²Ñ–Đ·Ñ–Đ¹Đ½Đ° Đ¿ĐµÑ€ĐµĐ´Đ°Ñ‡Đ°", - "videoRecording": "Đ’Ñ–Đ´ĐµĐ¾ Đ·Đ°Đ¿Đ¸Ñ", - "webpage": "Веб ÑÑ‚Đ¾Ñ€Ñ–Đ½ĐºĐ°" - }, - "fields": { - "abstractNote": "ĐĐ½Đ¾Ñ‚Đ°Ñ†Ñ–Ñ", - "accessDate": "Đ”Đ°Ñ‚Đ° Đ´Đ¾ÑÑ‚ÑƒĐ¿Ñƒ", - "applicationNumber": "ĐĐ¾Đ¼ĐµÑ€ заÑĐ²ĐºĐ¸", - "archive": "ĐÑ€Ñ…Ñ–Đ²", - "archiveLocation": "ĐœÑ–ÑÑ†Đµ Đ² Đ°Ñ€Ñ…Ñ–Đ²Ñ–", - "artworkMedium": "Đ¥ÑƒĐ´Đ¾Đ¶Đ½Ñ–Đ¹ заÑÑ–Đ±", - "artworkSize": "Đ Đ¾Đ·Đ¼Ñ–Ñ€ Ñ€Đ¾Đ±Đ¾Ñ‚Đ¸", - "assignee": "ĐŸÑ€ĐµĐ´ÑÑ‚Đ°Đ²Đ½Đ¸Đº", - "audioFileType": "Đ¢Đ¸Đ¿ Ñ„Đ°Đ¹Đ»Ñƒ", - "audioRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "billNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ·Đ°ĐºĐ¾Đ½Đ¾Đ¿Ñ€.", - "blogTitle": "ĐĐ°Đ·Đ²Đ° Đ±Đ»Đ¾Đ³Ñƒ", - "bookTitle": "ĐĐ°Đ·Đ²Đ° ĐºĐ½Đ¸Đ³Đ¸", - "callNumber": "Đ¨Đ¸Ñ„Ñ€", - "caseName": "ĐĐ¾Đ¼ĐµÑ€ ÑĐ¿Ñ€Đ°Đ²Đ¸", - "code": "ĐĐ¾Đ´", - "codeNumber": "ĐĐ¾Đ¼ĐµÑ€ ĐºĐ¾Đ´Ñƒ", - "codePages": "ĐĐ¾Đ´ ÑÑ‚Đ¾Ñ€Ñ–Đ½ĐºĐ¸", - "codeVolume": "ĐĐ¾Đ´ Ñ‚Đ¾Đ¼Ñƒ", - "committee": "ĐĐ¾Đ¼Ñ–Ñ‚ĐµÑ‚", - "company": "ĐĐ¾Đ¼Đ¿Đ°Đ½Ñ–Ñ", - "conferenceName": "ĐĐ°Đ·Đ²Đ° ĐºĐ¾Đ½Ñ„ĐµÑ€.", - "country": "ĐÑ€Đ°Ñ—Đ½Đ°", - "court": "Đ¡ÑƒĐ´", - "date": "Đ”Đ°Ñ‚Đ°", - "dateAdded": "Đ”Đ°Ñ‚Đ° Đ´Đ¾Đ´Đ°Đ²Đ°Đ½Đ½Ñ", - "dateDecided": "Đ”Đ°Ñ‚Đ° Ñ€Ñ–ÑˆĐµĐ½Đ½Ñ", - "dateEnacted": "Đ”Đ°Ñ‚Đ° Đ¿Đ¾ÑÑ‚Đ°Đ½Đ¾Đ²Đ¸", - "dateModified": "Đ”Đ°Ñ‚Đ° Đ·Đ¼Ñ–Đ½Đ¸", - "dictionaryTitle": "ĐĐ°Đ·Đ²Đ° ÑĐ»Đ¾Đ²Đ½Đ¸ĐºĐ°", - "distributor": "Đ‘Ñ–Đ±Đ». ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³", - "docketNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ²Đ¸ÑÑ‚Đ°Đ²ĐºĐ¸", - "documentNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚Đ°", - "DOI": "DOI", - "edition": "Đ’Đ¸Đ´Đ°Đ½Đ½Ñ", - "encyclopediaTitle": "ĐĐ°Đ·Đ²Đ° ĐµĐ½Ñ†Đ¸ĐºĐ».", - "episodeNumber": "ĐĐ¾Đ¼ĐµÑ€ ĐµĐ¿Ñ–Đ·Đ¾Đ´Ñƒ", - "extra": "Đ”Đ¾Đ´Đ°Ñ‚ĐºĐ¾Đ²Đ¾", - "filingDate": "Đ”Đ°Ñ‚Đ° заÑĐ²ĐºĐ¸", - "firstPage": "ĐŸĐµÑ€ÑˆĐ° ÑÑ‚Đ¾Ñ€.", - "forumTitle": "Đ¤Đ¾Ñ€ÑƒĐ¼/Listserv", - "genre": "Đ–Đ°Đ½Ñ€", - "history": "ІÑÑ‚Đ¾Ñ€Ñ–Ñ", - "institution": "Đ—Đ°ĐºĐ»Đ°Đ´", - "interviewMedium": "ЗаÑÑ–Đ±", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Đ’Đ¸Đ¿ÑƒÑĐº", - "issueDate": "Đ”Đ°Ñ‚Đ° Đ²Đ¸Đ¿ÑƒÑĐºÑƒ", - "issuingAuthority": "ĐĐ¸Đ¼ Đ²Đ¸Đ´Đ°Đ½Đ°", - "itemType": "Đ¢Đ¸Đ¿", - "journalAbbreviation": "Đ–ÑƒÑ€Đ½Đ°Đ» ÑĐºĐ¾Ñ€.", - "label": "ĐĐ°Đ¿Đ¸Ñ", - "language": "ĐœĐ¾Đ²Đ°", - "legalStatus": "ĐŸÑ€Đ°Đ²Đ¾Đ²Đ¸Đ¹ ÑÑ‚Đ°Ñ‚ÑƒÑ", - "legislativeBody": "Đ—Đ°ĐºĐ¾Đ½Đ¾Ñ‚Đ²Đ¾Ñ€. Đ¾Ñ€Đ³Đ°Đ½", - "letterType": "Đ¢Đ¸Đ¿", - "libraryCatalog": "Đ‘Ñ–Đ±Đ». ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³", - "manuscriptType": "Đ¢Đ¸Đ¿", - "mapType": "Đ¢Đ¸Đ¿", - "meetingName": "ĐĐ°Đ·Đ²Đ° Đ·ÑƒÑтрічі", - "nameOfAct": "ĐĐ°Đ·Đ²Đ° Đ¿Đ¾ÑÑ‚Đ°Đ½Đ¾Đ²Đ¸", - "network": "ĐœĐµÑ€ĐµĐ¶Đ°", - "number": "ĐĐ¾Đ¼ĐµÑ€", - "numberOfVolumes": "ĐÑ–Đ»ÑŒĐº. Ñ‚Đ¾Đ¼Ñ–Đ²", - "numPages": "ĐÑ–Đ»ÑŒĐº. ÑÑ‚Đ¾Ñ€Ñ–Đ½Đ¾Đº", - "pages": "Đ¡Ñ‚Đ¾Ñ€Ñ–Đ½ĐºĐ¸", - "patentNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ¿Đ°Ñ‚ĐµĐ½Ñ‚Ñƒ", - "place": "ĐœÑ–ÑÑ†Đµ", - "postType": "Đ¢Đ¸Đ¿ Đ¿Đ¾Đ²Ñ–Đ´Đ¾Đ¼Đ»ĐµĐ½Đ½Ñ", - "presentationType": "Đ¢Đ¸Đ¿", - "priorityNumbers": "ĐĐ¾Đ¼ĐµÑ€ Đ¿Ñ€Ñ–Đ¾Ñ€Đ¸Ñ‚ĐµÑ‚Ñƒ", - "proceedingsTitle": "ĐĐ°Đ·Đ²Đ° Đ¿Ñ€Đ°Ñ†ÑŒ", - "programmingLanguage": "Prog. Language", - "programTitle": "ĐĐ°Đ·Đ²Đ° Đ¿Ñ€Đ¾Đ³Ñ€Đ°Đ¼Đ¸", - "publicationTitle": "ĐŸÑƒĐ±Đ»Ñ–ĐºĐ°Ñ†Ñ–Ñ", - "publicLawNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ·Đ°ĐºĐ¾Đ½Ñƒ", - "publisher": "Đ’Đ¸Đ´Đ°Đ²Đ½Đ¸Đº", - "references": "ĐŸĐ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ", - "reporter": "Đ ĐµĐ¿Đ¾Ñ€Ñ‚ĐµÑ€", - "reporterVolume": "Đ¢Đ¾Đ¼ Đ·Đ²Ñ–Ñ‚Ñƒ", - "reportNumber": "ĐĐ¾Đ¼ĐµÑ€ Đ·Đ²Ñ–Ñ‚Ñƒ", - "reportType": "Đ¢Đ¸Đ¿ Đ·Đ²Ñ–Ñ‚Ñƒ", - "rights": "ĐŸÑ€Đ°Đ²Đ°", - "runningTime": "Đ¢Ñ€Đ¸Đ²Đ°Đ»Ñ–Ñть", - "scale": "ĐœĐ°ÑÑˆÑ‚Đ°Đ±", - "section": "Đ Đ¾Đ·Đ´Ñ–Đ»", - "series": "Đ¡ĐµÑ€Ñ–Ñ", - "seriesNumber": "ĐĐ¾Đ¼ĐµÑ€ ÑĐµÑ€Ñ–Ñ—", - "seriesText": "Đ¢ĐµĐºÑÑ‚ ÑĐµÑ€Ñ–Ñ—", - "seriesTitle": "ĐĐ°Đ·Đ²Đ° ÑĐµÑ€Ñ–Ñ—", - "session": "Đ¡ĐµÑÑ–Ñ", - "shortTitle": "Đ¡ĐºĐ¾Ñ€. Đ½Đ°Đ·Đ²Đ°", - "studio": "Đ¡Ñ‚ÑƒĐ´Ñ–Ñ", - "subject": "Đ¢ĐµĐ¼Đ°", - "system": "Đ¡Đ¸ÑÑ‚ĐµĐ¼Đ°", - "thesisType": "Đ¢Đ¸Đ¿", - "title": "ĐĐ°Đ·Đ²Đ°", - "university": "Đ£Đ½Ñ–Đ²ĐµÑ€ÑĐ¸Ñ‚ĐµÑ‚", - "url": "URL", - "versionNumber": "Đ’ĐµÑ€ÑÑ–Ñ", - "videoRecordingFormat": "Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚", - "volume": "Đ¢Đ¾Đ¼", - "websiteTitle": "ĐĐ°Đ·Đ²Đ° Đ²ĐµĐ±-ÑĐ°Đ¹Ñ‚Ñƒ\\n", - "websiteType": "Đ¢Đ¸Đ¿ Đ²ĐµĐ±-ÑĐ°Đ¹Ñ‚Ñƒ" - }, - "creatorTypes": { - "artist": "Đ¥ÑƒĐ´Đ¾Đ¶Đ½Đ¸Đº", - "attorneyAgent": "ĐĐ´Đ²Đ¾ĐºĐ°Ñ‚/ĐĐ³ĐµĐ½Ñ‚", - "author": "ĐĐ²Ñ‚Đ¾Ñ€", - "bookAuthor": "ĐĐ²Ñ‚Đ¾Ñ€ ĐºĐ½Đ¸Đ³Đ¸", - "cartographer": "ĐĐ°Ñ€Ñ‚Đ¾Đ³Ñ€Đ°Ñ„", - "castMember": "ĐĐºÑ‚Đ¾Ñ€", - "commenter": "ĐĐ¾Đ¼ĐµĐ½Ñ‚Đ°Ñ‚Đ¾Ñ€", - "composer": "ĐĐ¾Đ¼Đ¿Đ¾Đ·Đ¸Ñ‚Đ¾Ñ€", - "contributor": "Đ¡Đ¿Ñ–Đ²Đ°Đ²Ñ‚Đ¾Ñ€", - "cosponsor": "Đ¡Đ¿Đ¾Đ½ÑĐ¾Ñ€", - "counsel": "Đ Đ°Đ´Đ½Đ¸Đº", - "director": "РежиÑĐµÑ€", - "editor": "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€", - "guest": "Đ“Ñ–Ñть", - "interviewee": "Đ¡Đ¿Ñ–Đ²Đ±ĐµÑÑ–Đ´Đ° Đ·", - "interviewer": "Đ†Đ½Ñ‚ĐµÑ€Đ²'ÑĐµÑ€", - "inventor": "Đ’Đ¸Đ½Đ°Ñ…Ñ–Đ´Đ½Đ¸Đº", - "performer": "Đ’Đ¸ĐºĐ¾Đ½Đ°Đ²ĐµÑ†ÑŒ", - "podcaster": "ĐŸÑ–Đ´ĐºĐ°ÑÑ‚ĐµÑ€", - "presenter": "Đ”Đ¾Đ¿Đ¾Đ²Ñ–Đ´Đ°Ñ‡", - "producer": "ĐŸÑ€Đ¾Đ´ÑÑĐµÑ€", - "programmer": "ĐŸÑ€Đ¾Đ³Ñ€Đ°Đ¼Ñ–ÑÑ‚", - "recipient": "ĐÑ‚Ñ€Đ¸Đ¼ÑƒĐ²Đ°Ñ‡", - "reviewedAuthor": "Đ ĐµÑ†ĐµĐ½Đ·. Đ°Đ²Ñ‚Đ¾Ñ€", - "scriptwriter": "Đ¡Ñ†ĐµĐ½Đ°Ñ€Đ¸ÑÑ‚", - "seriesEditor": "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ ÑĐµÑ€Ñ–Ñ—", - "sponsor": "Đ¡Đ¿Đ¾Đ½ÑĐ¾Ñ€", - "translator": "ĐŸĐµÑ€ĐµĐºĐ»Đ°Đ´Đ°Ñ‡", - "wordsBy": "ĐĐ²Ñ‚Đ¾Ñ€ ÑĐ»Ñ–Đ²" - } - }, - "vi-VN": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "Minh há»a", - "attachment": "Phần đính kèm", - "audioRecording": "Ghi Ă¢m", - "bill": "Dá»± thảo luật", - "blogPost": "BĂ i viết trĂªn Blog", - "book": "SĂ¡ch", - "bookSection": "Äoạn SĂ¡ch", - "case": "Vụ việc", - "computerProgram": "Software", - "conferencePaper": "BĂ¡o cĂ¡o Há»™i thảo", - "dictionaryEntry": "Mục từ trong Từ Ä‘iển", - "document": "TĂ i liệu", - "email": "Thư Ä‘iện tá»­", - "encyclopediaArticle": "BĂ i viết trong BĂ¡ch khoa toĂ n thư", - "film": "Phim", - "forumPost": "BĂ i viết trĂªn Diá»…n đàn", - "hearing": "PhiĂªn xĂ©t xá»­", - "instantMessage": "Tin nhắn", - "interview": "Phá»ng vấn", - "journalArticle": "BĂ i viết trong Tập san", - "letter": "Thư", - "magazineArticle": "BĂ i viết trong Tạp chĂ­", - "manuscript": "Bản thảo", - "map": "Bản đồ", - "newspaperArticle": "BĂ i viết trĂªn BĂ¡o", - "note": "Ghi chĂ©p", - "patent": "Bằng sĂ¡ng chế/Giấy phĂ©p độc quyá»n", - "podcast": "Podcast", - "presentation": "Trình bĂ y", - "radioBroadcast": "Tiết mục Truyá»n thanh", - "report": "PhĂ³ng sá»±/BĂ¡o cĂ¡o", - "statute": "Quy chế", - "thesis": "Luận văn", - "tvBroadcast": "Tiết mục Truyá»n hình", - "videoRecording": "Ghi hình", - "webpage": "Trang Web" - }, - "fields": { - "abstractNote": "TĂ³m tắt", - "accessDate": "NgĂ y truy cập", - "applicationNumber": "Số đơn", - "archive": "Lưu", - "archiveLocation": "Vị trĂ­ trong Lưu trữ", - "artworkMedium": "Chất liệu cá»§a tĂ¡c phẩm", - "artworkSize": "KĂ­ch thước tĂ¡c phẩm", - "assignee": "BĂªn được á»§y quyá»n", - "audioFileType": "Kiểu Tập tin", - "audioRecordingFormat": "Format", - "billNumber": "Số Dá»± thảo", - "blogTitle": "Nhan đỠBlog", - "bookTitle": "Nhan đỠsĂ¡ch", - "callNumber": "KĂ½ hiệu Xếp giĂ¡", - "caseName": "TĂªn cá»§a Vụ việc", - "code": "MĂ£", - "codeNumber": "Code Number", - "codePages": "Trang", - "codeVolume": "Số tập trong Bá»™ luật", - "committee": "Ủy ban", - "company": "CĂ´ng ty", - "conferenceName": "TĂªn Há»™i thảo", - "country": "Quốc gia", - "court": "TĂ²a Ă¡n", - "date": "NgĂ y", - "dateAdded": "NgĂ y Tạo lập", - "dateDecided": "NgĂ y PhĂ¡n Xá»­", - "dateEnacted": "NgĂ y cĂ³ Hiệu lá»±c", - "dateModified": "NgĂ y Thay đổi", - "dictionaryTitle": "TĂªn cá»§a Từ Äiển", - "distributor": "NhĂ  phĂ¢n phối", - "docketNumber": "Docket Number", - "documentNumber": "Số Văn bản", - "DOI": "DOI", - "edition": "Ấn bản", - "encyclopediaTitle": "TĂªn cá»§a BĂ¡ch Khoa ToĂ n Thư", - "episodeNumber": "Số Hồi", - "extra": "Phần bổ sung", - "filingDate": "Filing Date", - "firstPage": "Trang đầu", - "forumTitle": "TĂªn cá»§a Diá»…n đàn/Danh sĂ¡ch Thư Ä‘iện tá»­", - "genre": "Thể loại", - "history": "Lịch sá»­", - "institution": "Tổ chức/CÆ¡ quan", - "interviewMedium": "Phương tiện", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "Lần phĂ¡t hĂ nh", - "issueDate": "NgĂ y cấp", - "issuingAuthority": "Issuing Authority", - "itemType": "Kiểu", - "journalAbbreviation": "TĂªn rĂºt ngắn cá»§a Tập san", - "label": "NhĂ£n", - "language": "NgĂ´n ngữ", - "legalStatus": "Tình trạng PhĂ¡p lĂ½", - "legislativeBody": "CÆ¡ quan Lập phĂ¡p", - "letterType": "Kiểu", - "libraryCatalog": "Loại thư viện", - "manuscriptType": "Kiểu", - "mapType": "Kiểu", - "meetingName": "TĂªn Cuá»™c há»p", - "nameOfAct": "TĂªn cá»§a Bá»™ Luật", - "network": "Mạng", - "number": "Số", - "numberOfVolumes": "Số Tập", - "numPages": "# of Pages", - "pages": "Trang", - "patentNumber": "Số Bắng sĂ¡ng chế", - "place": "NÆ¡i xuất bản", - "postType": "Kiểu BĂ i viết", - "presentationType": "Kiểu", - "priorityNumbers": "Số Ưu tiĂªn", - "proceedingsTitle": "Nhan đỠcá»§a Ká»· yếu Há»™i nghị", - "programmingLanguage": "Prog. Language", - "programTitle": "Program Title", - "publicationTitle": "Ấn phẩm", - "publicLawNumber": "Số Luật DĂ¢n sá»±", - "publisher": "NhĂ  xuất bản", - "references": "Tham khảo", - "reporter": "PhĂ³ng viĂªn", - "reporterVolume": "Tập BĂ¡o cĂ¡o Luật", - "reportNumber": "Số PhĂ³ng sá»±/BĂ¡o cĂ¡o", - "reportType": "Kiểu PhĂ³ng sá»±/BĂ¡o cĂ¡o", - "rights": "Quyá»n hạn", - "runningTime": "Äá»™ dĂ i Thá»i gian", - "scale": "Tá»· lệ", - "section": "Äoạn", - "series": "TĂ¹ng thư", - "seriesNumber": "Số TĂ¹ng thư", - "seriesText": "MiĂªu tả TĂ¹ng thư", - "seriesTitle": "Nhan đỠcá»§a TĂ¹ng thư", - "session": "PhiĂªn", - "shortTitle": "Nhan đỠthu gá»n", - "studio": "Xưởng sản xuất", - "subject": "Chá»§ Ä‘á»", - "system": "Hệ thống", - "thesisType": "Kiểu", - "title": "Nhan Ä‘á»", - "university": "Trưá»ng Äại Há»c", - "url": "URL", - "versionNumber": "Version", - "videoRecordingFormat": "Format", - "volume": "Tập", - "websiteTitle": "TĂªn Website", - "websiteType": "Kiểu Website" - }, - "creatorTypes": { - "artist": "Nghệ sÄ©", - "attorneyAgent": "Luật sư/Äại diện phĂ¡p lĂ½", - "author": "TĂ¡c giả", - "bookAuthor": "Book Author", - "cartographer": "Ngưá»i vẽ bản đồ", - "castMember": "ThĂ nh viĂªn Ä‘oĂ n kịch", - "commenter": "Bình luận viĂªn", - "composer": "NhĂ  soạn nhạc", - "contributor": "Cá»™ng tĂ¡c viĂªn", - "cosponsor": "Cosponsor", - "counsel": "NhĂ  tư vấn", - "director": "Äạo diá»…n", - "editor": "BiĂªn tập viĂªn", - "guest": "KhĂ¡ch má»i", - "interviewee": "Ngưá»i được phá»ng vấn", - "interviewer": "Ngưá»i phá»ng vấn", - "inventor": "NhĂ  phĂ¡t minh", - "performer": "Ngưá»i biểu diá»…n", - "podcaster": "Podcaster", - "presenter": "Dẫn chương trình", - "producer": "NhĂ  sản xuất", - "programmer": "Lập trình viĂªn", - "recipient": "Ngưá»i nhận", - "reviewedAuthor": "NhĂ  phĂª bình/Ngưá»i phản biện", - "scriptwriter": "TĂ¡c giả Kịch bản", - "seriesEditor": "BiĂªn tập viĂªn cá»§a TĂ¹ng thư", - "sponsor": "TĂ i trợ/Äỡ đầu", - "translator": "BiĂªn dịch viĂªn", - "wordsBy": "Viết lá»i" - } - }, - "zh-CN": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "艺术å“", - "attachment": "附件", - "audioRecording": "音频剪辑", - "bill": "å¸å•", - "blogPost": "å客帖å­", - "book": "书ç±", - "bookSection": "图书章è‚", - "case": "案例", - "computerProgram": "软件", - "conferencePaper": "ä¼è®®è®ºæ–‡", - "dictionaryEntry": "è¯æ¡", - "document": "文档", - "email": "E-mail", - "encyclopediaArticle": "百科全书文章", - "film": "电影", - "forumPost": "论å›å¸–å­", - "hearing": "å¬è¯ä¼", - "instantMessage": "峿—¶è®¯æ¯", - "interview": "采访稿", - "journalArticle": "æœŸåˆæ–‡ç« ", - "letter": "ä¿¡ä»¶", - "magazineArticle": "æ‚志文章", - "manuscript": "手稿", - "map": "地图", - "newspaperArticle": "æ¥çº¸æ–‡ç« ", - "note": "笔记", - "patent": "专利", - "podcast": "播客", - "presentation": "演示文档", - "radioBroadcast": "电å°å¹¿æ’­", - "report": "æ¥å‘", - "statute": "法规", - "thesis": "å­¦ä½è®ºæ–‡", - "tvBroadcast": "TV 广播", - "videoRecording": "视频剪辑", - "webpage": "网页" - }, - "fields": { - "abstractNote": "摘è¦", - "accessDate": "访问时间", - "applicationNumber": "申请å·", - "archive": "档案", - "archiveLocation": "存档ä½ç½®", - "artworkMedium": "艺术å“媒介", - "artworkSize": "艺术å“尺寸", - "assignee": "å—æ‰˜äºº", - "audioFileType": "音频文件类å‹", - "audioRecordingFormat": "音频格å¼", - "billNumber": "案例编å·", - "blogTitle": "å客标题", - "bookTitle": "书å", - "callNumber": "引用次数", - "caseName": "案例åç§°", - "code": "代ç ", - "codeNumber": "区å·", - "codePages": "代ç é¡µç ", - "codeVolume": "代ç å·", - "committee": "委员ä¼", - "company": "å…¬å¸", - "conferenceName": "学术ä¼è®®åç§°", - "country": "国家", - "court": "法庭", - "date": "日期", - "dateAdded": "æ·»å æ—¥æœŸ", - "dateDecided": "确认日期", - "dateEnacted": "åˆ¶å®æ—¥æœŸ", - "dateModified": "修改日期", - "dictionaryTitle": "è¯å…¸æ ‡é¢˜", - "distributor": "分å‘者", - "docketNumber": "案å·å·", - "documentNumber": "文档编å·", - "DOI": "DOI", - "edition": "图书版本", - "encyclopediaTitle": "百科全书标题", - "episodeNumber": "集数", - "extra": "其它", - "filingDate": "申请日期", - "firstPage": "首页", - "forumTitle": "论å›/列表æœå¡æ ‡é¢˜", - "genre": "æµæ´¾", - "history": "å†å²", - "institution": "机æ„组织", - "interviewMedium": "采访媒体", - "ISBN": "ISBN", - "ISSN": "ISSN", - "issue": "期", - "issueDate": "ç­¾å‘æ—¥æœŸ", - "issuingAuthority": "é¢å‘机æ„", - "itemType": "ç±»å‹", - "journalAbbreviation": "åˆå缩写", - "label": "标记", - "language": "语言", - "legalStatus": "法律地ä½", - "legislativeBody": "立法机æ„", - "letterType": "ä¿¡ä»¶ç±»å‹", - "libraryCatalog": "馆è—目录", - "manuscriptType": "手稿类å‹", - "mapType": "地图类å‹", - "meetingName": "ä¼è®®åç§°", - "nameOfAct": "法令åç§°", - "network": "网络", - "number": "å·ç ", - "numberOfVolumes": "æ€»å·æ•°", - "numPages": "总页数", - "pages": "页ç ", - "patentNumber": "专利å·", - "place": "地点", - "postType": "帖å­ç±»å‹", - "presentationType": "演稿类å‹", - "priorityNumbers": "优先申请å·", - "proceedingsTitle": "æ•递标题", - "programmingLanguage": "Prog. 语言", - "programTitle": "è‚ç›®åç§°", - "publicationTitle": "期åˆ", - "publicLawNumber": "国际公法å·", - "publisher": "出版社", - "references": "å‚考文献", - "reporter": "æ¥å‘人", - "reporterVolume": "æ¥å‘å·", - "reportNumber": "æ¥å‘ç¼–å·", - "reportType": "æ¥å‘ç±»å‹", - "rights": "版æƒ", - "runningTime": "æ—¶é•¿", - "scale": "比例", - "section": "ç« è‚", - "series": "系列", - "seriesNumber": "系列编å·", - "seriesText": "系列文本", - "seriesTitle": "系列标题", - "session": "伿œŸ", - "shortTitle": "短标题", - "studio": "工作室", - "subject": "主题", - "system": "系统", - "thesisType": "论文类å‹", - "title": "标题", - "university": "大学", - "url": "URL", - "versionNumber": "版本", - "videoRecordingFormat": "视频格å¼", - "volume": "å·", - "websiteTitle": "网站标题", - "websiteType": "网站类å‹" - }, - "creatorTypes": { - "artist": "艺术家", - "attorneyAgent": "律师/代ç†äºº", - "author": "作者", - "bookAuthor": "图书作者", - "cartographer": "制图人", - "castMember": "演员阵容", - "commenter": "评论人", - "composer": "创作者", - "contributor": "贡献者", - "cosponsor": "åˆä½œä½œè€…", - "counsel": "顾问", - "director": "导演", - "editor": "编辑", - "guest": "宾客", - "interviewee": "采访对象", - "interviewer": "采访者", - "inventor": "呿˜äºº", - "performer": "表演者", - "podcaster": "播客", - "presenter": "æ¥å‘人", - "producer": "制片人", - "programmer": "程åºå‘˜", - "recipient": "æ¥æ”¶è€…", - "reviewedAuthor": "审稿人", - "scriptwriter": "编剧", - "seriesEditor": "丛书编辑", - "sponsor": "èµå©å•†", - "translator": "译者", - "wordsBy": "作è¯" - } - }, - "zh-TW": { - "itemTypes": { - "annotation": "Annotation", - "artwork": "è—術作å“", - "attachment": "附件檔", - "audioRecording": "錄音", - "bill": "法案", - "blogPost": "éƒ¨è½æ ¼è²¼æ–‡", - "book": "書", - "bookSection": "書ç„章節", - "case": "案例", - "computerProgram": "軟體", - "conferencePaper": "會議論文", - "dictionaryEntry": "å­—å…¸æ¢ç›®", - "document": "文件", - "email": "é›»å­éƒµä»¶", - "encyclopediaArticle": "百科全書文章", - "film": "影片", - "forumPost": "論壇貼文", - "hearing": "è½è­‰æœƒ", - "instantMessage": "峿™‚è¨æ¯", - "interview": "訪談", - "journalArticle": "æœŸåˆæ–‡ç« ", - "letter": "ä¿¡ä»¶", - "magazineArticle": "雜誌文章", - "manuscript": "手稿", - "map": "地圖", - "newspaperArticle": "報紙文章", - "note": "筆記", - "patent": "專利", - "podcast": "播客", - "presentation": "ç°¡å ±", - "radioBroadcast": "é›»å°å»£æ’­", - "report": "å ±å‘", - "statute": "法è¦", - "thesis": "碩å士論文", - "tvBroadcast": "電視廣播", - "videoRecording": "錄影", - "webpage": "ç¶²é " - }, - "fields": { - "abstractNote": "摘è¦", - "accessDate": "å–用", - "applicationNumber": "申請號碼", - "archive": "存庫", - "archiveLocation": "文件庫中ç„ä½ç½®", - "artworkMedium": "中", - "artworkSize": "è—術作å“大å°", - "assignee": "代ç†äºº", - "audioFileType": "檔案é¡å‹", - "audioRecordingFormat": "æ ¼å¼", - "billNumber": "法案編號", - "blogTitle": "éƒ¨è½æ ¼æ¨™é¡Œ", - "bookTitle": "書å", - "callNumber": "索書號", - "caseName": "案件å稱", - "code": "法è¦(code)", - "codeNumber": "法è¦(code)編號", - "codePages": "法è¦(code)é æ¬¡", - "codeVolume": "法è¦(code)å·æ¬¡", - "committee": "委員會", - "company": "å…¬å¸", - "conferenceName": "會議å稱", - "country": "國家", - "court": "法庭", - "date": "日期", - "dateAdded": "å å…¥æ—¥æœŸ", - "dateDecided": "æ±ºå®æ—¥æœŸ", - "dateEnacted": "頒布日期", - "dateModified": "修改日期", - "dictionaryTitle": "å­—å…¸å稱", - "distributor": "發行人", - "docketNumber": "表件號碼", - "documentNumber": "文件號碼", - "DOI": "數ä½ç‰©ä»¶è­˜åˆ¥è™Ÿ(DOI)", - "edition": "版本", - "encyclopediaTitle": "百科全書書å", - "episodeNumber": "å‡é›†è™Ÿç¢¼", - "extra": "é¡å¤–å¢åˆ—", - "filingDate": "歸檔日期", - "firstPage": "èµ·å§‹é ", - "forumTitle": "論壇/郵寄æœå‹™æ¨™é¡Œ", - "genre": "æµæ´¾", - "history": "æ­·å²", - "institution": "機構", - "interviewMedium": "中", - "ISBN": "åœ‹é›æ¨™æº–書號(ISBN)", - "ISSN": "åœ‹é›æ¨™æº–期åˆè™Ÿ(ISSN)", - "issue": "期號", - "issueDate": "ç™¼åˆæ—¥æœŸ", - "issuingAuthority": "發行當局", - "itemType": "é¡å‹", - "journalAbbreviation": "期åˆç°¡å¯«", - "label": "商標", - "language": "èªè¨€", - "legalStatus": "法律地ä½", - "legislativeBody": "立法機構", - "letterType": "é¡å‹", - "libraryCatalog": "æ–‡ç»åº«ç›®éŒ„", - "manuscriptType": "é¡å‹", - "mapType": "é¡å‹", - "meetingName": "會議å稱", - "nameOfAct": "法令(Act)å稱", - "network": "網路", - "number": "號碼", - "numberOfVolumes": "ç¸½å·æ•¸", - "numPages": "é æ•¸", - "pages": "é ", - "patentNumber": "專利號", - "place": "所在地", - "postType": "貼文é¡å‹", - "presentationType": "é¡å‹", - "priorityNumbers": "å„ªå…ˆæ¬æ¡ˆè™Ÿ", - "proceedingsTitle": "會議論文集標題", - "programmingLanguage": "Prog. Language", - "programTitle": "節目標題", - "publicationTitle": "著作", - "publicLawNumber": "公法號碼", - "publisher": "出版者", - "references": "åƒè€ƒæ–‡ç»", - "reporter": "å ±å‘人", - "reporterVolume": "å ±å‘äººå·æ¬¡", - "reportNumber": "å ±å‘編號", - "reportType": "å ±å‘é¡å‹", - "rights": "æ¬åˆ©", - "runningTime": "播放時間", - "scale": "比例", - "section": "章節", - "series": "系列", - "seriesNumber": "系列號數", - "seriesText": "系列文", - "seriesTitle": "系列標題", - "session": "會議時程", - "shortTitle": "短å", - "studio": "工作室", - "subject": "主題", - "system": "系統", - "thesisType": "é¡å‹", - "title": "標題", - "university": "大學", - "url": "URL", - "versionNumber": "版本", - "videoRecordingFormat": "æ ¼å¼", - "volume": "å·æ¬¡", - "websiteTitle": "網站標題", - "websiteType": "網站é¡å‹" - }, - "creatorTypes": { - "artist": "è—è¡“å®¶", - "attorneyAgent": "律師/代ç†äºº", - "author": "作者", - "bookAuthor": "書ç±ä½œè€…", - "cartographer": "製圖者", - "castMember": "演員陣容", - "commenter": "è©•è«–å®¶", - "composer": "作曲者", - "contributor": "è²¢ç»è€…", - "cosponsor": "å…±åŒè´å©è€…", - "counsel": "é¡§å•", - "director": "å°æ¼”", - "editor": "編輯者", - "guest": "來賓", - "interviewee": "å—訪者", - "interviewer": "訪談者", - "inventor": "發æ˜äºº", - "performer": "表演者", - "podcaster": "播客", - "presenter": "簡報者", - "producer": "製作人", - "programmer": "節目設計者", - "recipient": "é ˜å—者", - "reviewedAuthor": "所評論ç„作者", - "scriptwriter": "ç·¨å‡", - "seriesEditor": "系列編輯者", - "sponsor": "è´å©è€…", - "translator": "翻譯者", - "wordsBy": "敘述者" - } - } - } -}; -var initSchema = Zotero.Schema.init; - -Zotero.Schema.init = function() { - initSchema(data); -}; \ No newline at end of file diff --git a/external-scripts/tlds.js b/external-scripts/tlds.js deleted file mode 100644 index ffb3bc64..00000000 --- a/external-scripts/tlds.js +++ /dev/null @@ -1,274 +0,0 @@ -const TLDS = { - "ac": true, - "ad": true, - "ae": true, - "aero": true, - "af": true, - "ag": true, - "ai": true, - "al": true, - "am": true, - "an": true, - "ao": true, - "aq": true, - "ar": true, - "arpa": true, - "as": true, - "asia": true, - "at": true, - "au": true, - "aw": true, - "ax": true, - "az": true, - "ba": true, - "bb": true, - "bd": true, - "be": true, - "bf": true, - "bg": true, - "bh": true, - "bi": true, - "biz": true, - "bj": true, - "bm": true, - "bn": true, - "bo": true, - "br": true, - "bs": true, - "bt": true, - "bv": true, - "bw": true, - "by": true, - "bz": true, - "ca": true, - "cat": true, - "cc": true, - "cd": true, - "cf": true, - "cg": true, - "ch": true, - "ci": true, - "ck": true, - "cl": true, - "cm": true, - "cn": true, - "co": true, - "com": true, - "coop": true, - "cr": true, - "cu": true, - "cv": true, - "cx": true, - "cy": true, - "cz": true, - "de": true, - "dj": true, - "dk": true, - "dm": true, - "do": true, - "dz": true, - "ec": true, - "edu": true, - "ee": true, - "eg": true, - "er": true, - "es": true, - "et": true, - "eu": true, - "fi": true, - "fj": true, - "fk": true, - "fm": true, - "fo": true, - "fr": true, - "ga": true, - "gb": true, - "gd": true, - "ge": true, - "gf": true, - "gg": true, - "gh": true, - "gi": true, - "gl": true, - "gm": true, - "gn": true, - "gov": true, - "gp": true, - "gq": true, - "gr": true, - "gs": true, - "gt": true, - "gu": true, - "gw": true, - "gy": true, - "hk": true, - "hm": true, - "hn": true, - "hr": true, - "ht": true, - "hu": true, - "id": true, - "ie": true, - "il": true, - "im": true, - "in": true, - "info": true, - "int": true, - "io": true, - "iq": true, - "ir": true, - "is": true, - "it": true, - "je": true, - "jm": true, - "jo": true, - "jobs": true, - "jp": true, - "ke": true, - "kg": true, - "kh": true, - "ki": true, - "km": true, - "kn": true, - "kp": true, - "kr": true, - "kw": true, - "ky": true, - "kz": true, - "la": true, - "lb": true, - "lc": true, - "li": true, - "lk": true, - "lr": true, - "ls": true, - "lt": true, - "lu": true, - "lv": true, - "ly": true, - "ma": true, - "mc": true, - "md": true, - "me": true, - "mg": true, - "mh": true, - "mil": true, - "mk": true, - "ml": true, - "mm": true, - "mn": true, - "mo": true, - "mobi": true, - "mp": true, - "mq": true, - "mr": true, - "ms": true, - "mt": true, - "mu": true, - "museum": true, - "mv": true, - "mw": true, - "mx": true, - "my": true, - "mz": true, - "na": true, - "name": true, - "nc": true, - "ne": true, - "net": true, - "nf": true, - "ng": true, - "ni": true, - "nl": true, - "no": true, - "np": true, - "nr": true, - "nu": true, - "nz": true, - "om": true, - "org": true, - "pa": true, - "pe": true, - "pf": true, - "pg": true, - "ph": true, - "pk": true, - "pl": true, - "pm": true, - "pn": true, - "pr": true, - "pro": true, - "ps": true, - "pt": true, - "pw": true, - "py": true, - "qa": true, - "re": true, - "ro": true, - "rs": true, - "ru": true, - "rw": true, - "sa": true, - "sb": true, - "sc": true, - "sd": true, - "se": true, - "sg": true, - "sh": true, - "si": true, - "sj": true, - "sk": true, - "sl": true, - "sm": true, - "sn": true, - "so": true, - "sr": true, - "st": true, - "su": true, - "sv": true, - "sy": true, - "sz": true, - "tc": true, - "td": true, - "tel": true, - "tf": true, - "tg": true, - "th": true, - "tj": true, - "tk": true, - "tl": true, - "tm": true, - "tn": true, - "to": true, - "tp": true, - "tr": true, - "travel": true, - "tt": true, - "tv": true, - "tw": true, - "tz": true, - "ua": true, - "ug": true, - "uk": true, - "us": true, - "uy": true, - "uz": true, - "va": true, - "vc": true, - "ve": true, - "vg": true, - "vi": true, - "vn": true, - "vu": true, - "wf": true, - "ws": true, - "xxx": true, - "ye": true, - "yt": true, - "za": true, - "zm": true, - "zw": true -}; -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = TLDS; -} \ No newline at end of file diff --git a/external-scripts/translate.js b/external-scripts/translate.js deleted file mode 100644 index e88ab3b8..00000000 --- a/external-scripts/translate.js +++ /dev/null @@ -1,3271 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @class - * Deprecated class for creating new Zotero.Translate instances
    - *
    - * New code should use Zotero.Translate.Web, Zotero.Translate.Import, Zotero.Translate.Export, or - * Zotero.Translate.Search - */ -Zotero.Translate = function(type) { - Zotero.debug("Translate: WARNING: new Zotero.Translate() is deprecated; please don't use this if you don't have to"); - // hack - var translate = Zotero.Translate.newInstance(type); - for (var i in translate) { - this[i] = translate[i]; - } - this.constructor = translate.constructor; - this.__proto__ = translate.__proto__; -} - -/** - * Create a new translator by a string type - */ -Zotero.Translate.newInstance = function(type) { - return new Zotero.Translate[type.substr(0, 1).toUpperCase() + type.substr(1).toLowerCase()]; -} - -/** - * Namespace for Zotero sandboxes - * @namespace - */ -Zotero.Translate.Sandbox = { - /** - * Combines a sandbox with the base sandbox - */ - "_inheritFromBase": function(sandboxToMerge) { - var newSandbox = {}; - - for (var method in Zotero.Translate.Sandbox.Base) { - newSandbox[method] = Zotero.Translate.Sandbox.Base[method]; - } - - for (var method in sandboxToMerge) { - newSandbox[method] = sandboxToMerge[method]; - } - - return newSandbox; - }, - - /** - * Base sandbox. These methods are available to all translators. - * @namespace - */ - "Base": { - /** - * Called as {@link Zotero.Item#complete} from translators to save items to the database. - * @param {Zotero.Translate} translate - * @param {SandboxItem} An item created using the Zotero.Item class from the sandbox - */ - _itemDone: function(translate, item) { - // https://github.com/zotero/translators/issues/1353 - var asyncTranslator = !(translate instanceof Zotero.Translate.Web) && - translate.translator[0].configOptions && - translate.translator[0].configOptions.async; - - var run = async function(async) { - Zotero.debug("Translate: Saving item"); - - // warn if itemDone called after translation completed - if (translate._complete) { - Zotero.debug("Translate: WARNING: Zotero.Item#complete() called after Zotero.done(); please fix your code", 2); - } - - const allowedObjects = [ - "complete", - "attachments", - "creators", - "tags", - "notes", - "relations", - // Is this still needed? - "seeAlso" - ]; - - // Create a new object here, so that we strip the "complete" property - var newItem = {}; - var oldItem = item; - for (var i in item) { - var val = item[i]; - if (i === "complete" || (!val && val !== 0)) continue; - - var type = typeof val; - var isObject = type === "object" || type === "xml" || type === "function", - shouldBeObject = allowedObjects.indexOf(i) !== -1; - if (isObject && !shouldBeObject) { - // Convert things that shouldn't be objects to objects - translate._debug("Translate: WARNING: typeof " + i + " is " + type + "; converting to string"); - newItem[i] = val.toString(); - } else if (shouldBeObject && !isObject) { - translate._debug("Translate: WARNING: typeof " + i + " is " + type + "; converting to array"); - newItem[i] = [val]; - } else if (type === "string") { - // trim strings - newItem[i] = val.trim(); - } else { - newItem[i] = val; - } - } - item = newItem; - - if (item.title) { - item.title = translate._cleanTitle(item.title, item.itemType); - // Short Title is added before this in the web itemDone, so if we removed - // a suffix (e.g., ": a novel") and the short title now matches the title, - // remove it - if (item.title == item.shortTitle) { - delete item.shortTitle; - } - } - - // Clean empty creators - if (item.creators) { - for (var i = 0; i < item.creators.length; i++) { - var creator = item.creators[i]; - if (!creator.firstName && !creator.lastName) { - item.creators.splice(i, 1); - i--; - } - } - } - - // If we're not in a child translator, canonicalize tags - if (!translate._parentTranslator) { - if (item.tags) item.tags = translate._cleanTags(item.tags); - } - - if (item.attachments) { - var attachments = item.attachments; - for (var j = 0; j < attachments.length; j++) { - var attachment = attachments[j]; - - // Don't save documents as documents in connector, since we can't pass them around - if ((Zotero.isConnector || Zotero.isServer) && attachment.document) { - attachment.url = attachment.document.documentURI || attachment.document.URL; - attachment.mimeType = "text/html"; - delete attachment.document; - } - - // If we're not in a child translator, canonicalize tags - if (!translate._parentTranslator) { - if (attachment.tags !== undefined) attachment.tags = translate._cleanTags(attachment.tags); - } - } - } - - // if we're not supposed to save the item or we're in a child translator, - // just return the item array - if (translate._libraryID === false || translate._parentTranslator) { - translate.newItems.push(item); - return translate._runHandler("itemDone", item, item); - } - - // We use this within the connector to keep track of items as they are saved - if (!item.id) item.id = Zotero.Utilities.randomString(); - - if (item.notes) { - var notes = item.notes; - for (var j = 0; j < notes.length; j++) { - var note = notes[j]; - if (!note) { - notes.splice(j--, 1); - } else if (typeof(note) != "object") { - // Convert to object - notes[j] = { - "note": note.toString() - } - } - // If we're not in a child translator, canonicalize tags - if (!translate._parentTranslator) { - if (note.tags !== undefined) note.tags = translate._cleanTags(note.tags); - } - } - } - - if (item.version) { - translate._debug("Translate: item.version is deprecated; set item.versionNumber instead"); - item.versionNumber = item.version; - } - - if (item.accessDate) { - if (Zotero.Date.isSQLDateTime(item.accessDate)) { - translate._debug("Translate: Passing accessDate as SQL is deprecated; pass an ISO 8601 date instead"); - item.accessDate = Zotero.Date.sqlToISO8601(item.accessDate); - } - } - - // Fire itemSaving event - translate._runHandler("itemSaving", item); - translate._savingItems++; - - // For synchronous import (when Promise isn't available in the sandbox or the do* - // function doesn't use it) and web translators, queue saves - if (!async ||!asyncTranslator) { - Zotero.debug("Translate: Saving via queue"); - translate.saveQueue.push(item); - } - // For async import, save items immediately - else { - Zotero.debug("Translate: Saving now"); - translate.incrementAsyncProcesses("Zotero.Translate#_saveItems()"); - return translate._saveItems([item]) - .then(() => translate.decrementAsyncProcesses("Zotero.Translate#_saveItems()")); - } - }; - - return run(asyncTranslator); - }, - - /** - * Gets translator options that were defined in displayOptions in translator header - * - * @param {Zotero.Translate} translate - * @param {String} option Option to be retrieved - */ - "getOption": function(translate, option) { - if (typeof option !== "string") { - throw (new Error("getOption: option must be a string")); - return; - } - - return translate._displayOptions[option]; - }, - - /** - * Gets a hidden preference that can be defined by hiddenPrefs in translator header - * - * @param {Zotero.Translate} translate - * @param {String} pref Preference to be retrieved - */ - "getHiddenPref": function(translate, pref) { - if (typeof(pref) != "string") { - throw (new Error("getPref: preference must be a string")); - } - - var hp = translate._translatorInfo.hiddenPrefs || {}; - - var value; - try { - value = Zotero.Prefs.get('translators.' + pref); - } catch (e) {} - - return (value !== undefined ? value : hp[pref]); - }, - - /** - * For loading other translators and accessing their methods - * - * @param {Zotero.Translate} translate - * @param {String} type Translator type ("web", "import", "export", or "search") - * @returns {Object} A safeTranslator object, which operates mostly like Zotero.Translate - */ - "loadTranslator": function(translate, type) { - const setDefaultHandlers = function(translate, translation) { - if (type !== "export" && - (!translation._handlers['itemDone'] || !translation._handlers['itemDone'].length)) { - translation.setHandler("itemDone", function(obj, item) { - translate.Sandbox._itemDone(translate, item); - }); - } - if (!translation._handlers['selectItems'] || !translation._handlers['selectItems'].length) { - translation.setHandler("selectItems", translate._handlers["selectItems"]); - } - } - - if (typeof type !== "string") { - throw (new Error("loadTranslator: type must be a string")); - return; - } - - Zotero.debug("Translate: Creating translate instance of type " + type + " in sandbox"); - var translation = Zotero.Translate.newInstance(type); - translation._parentTranslator = translate; - translation.setTranslatorProvider(translate._translatorProvider); - - if (translation instanceof Zotero.Translate.Export && !(translation instanceof Zotero.Translate.Export)) { - throw (new Error("Only export translators may call other export translators")); - } - - /** - * @class Wrapper for {@link Zotero.Translate} for safely calling another translator - * from inside an existing translator - * @inner - */ - var safeTranslator = {}; - safeTranslator.setSearch = function(arg) { - if (!Zotero.isBookmarklet) arg = JSON.parse(JSON.stringify(arg)); - return translation.setSearch(arg); - }; - safeTranslator.setDocument = function(arg) { - if (Zotero.isFx && !Zotero.isBookmarklet) { - return translation.setDocument( - Zotero.Translate.DOMWrapper.wrap(arg, arg.SpecialPowers_wrapperOverrides) - ); - } else { - return translation.setDocument(arg); - } - }; - var errorHandlerSet = false; - safeTranslator.setHandler = function(arg1, arg2) { - if (arg1 === "error") errorHandlerSet = true; - translation.setHandler(arg1, - function(obj, item) { - try { - item = item.wrappedJSObject ? item.wrappedJSObject : item; - if (arg1 == "itemDone") { - item.complete = translate._sandboxZotero.Item.prototype.complete; - } - arg2(obj, item); - } catch (e) { - translate.complete(false, e); - } - } - ); - }; - safeTranslator.setString = function(arg) { - translation.setString(arg) - }; - safeTranslator.setTranslator = function(arg) { - var success = translation.setTranslator(arg); - if (!success) { - throw new Error("Translator " + translate.translator[0].translatorID + " attempted to call invalid translatorID " + arg); - } - }; - - var translatorsHandlerSet = false; - safeTranslator.getTranslators = async function() { - if (!translation._handlers["translators"] || !translation._handlers["translators"].length) { - throw new Error('Translator must register a "translators" handler to ' + - 'call getTranslators() in this translation environment.'); - } - if (!translatorsHandlerSet) { - translation.setHandler("translators", function() { - translate.decrementAsyncProcesses("safeTranslator#getTranslators()"); - }); - } - translate.incrementAsyncProcesses("safeTranslator#getTranslators()"); - return translation.getTranslators(); - }; - - var doneHandlerSet = false; - safeTranslator.translate = async function() { - translate.incrementAsyncProcesses("safeTranslator#translate()"); - setDefaultHandlers(translate, translation); - if (!doneHandlerSet) { - doneHandlerSet = true; - translation.setHandler("done", function() { - translate.decrementAsyncProcesses("safeTranslator#translate()") - }); - } - if (!errorHandlerSet) { - errorHandlerSet = true; - translation.setHandler("error", function(obj, error) { - translate.complete(false, error) - }); - } - return translation.translate(false); - }; - - safeTranslator.getTranslatorObject = function(callback) { - if (callback) { - translate.incrementAsyncProcesses("safeTranslator#getTranslatorObject()"); - } else { - throw new Error("Translator must pass a callback to getTranslatorObject() to " + - "operate in this translation environment."); - } - - var translator = translation.translator[0]; - translator = typeof translator === "object" ? - translator : - translation._translatorProvider.get(translator); - // Zotero.Translators.get returns a value in the client and a promise in connectors - // so we normalize the value to a promise here - Zotero.Promise.resolve(translator) - .then(function(translator) { - return translation._loadTranslator(translator) - }) - .then(function() { - return translation._prepareTranslation(); - }) - .then(function() { - setDefaultHandlers(translate, translation); - var sandbox = translation._sandboxManager.sandbox; - if (!Zotero.Utilities.isEmpty(sandbox.exports)) { - sandbox.exports.Zotero = sandbox.Zotero; - sandbox = sandbox.exports; - } else { - translate._debug("COMPAT WARNING: " + translation.translator[0].label + " does " + - "not export any properties. Only detect" + translation._entryFunctionSuffix + - " and do" + translation._entryFunctionSuffix + " will be available in " + - "connectors."); - } - - callback(sandbox); - translate.decrementAsyncProcesses("safeTranslator#getTranslatorObject()"); - }).catch(function(e) { - translate.complete(false, e); - return; - }); - }; - - return safeTranslator; - }, - - /** - * Enables asynchronous detection or translation - * @param {Zotero.Translate} translate - * @deprecated - */ - "wait": function(translate) {}, - - /** - * Sets the return value for detection - * - * @param {Zotero.Translate} translate - */ - "done": function(translate, returnValue) { - if (translate._currentState === "detect") { - translate._returnValue = returnValue; - } - }, - - /** - * Proxy for translator _debug function - * - * @param {Zotero.Translate} translate - * @param {String} string String to write to console - * @param {String} [level] Level to log as (1 to 5) - */ - "debug": function(translate, string, level) { - translate._debug(string, level); - } - }, - - /** - * Web functions exposed to sandbox - * @namespace - */ - "Web": { - /** - * Lets user pick which items s/he wants to put in his/her library - * @param {Zotero.Translate} translate - * @param {Object} items An set of id => name pairs in object format - */ - "selectItems": function(translate, items, callback) { - function transferObject(obj) { - return obj; - } - - if (Zotero.Utilities.isEmpty(items)) { - throw new Error("Translator called select items with no items"); - } - - // Some translators pass an array rather than an object to Zotero.selectItems. - // This will break messaging outside of Firefox, so we need to fix it. - if (Object.prototype.toString.call(items) === "[object Array]") { - translate._debug("WARNING: Zotero.selectItems should be called with an object, not an array"); - var itemsObj = {}; - for (var i in items) itemsObj[i] = items[i]; - items = itemsObj; - } - - if (translate._selectedItems) { - // if we have a set of selected items for this translation, use them - return transferObject(translate._selectedItems); - } else if (translate._handlers.select) { - // whether the translator supports asynchronous selectItems - var haveAsyncCallback = !!callback; - // whether the handler operates asynchronously - var haveAsyncHandler = false; - var returnedItems = null; - - var callbackExecuted = false; - if (haveAsyncCallback) { - // if this translator provides an async callback for selectItems, rig things - // up to pop off the async process - var newCallback = function(selectedItems) { - callbackExecuted = true; - try { - callback(transferObject(selectedItems)); - } catch (e) { - translate.complete(false, e); - return false; - } - if (haveAsyncHandler) translate.decrementAsyncProcesses("Zotero.selectItems()"); - }; - } else { - // if this translator doesn't provide an async callback for selectItems, set things - // up so that we can wait to see if the select handler returns synchronously. If it - // doesn't, we will need to restart translation. - var newCallback = function(selectedItems) { - callbackExecuted = true; - if (haveAsyncHandler) { - translate.translate({ - libraryID: translate._libraryID, - saveAttachments: translate._saveAttachments, - selectedItems - }); - } else { - returnedItems = transferObject(selectedItems); - } - }; - } - - if (Zotero.isFx && !Zotero.isBookmarklet) { - items = Components.utils.cloneInto(items, {}); - } - - var returnValue = translate._runHandler("select", items, newCallback); - if (returnValue !== undefined) { - // handler may have returned a value, which makes callback unnecessary - Zotero.debug("WARNING: Returning items from a select handler is deprecated. " + - "Please pass items as to the callback provided as the third argument to " + - "the handler."); - - returnedItems = transferObject(returnValue); - haveAsyncHandler = false; - } else { - // if we don't have returnedItems set already, the handler is asynchronous - haveAsyncHandler = !callbackExecuted; - } - - if (haveAsyncCallback) { - if (haveAsyncHandler) { - // we are running asynchronously, so increment async processes - translate.incrementAsyncProcesses("Zotero.selectItems()"); - } else if (!callbackExecuted) { - // callback didn't get called from handler, so call it here - callback(returnedItems); - } - return false; - } else { - translate._debug("COMPAT WARNING: No callback was provided for " + - "Zotero.selectItems(). When executed outside of Firefox, a selectItems() call " + - "will require this translator to be called multiple times.", 1); - - if (haveAsyncHandler) { - // The select handler is asynchronous, but this translator doesn't support - // asynchronous select. We return false to abort translation in this - // instance, and we will restart it later when the selectItems call is - // complete. - translate._aborted = true; - return false; - } else { - return returnedItems; - } - } - } else { // no handler defined; assume they want all of them - if (callback) callback(items); - return items; - } - }, - - /** - * Overloads {@link Zotero.Translate.Sandbox.Base._itemDone} to ensure that no standalone - * items are saved, that an item type is specified, and to add a libraryCatalog and - * shortTitle if relevant. - * @param {Zotero.Translate} translate - * @param {SandboxItem} An item created using the Zotero.Item class from the sandbox - */ - "_itemDone": function(translate, item) { - // Only apply checks if there is no parent translator - if (!translate._parentTranslator) { - if (!item.itemType) { - item.itemType = "webpage"; - translate._debug("WARNING: No item type specified"); - } - - if (item.type == "attachment" || item.type == "note") { - Zotero.debug("Translate: Discarding standalone " + item.type + " in non-import translator", 2); - return; - } - - // store library catalog if this item was captured from a website, and - // libraryCatalog is truly undefined (not false or "") - if (item.repository !== undefined) { - Zotero.debug("Translate: 'repository' field is now 'libraryCatalog'; please fix your code", 2); - item.libraryCatalog = item.repository; - delete item.repository; - } - - // automatically set library catalog - if (item.libraryCatalog === undefined && item.itemType != "webpage") { - item.libraryCatalog = translate.translator[0].label; - } - - // Remove library catalog if not valid for type, so it doesn't get saved to Extra - if (item.libraryCatalog) { - let itemTypeID = Zotero.ItemTypes.getID(item.itemType); - let fieldID = Zotero.ItemFields.getID('libraryCatalog'); - if (!Zotero.ItemFields.isValidForType(fieldID, itemTypeID)) { - delete item.libraryCatalog; - } - } - - // automatically set access date if URL is set - if (item.url && typeof item.accessDate == 'undefined') { - item.accessDate = Zotero.Date.dateToISO(new Date()); - } - - //consider type-specific "title" alternatives - var altTitle = Zotero.ItemFields.getName(Zotero.ItemFields.getFieldIDFromTypeAndBase(item.itemType, 'title')); - if (altTitle && item[altTitle]) item.title = item[altTitle]; - - if (!item.title) { - translate.complete(false, new Error("No title specified for item")); - return; - } - - // create short title - if (item.shortTitle === undefined && Zotero.Utilities.fieldIsValidForType("shortTitle", item.itemType)) { - // only set if changes have been made - var setShortTitle = false; - var title = item.title; - - // shorten to before first colon - var index = title.indexOf(":"); - if (index !== -1) { - title = title.substr(0, index); - setShortTitle = true; - } - // shorten to after first question mark - index = title.indexOf("?"); - if (index !== -1) { - index++; - if (index != title.length) { - title = title.substr(0, index); - setShortTitle = true; - } - } - - if (setShortTitle) item.shortTitle = title; - } - - /* Clean up ISBNs - * Allow multiple ISBNs, but... - * (1) validate all ISBNs - * (2) convert all ISBNs to ISBN-13 - * (3) remove any duplicates - * (4) separate them with space - */ - if (item.ISBN) { - // Match ISBNs with groups separated by various dashes or even spaces - var isbnRe = /\b(?:97[89][\s\x2D\xAD\u2010-\u2015\u2043\u2212]*)?(?:\d[\s\x2D\xAD\u2010-\u2015\u2043\u2212]*){9}[\dx](?![\x2D\xAD\u2010-\u2015\u2043\u2212])\b/gi, - validISBNs = [], - isbn; - while (isbn = isbnRe.exec(item.ISBN)) { - var validISBN = Zotero.Utilities.cleanISBN(isbn[0]); - if (!validISBN) { - // Back up and move up one character - isbnRe.lastIndex = isbn.index + 1; - continue; - } - - var isbn13 = Zotero.Utilities.toISBN13(validISBN); - if (validISBNs.indexOf(isbn13) == -1) validISBNs.push(isbn13); - } - item.ISBN = validISBNs.join(' '); - } - - // refuse to save very long tags - if (item.tags) { - for (var i = 0; i < item.tags.length; i++) { - var tag = item.tags[i], - tagString = typeof tag === "string" ? tag : - typeof tag === "object" ? (tag.tag || tag.name) : null; - if (tagString && tagString.length > 255) { - translate._debug("WARNING: Skipping unsynchable tag " + JSON.stringify(tagString)); - item.tags.splice(i--, 1); - } - } - } - - for (var i = 0; i < item.attachments.length; i++) { - var attachment = item.attachments[i]; - - // Web translators are not allowed to use attachment.path - if (attachment.path) { - if (!attachment.url) attachment.url = attachment.path; - delete attachment.path; - } - - if (attachment.url) { - // Remap attachment (but not link) URLs - // TODO: provide both proxied and un-proxied URLs (also for documents) - // because whether the attachment is attached as link or file - // depends on Zotero preferences as well. - attachment.url = translate.resolveURL( - attachment.url, - attachment.proxy === false || attachment.snapshot === false - ); - } - } - } - - // call super - Zotero.Translate.Sandbox.Base._itemDone(translate, item); - }, - - /** - * Tells Zotero to monitor changes to the DOM and re-trigger detectWeb - * Can only be set during the detectWeb call - * @param {DOMNode} target Document node to monitor for changes - * @param {MutationObserverInit} [config] specifies which DOM mutations should be reported - */ - "monitorDOMChanges": function(translate, target, config) { - if (translate._currentState != "detect") { - Zotero.debug("Translate: monitorDOMChanges can only be called during the 'detect' stage"); - return; - } - - var window = translate.document.defaultView - var mutationObserver = window && (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver); - if (!mutationObserver) { - Zotero.debug("Translate: This browser does not support mutation observers."); - return; - } - - var translator = translate._potentialTranslators[0]; - if (!translate._registeredDOMObservers[translator.translatorID]) - translate._registeredDOMObservers[translator.translatorID] = []; - var obs = translate._registeredDOMObservers[translator.translatorID]; - - //do not re-register observer by the same translator for the same node - if (obs.indexOf(target) != -1) { - Zotero.debug("Translate: Already monitoring this node"); - return; - } - - obs.push(target); - - var observer = new mutationObserver(function(mutations, observer) { - obs.splice(obs.indexOf(target), 1); - observer.disconnect(); - - Zotero.debug("Translate: Page modified."); - //we don't really care what got updated - var doc = mutations[0].target.ownerDocument; - translate._runHandler("pageModified", doc); - }); - - observer.observe(target, config || { - childList: true, - subtree: true - }); - Zotero.debug("Translate: Mutation observer registered on <" + target.nodeName + "> node"); - } - }, - - /** - * Import functions exposed to sandbox - * @namespace - */ - "Import": { - /** - * Saves a collection to the DB - * Called as {@link Zotero.Collection#complete} from the sandbox - * @param {Zotero.Translate} translate - * @param {SandboxCollection} collection - */ - "_collectionDone": function(translate, collection) { - translate.newCollections.push(collection); - if (translate._libraryID == false) { - translate._runHandler("collectionDone", collection); - } - }, - - /** - * Sets the value of the progress indicator associated with export as a percentage - * @param {Zotero.Translate} translate - * @param {Number} value - */ - "setProgress": function(translate, value) { - if (typeof value !== "number") { - translate._progress = null; - } else { - translate._progress = value; - } - } - }, - - /** - * Export functions exposed to sandbox - * @namespace - */ - "Export": { - /** - * Retrieves the next item to be exported - * @param {Zotero.Translate} translate - * @return {SandboxItem} - */ - "nextItem": function(translate) { - var item = translate._itemGetter.nextItem(); - - if (translate._displayOptions.hasOwnProperty("exportTags") && !translate._displayOptions["exportTags"]) { - item.tags = []; - } - - translate._runHandler("itemDone", item); - - return item; - }, - - /** - * Retrieves the next collection to be exported - * @param {Zotero.Translate} translate - * @return {SandboxCollection} - */ - "nextCollection": function(translate) { - if (!translate._translatorInfo.configOptions || !translate._translatorInfo.configOptions.getCollections) { - throw (new Error("getCollections configure option not set; cannot retrieve collection")); - } - - return translate._itemGetter.nextCollection(); - }, - - /** - * @borrows Zotero.Translate.Sandbox.Import.setProgress as this.setProgress - */ - "setProgress": function(translate, value) { - Zotero.Translate.Sandbox.Import.setProgress(translate, value); - } - }, - - /** - * Search functions exposed to sandbox - * @namespace - */ - "Search": { - /** - * @borrows Zotero.Translate.Sandbox.Web._itemDone as this._itemDone - */ - "_itemDone": function(translate, item) { - // Always set library catalog, even if we have a parent translator - if (item.libraryCatalog === undefined) { - item.libraryCatalog = translate.translator[0].label; - } - - Zotero.Translate.Sandbox.Web._itemDone(translate, item); - } - } -} - -/** - * @class Base class for all translation types - * - * @property {String} type The type of translator. This is deprecated; use instanceof instead. - * @property {Zotero.Translator[]} translator The translator currently in use. Usually, only the - * first entry of the Zotero.Translator array is populated; subsequent entries represent - * translators to be used if the first fails. - * @property {String} path The path or URI string of the target - * @property {String} newItems Items created when translate() was called - * @property {String} newCollections Collections created when translate() was called - * @property {Number} runningAsyncProcesses The number of async processes that are running. These - * need to terminate before Zotero.done() is called. - */ -Zotero.Translate.Base = function() {} -Zotero.Translate.Base.prototype = { - /** - * Initializes a Zotero.Translate instance - */ - "init": function() { - this._handlers = []; - this._currentState = null; - this._translatorInfo = null; - this._translatorProvider = Zotero.Translators; - this.document = null; - this.location = null; - }, - - /** - * Sets the location to operate upon - * - * @param {String|nsIFile} location The URL to which the sandbox should be bound or path to local file - */ - "setLocation": function(location) { - this.location = location; - if (typeof this.location == "object") { // if a file - this.path = location.path; - } else { // if a url - this.path = location; - } - }, - - /** - * Sets the translator to be used for import/export - * - * @param {Array{Zotero.Translator}|Zotero.Translator|string} Translator object or ID - */ - "setTranslator": function(translator) { - // Accept an array of translators - if (Array.isArray(translator)) { - this.translator = translator; - return true; - } - if (!translator) { - throw new Error("No translator specified"); - } - - this.translator = null; - - if (typeof(translator) == "object") { // passed an object and not an ID - if (translator.translatorID) { - this.translator = [translator]; - } else { - throw (new Error("No translatorID specified")); - } - } else { - this.translator = [translator]; - } - - return !!this.translator; - }, - - /** - * Registers a handler function to be called when translation is complete - * - * @param {String} type Type of handler to register. Legal values are: - * select - * valid: web - * called: when the user needs to select from a list of available items - * passed: an associative array in the form id => text - * returns: a numerically indexed array of ids, as extracted from the passed - * string - * itemDone - * valid: import, web, search - * called: when an item has been processed; may be called asynchronously - * passed: an item object (see Zotero.Item) - * returns: N/A - * collectionDone - * valid: import - * called: when a collection has been processed, after all items have been - * added; may be called asynchronously - * passed: a collection object (see Zotero.Collection) - * returns: N/A - * done - * valid: all - * called: when all processing is finished - * passed: true if successful, false if an error occurred - * returns: N/A - * debug - * valid: all - * called: when Zotero.debug() is called - * passed: string debug message - * returns: true if message should be logged to the console, false if not - * error - * valid: all - * called: when a fatal error occurs - * passed: error object (or string) - * returns: N/A - * translators - * valid: all - * called: when a translator search initiated with Zotero.Translate.getTranslators() is - * complete - * passed: an array of appropriate translators - * returns: N/A - * pageModified - * valid: web - * called: when a web page has been modified - * passed: the document object for the modified page - * returns: N/A - * @param {Function} handler Callback function. All handlers will be passed the current - * translate instance as the first argument. The second argument is dependent on the handler. - */ - "setHandler": function(type, handler) { - if (!this._handlers[type]) { - this._handlers[type] = new Array(); - } - this._handlers[type].push(handler); - }, - - /** - * Clears all handlers for a given function - * @param {String} type See {@link Zotero.Translate.Base#setHandler} for valid values - */ - "clearHandlers": function(type) { - this._handlers[type] = new Array(); - }, - - /** - * Clears a single handler for a given function - * @param {String} type See {@link Zotero.Translate.Base#setHandler} for valid values - * @param {Function} handler Callback function to remove - */ - "removeHandler": function(type, handler) { - var handlerIndex = this._handlers[type].indexOf(handler); - if (handlerIndex !== -1) this._handlers[type].splice(handlerIndex, 1); - }, - - /** - * Set custom translator provider, as returned by Zotero.Translators.makeTranslatorProvider() - * - * Used by Scaffold to substitute external translator files - * - * @param {Object} translatorProvider - */ - setTranslatorProvider: function(translatorProvider) { - this._translatorProvider = translatorProvider; - }, - - /** - * Indicates that a new async process is running - */ - "incrementAsyncProcesses": function(f) { - this._runningAsyncProcesses++; - if (this._parentTranslator) { - this._parentTranslator.incrementAsyncProcesses(f + " from child translator"); - } else { - //Zotero.debug("Translate: Incremented asynchronous processes to "+this._runningAsyncProcesses+" for "+f, 4); - //Zotero.debug((new Error()).stack); - } - }, - - /** - * Indicates that a new async process is finished - */ - "decrementAsyncProcesses": function(f, by) { - this._runningAsyncProcesses -= (by ? by : 1); - if (!this._parentTranslator) { - //Zotero.debug("Translate: Decremented asynchronous processes to "+this._runningAsyncProcesses+" for "+f, 4); - //Zotero.debug((new Error()).stack); - } - if (this._runningAsyncProcesses === 0) { - this.complete(); - } - if (this._parentTranslator) this._parentTranslator.decrementAsyncProcesses(f + " from child translator", by); - }, - - /** - * Clears all handlers for a given function - * @param {String} type See {@link Zotero.Translate.Base#setHandler} for valid values - * @param {Any} argument Argument to be passed to handler - */ - "_runHandler": function(type) { - var returnValue = undefined; - if (this._handlers[type]) { - // compile list of arguments - if (this._parentTranslator) { - // if there is a parent translator, make sure we don't pass the Zotero.Translate - // object, since it could open a security hole - var args = [null]; - } else { - var args = [this]; - } - for (var i = 1; i < arguments.length; i++) { - args.push(arguments[i]); - } - - var handlers = this._handlers[type].slice(); - for (var i = 0, n = handlers.length; i < n; i++) { - if (type != 'debug') { - Zotero.debug(`Translate: Running handler ${i} for ${type}`, 5); - } - try { - returnValue = handlers[i].apply(null, args); - } catch (e) { - if (this._parentTranslator) { - // throw handler errors if they occur when a translator is - // called from another translator, so that the - // "Could Not Translate" dialog will appear if necessary - throw (e); - } else { - // otherwise, fail silently, so as not to interfere with - // interface cleanup - Zotero.debug("Translate: " + e + ' in handler ' + i + ' for ' + type, 5); - Zotero.logError(e); - } - } - } - } - return returnValue; - }, - - /** - * Gets all applicable translators of a given type - * - * For import, you should call this after setLocation; otherwise, you'll just get a list of all - * import filters, not filters equipped to handle a specific file - * - * @param {Boolean} [getAllTranslators] Whether all applicable translators should be returned, - * rather than just the first available. - * @param {Boolean} [checkSetTranslator] If true, the appropriate detect function is run on the - * set document/text/etc. using the translator set by setTranslator. - * getAllTranslators parameter is meaningless in this context. - * @return {Promise} Promise for an array of {@link Zotero.Translator} objects - */ - getTranslators: Zotero.Promise.method(function(getAllTranslators, checkSetTranslator) { - var potentialTranslators; - - // do not allow simultaneous instances of getTranslators - if (this._currentState === "detect") throw new Error("getTranslators: detection is already running"); - this._currentState = "detect"; - this._getAllTranslators = getAllTranslators; - this._potentialTranslators = []; - this._foundTranslators = []; - - if (checkSetTranslator) { - // setTranslator must be called beforehand if checkSetTranslator is set - if (!this.translator || !this.translator[0]) { - return Zotero.Promise.reject(new Error("getTranslators: translator must be set via setTranslator before calling" + - " getTranslators with the checkSetTranslator flag")); - } - var promises = new Array(); - var t; - for (var i = 0, n = this.translator.length; i < n; i++) { - if (typeof(this.translator[i]) == 'string') { - t = this._translatorProvider.get(this.translator[i]); - if (!t) Zotero.debug("getTranslators: could not retrieve translator '" + this.translator[i] + "'"); - } else { - t = this.translator[i]; - } - /**TODO: check that the translator is of appropriate type?*/ - if (t) promises.push(t); - } - if (!promises.length) return Zotero.Promise.reject(new Error("getTranslators: no valid translators were set")); - potentialTranslators = Zotero.Promise.all(promises); - } else { - potentialTranslators = this._getTranslatorsGetPotentialTranslators(); - } - - // if detection returns immediately, return found translators - return potentialTranslators.then(function(result) { - var allPotentialTranslators = result[0]; - var proxies = result[1]; - - // this gets passed out by Zotero.Translators.getWebTranslatorsForLocation() because it is - // specific for each translator, but we want to avoid making a copy of a translator whenever - // possible. - this._proxies = proxies ? [] : null; - this._waitingForRPC = false; - - for (var i = 0, n = allPotentialTranslators.length; i < n; i++) { - var translator = allPotentialTranslators[i]; - if (translator.runMode === Zotero.Translator.RUN_MODE_IN_BROWSER) { - this._potentialTranslators.push(translator); - if (proxies) { - this._proxies.push(proxies[i]); - } - } else if (this instanceof Zotero.Translate.Web && Zotero.Connector) { - this._waitingForRPC = true; - } - } - - // Attach handler for translators, so that we can return a - // promise that provides them. - // TODO make this._detect() return a promise - var deferred = Zotero.Promise.defer(); - var translatorsHandler = function(obj, translators) { - this.removeHandler("translators", translatorsHandler); - deferred.resolve(translators); - }.bind(this); - this.setHandler("translators", translatorsHandler); - this._detect(); - - if (this._waitingForRPC) { - // Try detect in Zotero Standalone. If this fails, it fails; we shouldn't - // get hung up about it. - let html = this.document.documentElement.innerHTML; - html = html.replace(new RegExp(Zotero.Utilities.quotemeta(ZOTERO_CONFIG.BOOKMARKLET_URL), 'g'), "about:blank"); - Zotero.Connector.callMethod( - "detect", { - uri: this.location.toString(), - cookie: this.document.cookie, - html - }).catch(() => false).then(function(rpcTranslators) { - this._waitingForRPC = false; - - // if there are translators, add them to the list of found translators - if (rpcTranslators) { - for (var i = 0, n = rpcTranslators.length; i < n; i++) { - rpcTranslators[i] = new Zotero.Translator(rpcTranslators[i]); - rpcTranslators[i].runMode = Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE; - rpcTranslators[i].proxy = rpcTranslators[i].proxy ? new Zotero.Proxy(rpcTranslators[i].proxy) : null; - } - this._foundTranslators = this._foundTranslators.concat(rpcTranslators); - } - - // call _detectTranslatorsCollected to return detected translators - if (this._currentState === null) { - this._detectTranslatorsCollected(); - } - }.bind(this)); - } - - return deferred.promise; - }.bind(this)) - .catch(function(e) { - Zotero.logError(e); - this.complete(false, e); - }.bind(this)); - }), - - /** - * Get all potential translators (without running detect) - * @return {Promise} Promise for an array of {@link Zotero.Translator} objects - */ - _getTranslatorsGetPotentialTranslators: async function() { - var translators = await this._translatorProvider.getAllForType(this.type); - return [translators]; - }, - - /** - * Begins the actual translation. At present, this returns immediately for import/export - * translators, but new code should use {@link Zotero.Translate.Base#setHandler} to register a - * "done" handler to determine when execution of web/search translators is complete. - * - * @param {Integer|FALSE} [libraryID] Library in which to save items, - * or NULL for default library; - * if FALSE, don't save items - * @param {Boolean} [saveAttachments=true] Exclude attachments (e.g., snapshots) on import - * @param {Boolean} [linkFiles=false] - Save linked files instead of stored files - * @returns {Promise} Promise resolved with saved items - * when translation complete - */ - translate: Zotero.Promise.method(function(options = {}, ...args) { // initialize properties specific to each translation - if (typeof options == 'number') { - Zotero.debug("Translate: translate() now takes an object -- update your code", 2); - options = { - libraryID: options, - saveAttachments: args[0], - selectedItems: args[1] - }; - } - - var me = this; - var deferred = Zotero.Promise.defer() - - if (!this.translator || !this.translator.length) { - Zotero.debug("Translate: translate called without specifying a translator. Running detection first."); - this.setHandler('translators', function(me, translators) { - if (!translators.length) { - me.complete(false, "Could not find an appropriate translator"); - } else { - me.setTranslator(translators); - deferred.resolve(Zotero.Translate.Base.prototype.translate.call(me, options)); - } - }); - this.getTranslators(); - return deferred.promise; - } - - this._currentState = "translate"; - - this._sessionID = options.sessionID; - this._libraryID = options.libraryID; - if (options.collections && !Array.isArray(options.collections)) { - throw new Error("'collections' must be an array"); - } - this._collections = options.collections; - this._saveAttachments = options.saveAttachments === undefined || options.saveAttachments; - this._linkFiles = options.linkFiles; - this._forceTagType = options.forceTagType; - this._saveOptions = options.saveOptions; - - this._savingAttachments = []; - this._savingItems = 0; - this._waitingForSave = false; - - // Attach handlers for promise - var me = this; - var doneHandler = function(obj, returnValue) { - if (returnValue) deferred.resolve(me.newItems); - me.removeHandler("done", doneHandler); - me.removeHandler("error", errorHandler); - }; - var errorHandler = function(obj, error) { - deferred.reject(error); - me.removeHandler("done", doneHandler); - me.removeHandler("error", errorHandler); - }; - this.setHandler("done", doneHandler); - this.setHandler("error", errorHandler); - - // need to get translator first - if (typeof this.translator[0] !== "object") { - this.translator[0] = this._translatorProvider.get(this.translator[0]); - } - - // Zotero.Translators.get() returns a promise in the connectors, but we don't expect it to - // otherwise - if (!Zotero.isConnector && this.translator[0].then) { - throw new Error("Translator should not be a promise in non-connector mode"); - } - - if (this.noWait) { - var loadPromise = this._loadTranslator(this.translator[0]); - if (!loadPromise.isResolved()) { - return Zotero.Promise.reject(new Error("Load promise is not resolved in noWait mode")); - } - this._translateTranslatorLoaded(); - } else if (this.translator[0].then) { - Zotero.Promise.resolve(this.translator[0]) - .then(function(translator) { - this.translator[0] = translator; - this._loadTranslator(translator) - .then(() => this._translateTranslatorLoaded()) - .catch(e => deferred.reject(e)); - }.bind(this)); - } else { - this._loadTranslator(this.translator[0]) - .then(() => this._translateTranslatorLoaded()) - .catch(e => deferred.reject(e)); - } - - return deferred.promise; - }), - - /** - * Called when translator has been retrieved and loaded - */ - "_translateTranslatorLoaded": Zotero.Promise.method(function() { - // set display options to default if they don't exist - if (!this._displayOptions) this._displayOptions = this._translatorInfo.displayOptions || {}; - - var loadPromise = this._prepareTranslation(); - if (this.noWait) { - if (!loadPromise.isResolved()) { - throw new Error("Load promise is not resolved in noWait mode"); - } - rest.apply(this, arguments); - } else { - return loadPromise.then(() => rest.apply(this, arguments)) - } - - function rest() { - Zotero.debug("Translate: Beginning translation with " + this.translator[0].label); - - this.incrementAsyncProcesses("Zotero.Translate#translate()"); - - // translate - try { - let maybePromise = Function.prototype.apply.call( - this._sandboxManager.sandbox["do" + this._entryFunctionSuffix], - null, - this._getParameters() - ); - - if (maybePromise) { - maybePromise - .then(() => this.decrementAsyncProcesses("Zotero.Translate#translate()")) - .catch(e => this.complete(false, e)); - return; - } - } catch (e) { - this.complete(false, e); - return false; - } - - this.decrementAsyncProcesses("Zotero.Translate#translate()"); - } - }), - - /** - * Return the progress of the import operation, or null if progress cannot be determined - */ - "getProgress": function() { - return null - }, - - /** - * Translate a URL to a form that goes through the appropriate proxy, or - * convert a relative URL to an absolute one - * - * @param {String} url - * @param {Boolean} dontUseProxy If true, don't convert URLs to variants - * that use the proxy - * @type String - * @private - */ - "resolveURL": function(url, dontUseProxy) { - Zotero.debug("Translate: resolving URL " + url); - - const hostPortRe = /^([A-Z][-A-Z0-9+.]*):\/\/[^\/]+/i; - const allowedSchemes = ['http', 'https', 'ftp']; - - var m = url.match(hostPortRe), - resolved; - if (!m) { - if (this.location) { - if (Zotero.isFx) { - resolved = Services.io.newURI(this.location, "", null).resolve(url); - } else { - resolved = new URL(url, this.location).toString(); - } - } else if (url.startsWith('//')) { - // Use HTTPS by default for protocol-relative URL with no associated web page - resolved = 'https:' + url; - } else { - throw new Error('Cannot resolve relative URL without an associated web page: ' + url); - } - } else if (allowedSchemes.indexOf(m[1].toLowerCase()) == -1) { - Zotero.debug("Translate: unsupported scheme " + m[1]); - return url; - } else { - resolved = url; - } - - Zotero.debug("Translate: resolved to " + resolved); - - // convert proxy to proper if applicable - if (!dontUseProxy && this.translator && this.translator[0] && - this._proxy) { - var proxiedURL = this._proxy.toProxy(resolved); - if (proxiedURL != resolved) { - Zotero.debug("Translate: proxified to " + proxiedURL); - } - resolved = proxiedURL; - } - - /*var m = hostPortRe.exec(resolved); - if(!m) { - throw new Error("Invalid URL supplied for HTTP request: "+url); - } else if(this._translate.document && this._translate.document.location) { - var loc = this._translate.document.location; - if(this._translate._currentState !== "translate" && loc - && (m[1].toLowerCase() !== loc.protocol.toLowerCase() - || m[2].toLowerCase() !== loc.host.toLowerCase())) { - throw new Error("Attempt to access "+m[1]+"//"+m[2]+" from "+loc.protocol+"//"+loc.host - +" blocked: Cross-site requests are only allowed during translation"); - } - }*/ - - return resolved; - }, - - /** - * Executed on translator completion, either automatically from a synchronous scraper or as - * done() from an asynchronous scraper. Finishes things up and calls callback function(s). - * @param {Boolean|String} returnValue An item type or a boolean true or false - * @param {String|Exception} [error] An error that occurred during translation. - * @return {String|NULL} The exception serialized to a string, or null if translation - * completed successfully. - */ - "complete": function(returnValue, error) { - // allow translation to be aborted for re-running after selecting items - if (this._aborted) return; - - // Make sure this isn't called twice - if (this._currentState === null) { - if (!returnValue) { - Zotero.debug("Translate: WARNING: Zotero.done() called after translator completion with error"); - Zotero.debug(error); - } else { - var e = new Error(); - Zotero.debug("Translate: WARNING: Zotero.done() called after translation completion. This should never happen. Please examine the stack below."); - Zotero.debug(e.stack); - } - return; - } - - // reset async processes and propagate them to parent - if (this._parentTranslator && this._runningAsyncProcesses) { - this._parentTranslator.decrementAsyncProcesses("Zotero.Translate#complete", this._runningAsyncProcesses); - } - this._runningAsyncProcesses = 0; - - if (!returnValue && this._returnValue) returnValue = this._returnValue; - - var errorString = null; - if (!returnValue && error) errorString = this._generateErrorString(error); - if (this._currentState === "detect") { - if (this._potentialTranslators.length) { - var lastTranslator = this._potentialTranslators.shift(); - var lastProxy = this._proxies ? this._proxies.shift() : null; - - if (returnValue) { - var dupeTranslator = { - proxy: lastProxy ? new Zotero.Proxy(lastProxy) : null - }; - - for (var i in lastTranslator) dupeTranslator[i] = lastTranslator[i]; - if (Zotero.isBookmarklet && returnValue === "server") { - // In the bookmarklet, the return value from detectWeb can be "server" to - // indicate the translator should be run on the Zotero server - dupeTranslator.runMode = Zotero.Translator.RUN_MODE_ZOTERO_SERVER; - } else { - // Usually the return value from detectWeb will be either an item type or - // the string "multiple" - dupeTranslator.itemType = returnValue; - } - - this._foundTranslators.push(dupeTranslator); - } else if (error) { - this._debug("Detect using " + lastTranslator.label + " failed: \n" + errorString, 2); - } - } - - if (this._potentialTranslators.length && (this._getAllTranslators || !returnValue)) { - // more translators to try; proceed to next translator - this._detect(); - } else { - this._currentState = null; - if (!this._waitingForRPC) this._detectTranslatorsCollected(); - } - } else { - // unset return value is equivalent to true - if (returnValue === undefined) returnValue = true; - - if (returnValue) { - if (this.saveQueue.length) { - this._waitingForSave = true; - this._saveItems(this.saveQueue) - .catch(e => this._runHandler("error", e)) - .then(() => this.saveQueue = []); - return; - } - this._debug("Translation successful"); - } else { - if (error) { - // report error to console - Zotero.logError(error); - - // report error to debug log - this._debug("Translation using " + (this.translator && this.translator[0] && this.translator[0].label ? this.translator[0].label : "no translator") + " failed: \n" + errorString, 2); - } - - this._runHandler("error", error); - } - - this._currentState = null; - - // call handlers - this._runHandler("itemsDone", returnValue); - if (returnValue) { - this._checkIfDone(); - } else { - this._runHandler("done", returnValue); - } - } - - return errorString; - }, - - _cleanTitle: function(title, itemType) { - if (itemType == 'book' || itemType == 'bookSection') { - return title.replace(/\s*:\s*a novel\s*$/i, ''); - } - return title; - }, - - /** - * Canonicalize an array of tags such that they are all objects with the tag stored in the - * "tag" property and a type (if specified) is stored in the "type" property - * @returns {Object[]} Array of new tag objects - */ - "_cleanTags": function(tags) { - var newTags = []; - if (!tags) return newTags; - for (var i = 0; i < tags.length; i++) { - var tag = tags[i]; - if (!tag) continue; - if (typeof(tag) == "object") { - var tagString = tag.tag || tag.name; - if (tagString) { - var newTag = { - "tag": tagString - }; - if (tag.type) newTag.type = tag.type; - newTags.push(newTag); - } - } else { - newTags.push({ - "tag": tag.toString() - }); - } - } - return newTags; - }, - - /** - * Saves items to the database, taking care to defer attachmentProgress notifications - * until after save - */ - _saveItems: Zotero.Promise.method(function(items) { - var itemDoneEventsDispatched = false; - var deferredProgress = []; - var attachmentsWithProgress = []; - - function attachmentCallback(attachment, progress, error) { - // Find by id if available (used in the connector) - if (attachment.id) { - var attachmentIndex = this._savingAttachments.findIndex(x => x.id == attachment.id); - } else { - var attachmentIndex = this._savingAttachments.indexOf(attachment); - } - if (progress === false || progress === 100) { - if (attachmentIndex !== -1) { - this._savingAttachments.splice(attachmentIndex, 1); - } - } else if (attachmentIndex === -1) { - this._savingAttachments.push(attachment); - } - - if (itemDoneEventsDispatched) { - // itemDone event has already fired, so we can fire attachmentProgress - // notifications - this._runHandler("attachmentProgress", attachment, progress, error); - this._checkIfDone(); - } else { - // Defer until after we fire the itemDone event - deferredProgress.push([attachment, progress, error]); - attachmentsWithProgress.push(attachment); - } - } - - return this._itemSaver.saveItems(items.slice(), attachmentCallback.bind(this), - function(newItems) { - this._runHandler("itemsDone", newItems); - // Remove attachments not being saved from item.attachments - for (var i = 0; i < items.length; i++) { - var item = items[i]; - for (var j = 0; j < item.attachments.length; j++) { - if (attachmentsWithProgress.indexOf(item.attachments[j]) === -1) { - item.attachments.splice(j--, 1); - } - } - } - - // Trigger itemDone events, waiting for them if they return promises - var maybePromises = []; - for (var i = 0, nItems = items.length; i < nItems; i++) { - maybePromises.push(this._runHandler("itemDone", newItems[i], items[i])); - } - return Zotero.Promise.all(maybePromises).then(() => newItems); - }.bind(this)) - .then(function(newItems) { - // Specify that itemDone event was dispatched, so that we don't defer - // attachmentProgress notifications anymore - itemDoneEventsDispatched = true; - - // Run deferred attachmentProgress notifications - for (var i = 0; i < deferredProgress.length; i++) { - this._runHandler("attachmentProgress", deferredProgress[i][0], - deferredProgress[i][1], deferredProgress[i][2]); - } - - this._savingItems -= items.length; - this.newItems = this.newItems.concat(newItems); - this._checkIfDone(); - }.bind(this)) - .catch((e) => { - this._savingItems -= items.length; - this.complete(false, e); - throw e; - }); - }), - - /** - * Checks if saving done, and if so, fires done event - */ - "_checkIfDone": function() { - if (!this._savingItems && !this._savingAttachments.length && (!this._currentState || this._waitingForSave)) { - if (this.newCollections && - this._libraryID !== false && - this._itemSaver.saveCollections) { - var me = this; - this._itemSaver.saveCollections(this.newCollections) - .then(function(newCollections) { - me.newCollections = newCollections; - me._runHandler("done", true); - }) - .catch(function(err) { - me._runHandler("error", err); - me._runHandler("done", false); - }); - } else { - this._runHandler("done", true); - } - } - }, - - /** - * Begins running detect code for a translator, first loading it - */ - "_detect": function() { - // there won't be any translators if we need an RPC call - if (!this._potentialTranslators.length) { - this.complete(true); - return; - } - - let lab = this._potentialTranslators[0].label; - this._loadTranslator(this._potentialTranslators[0]) - .then(function() { - return this._detectTranslatorLoaded(); - }.bind(this)) - .catch(function(e) { - this.complete(false, e); - }.bind(this)); - }, - - /** - * Runs detect code for a translator - */ - _detectTranslatorLoaded: async function() { - this._prepareDetection(); - - this.incrementAsyncProcesses("Zotero.Translate#getTranslators"); - - var maybePromise = Function.prototype.apply.call( - this._sandboxManager.sandbox["detect" + this._entryFunctionSuffix], - null, - this._getParameters() - ); - // If detect* returns a promise, wait for it - var returnValue = (maybePromise && maybePromise.then) ? await maybePromise : maybePromise; - - if (returnValue !== undefined) this._returnValue = returnValue; - this.decrementAsyncProcesses("Zotero.Translate#getTranslators"); - }, - - /** - * Called when all translators have been collected for detection - */ - "_detectTranslatorsCollected": function() { - Zotero.debug("Translate: All translator detect calls and RPC calls complete:"); - this._foundTranslators.sort(function(a, b) { - // If priority is equal, prioritize translators that run in browser over the client - if (a.priority == b.priority) { - return a.runMode - b.runMode; - } - return a.priority - b.priority; - }); - if (this._foundTranslators.length) { - this._foundTranslators.forEach(function(t) { - Zotero.debug("\t" + t.label + ": " + t.priority); - }); - } else { - Zotero.debug("\tNo suitable translators found"); - } - this._runHandler("translators", this._foundTranslators); - }, - - /** - * Loads the translator into its sandbox - * @param {Zotero.Translator} translator - * @return {Promise} - */ - _loadTranslator: Zotero.Promise.method(function(translator) { - var sandboxLocation = this._getSandboxLocation(); - if (!this._sandboxLocation || sandboxLocation !== this._sandboxLocation) { - this._sandboxLocation = sandboxLocation; - this._generateSandbox(); - } - - this._currentTranslator = translator; - - if (this.type == 'web') { - // Pass on the proxy of the parent translate - if (this._parentTranslator) { - this._proxy = this._parentTranslator._proxy; - } else { - this._proxy = translator.proxy; - } - } else { - // Use proxy only for web translators - this._proxy = null; - } - this._runningAsyncProcesses = 0; - this._returnValue = undefined; - this._aborted = false; - this.saveQueue = []; - - // CHANGED: Make parsing of translator wait for injected code - var parse = async function(code) { - Zotero.debug("Translate: Parsing code for " + translator.label + " " + - "(" + translator.translatorID + ", " + translator.lastUpdated + ")", 4); - try { - // CHANGED: Exports do not have a detectExport function, so don't try to export this - if (this._entryFunctionSuffix !== "Export") { - // CHANGED: Make parsing of translator wait for injected code - await this._sandboxManager.eval( - "var exports = {}, ZOTERO_TRANSLATOR_INFO = " + code, - [ - "detect" + this._entryFunctionSuffix, - "do" + this._entryFunctionSuffix, - "exports", - "ZOTERO_TRANSLATOR_INFO" - ], - (translator.file ? translator.file.path : translator.label) - ); - } else { - // CHANGED: Exports do not have a detectExport function, so don't try to export this - await this._sandboxManager.eval( - "var exports = {}, ZOTERO_TRANSLATOR_INFO = " + code, [ - "do" + this._entryFunctionSuffix, - "exports", - "ZOTERO_TRANSLATOR_INFO" - ], - (translator.file ? translator.file.path : translator.label) - ); - } - } catch (e) { - Zotero.logError(e); - } - this._translatorInfo = this._sandboxManager.sandbox.ZOTERO_TRANSLATOR_INFO; - }.bind(this); - - if (this.noWait) { - let codePromise = Zotero.Translators.getCodeForTranslator(translator); - if (!codePromise.isResolved()) { - throw new Error("Code promise is not resolved in noWait mode"); - } - parse(codePromise.value()); - } else { - return Zotero.Translators.getCodeForTranslator(translator).then(parse); - } - }), - - /** - * Generates a sandbox for scraping/scraper detection - */ - "_generateSandbox": function() { - Zotero.debug("Translate: Binding sandbox to " + (typeof this._sandboxLocation == "object" ? this._sandboxLocation.document.location : this._sandboxLocation), 4); - this._sandboxManager = new Zotero.Translate.SandboxManager(this._sandboxLocation); - const createArrays = "['creators', 'notes', 'tags', 'seeAlso', 'attachments']"; - var src = ""; - src += "Zotero.Item = function (itemType) {" + - "var createArrays = " + createArrays + ";" + - "this.itemType = itemType;" + - "for(var i=0, n=createArrays.length; i ${this.path}`; - } - if (Zotero.Prefs.get("downloadAssociatedFiles")) { - errorString += "\ndownloadAssociatedFiles => true"; - } - if (Zotero.Prefs.get("automaticSnapshots")) { - errorString += "\nautomaticSnapshots => true"; - } - return errorString; - }, - - /** - * Determines the location where the sandbox should be bound - * @return {String|document} The location to which to bind the sandbox - */ - "_getSandboxLocation": function() { - return (this._parentTranslator ? this._parentTranslator._sandboxLocation : "http://www.example.com/"); - }, - - /** - * Gets parameters to be passed to detect* and do* functions - * @return {Array} A list of parameters - */ - "_getParameters": function() { - return []; - }, - - /** - * No-op for preparing detection - */ - "_prepareDetection": function() {}, - - /** - * No-op for preparing translation - */ - "_prepareTranslation": function() { - return Zotero.Promise.resolve(); - } -} - -/** - * @class Web translation - * - * @property {Document} document The document object to be used for web scraping (set with setDocument) - * @property {Zotero.CookieSandbox} cookieSandbox A CookieSandbox to manage cookies for - * this Translate instance. - */ -Zotero.Translate.Web = function() { - this._registeredDOMObservers = {} - this.init(); -} -Zotero.Translate.Web.prototype = new Zotero.Translate.Base(); -Zotero.Translate.Web.prototype.type = "web"; -Zotero.Translate.Web.prototype._entryFunctionSuffix = "Web"; -Zotero.Translate.Web.prototype.Sandbox = Zotero.Translate.Sandbox._inheritFromBase(Zotero.Translate.Sandbox.Web); - -/** - * Sets the browser to be used for web translation - * @param {Document} doc An HTML document - */ -Zotero.Translate.Web.prototype.setDocument = function(doc) { - this.document = doc; - try { - this.rootDocument = doc.defaultView.top.document; - } catch (e) { - // Cross-origin frames won't be able to access top.document and will throw an error - } - if (!this.rootDocument) { - this.rootDocument = doc; - } - this.setLocation(doc.location.href, this.rootDocument.location.href); -} - -/** - * Sets a Zotero.CookieSandbox to handle cookie management for XHRs initiated from this - * translate instance - * - * @param {Zotero.CookieSandbox} cookieSandbox - */ -Zotero.Translate.Web.prototype.setCookieSandbox = function(cookieSandbox) { - this.cookieSandbox = cookieSandbox; -} - -/** - * Sets headers to include in HTTP requests. Used by translation-server. - */ -Zotero.Translate.Web.prototype.setRequestHeaders = function(headers) { - this.requestHeaders = headers; -}; - -/** - * Sets the location to operate upon - * - * @param {String} location The URL of the page to translate - * @param {String} rootLocation The URL of the root page, within which `location` is embedded - */ -Zotero.Translate.Web.prototype.setLocation = function(location, rootLocation) { - this.location = location; - this.rootLocation = rootLocation || location; - this.path = this.location; -} - -/** - * Get potential web translators - */ -Zotero.Translate.Web.prototype._getTranslatorsGetPotentialTranslators = function() { - return this._translatorProvider.getWebTranslatorsForLocation(this.location, this.rootLocation); -} - -/** - * Bind sandbox to document being translated - */ -Zotero.Translate.Web.prototype._getSandboxLocation = function() { - if (this._parentTranslator) { - return this._parentTranslator._sandboxLocation; - } else if (this.document.defaultView && - (this.document.defaultView.toString().indexOf("Window") !== -1 || - this.document.defaultView.toString().indexOf("XrayWrapper") !== -1)) { - return this.document.defaultView; - } else { - return this.document.location.toString(); - } -} - -/** - * Pass document and location to detect* and do* functions - */ -Zotero.Translate.Web.prototype._getParameters = function() { - return [this.document, this.location]; -}; - -/** - * Prepare translation - */ -Zotero.Translate.Web.prototype._prepareTranslation = Zotero.Promise.method(function() { - this._itemSaver = new Zotero.Translate.ItemSaver({ - libraryID: this._libraryID, - collections: this._collections, - attachmentMode: Zotero.Translate.ItemSaver[(this._saveAttachments ? "ATTACHMENT_MODE_DOWNLOAD" : "ATTACHMENT_MODE_IGNORE")], - forceTagType: 1, - sessionID: this._sessionID, - cookieSandbox: this._cookieSandbox, - proxy: this._proxy, - baseURI: this.location - }); - this.newItems = []; -}); - -/** - * Overload translate to set selectedItems - */ -Zotero.Translate.Web.prototype.translate = function(options = {}, ...args) { - if (typeof options == 'number' || options === false) { - Zotero.debug("Translate: translate() now takes an object -- update your code", 2); - options = { - libraryID: options, - saveAttachments: args[0], - selectedItems: args[1] - }; - } - this._selectedItems = options.selectedItems; - return Zotero.Translate.Base.prototype.translate.call(this, options); -} - -/** - * Overload _translateTranslatorLoaded to send an RPC call if necessary - */ -Zotero.Translate.Web.prototype._translateTranslatorLoaded = async function() { - var runMode = this.translator[0].runMode; - if (runMode === Zotero.Translator.RUN_MODE_IN_BROWSER || this._parentTranslator) { - Zotero.Translate.Base.prototype._translateTranslatorLoaded.apply(this); - } else if (runMode === Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE || - (runMode === Zotero.Translator.RUN_MODE_ZOTERO_SERVER && await Zotero.Connector.checkIsOnline())) { - var me = this; - let html = this.document.documentElement.innerHTML; - html = html.replace(new RegExp(Zotero.Utilities.quotemeta(ZOTERO_CONFIG.BOOKMARKLET_URL), 'g'), "about:blank") - // Higher timeout since translation might take a while if additional HTTP requests are made - Zotero.Connector.callMethod({ - method: "savePage", - timeout: 60 * 1000 - }, { - sessionID: this._sessionID, - uri: this.location.toString(), - translatorID: (typeof this.translator[0] === "object" ? - this.translator[0].translatorID : this.translator[0]), - cookie: this.document.cookie, - proxy: this._proxy ? this._proxy.toJSON() : null, - html - }).then(me._translateRPCComplete.bind(me), me._translateRPCComplete.bind(me, null)); - } else if (runMode === Zotero.Translator.RUN_MODE_ZOTERO_SERVER) { - var me = this; - Zotero.API.createItem({ - "url": this.document.location.href.toString() - }).then(function(response) { - me._translateServerComplete(201, response); - }, function(error) { - me._translateServerComplete(error.status, error.responseText); - }); - } -} - -/** - * Called when an call to Zotero Standalone for translation completes - */ -Zotero.Translate.Web.prototype._translateRPCComplete = async function(obj, failureCode) { - if (!obj) return this.complete(false, failureCode); - - if (obj.selectItems) { - // if we have to select items, call the selectItems handler and do it - var me = this; - this._runHandler("select", obj.selectItems, - function(selectedItems) { - Zotero.Connector.callMethod("selectItems", { - "instanceID": obj.instanceID, - "selectedItems": selectedItems - }) - .then((obj) => me._translateRPCComplete(obj)) - } - ); - } else { - // if we don't have to select items, continue - for (var i = 0, n = obj.items.length; i < n; i++) { - this._runHandler("itemDone", null, obj.items[i]); - } - this.newItems = obj.items; - let itemSaver = new Zotero.Translate.ItemSaver({ - libraryID: this._libraryID, - collections: this._collections, - attachmentMode: Zotero.Translate.ItemSaver[(this._saveAttachments ? "ATTACHMENT_MODE_DOWNLOAD" : "ATTACHMENT_MODE_IGNORE")], - forceTagType: 1, - sessionID: this._sessionID, - cookieSandbox: this._cookieSandbox, - proxy: this._proxy, - baseURI: this.location - }); - await itemSaver._pollForProgress(obj.items, this._runHandler.bind(this, 'attachmentProgress')); - this.complete(true); - } -} - -/** - * Called when an call to the Zotero Translator Server for translation completes - */ -Zotero.Translate.Web.prototype._translateServerComplete = function(statusCode, response) { - if (statusCode === 300) { - // Multiple Choices - try { - response = JSON.parse(response); - } catch (e) { - Zotero.logError(e); - this.complete(false, "Invalid JSON response received from server"); - return; - } - var me = this; - this._runHandler("select", response.items, - function(selectedItems) { - Zotero.API.createItem({ - url: me.document.location.href.toString(), - items: selectedItems, - token: response.token - }).then(function(response) { - me._translateServerComplete(201, response); - }, function(error) { - me._translateServerComplete(error.status, error.responseText); - }); - } - ); - } else if (statusCode === 201) { - // Created - try { - response = JSON.parse(response); - } catch (e) { - Zotero.logError(e); - this.complete(false, "Invalid JSON response received from server"); - return; - } - - let items = []; - for (let key in response.successful) { - var item = response.successful[key].data; - - if (!("attachments" in item)) item.attachments = []; - this._runHandler("itemDone", null, item); - items.push(item); - } - this.newItems = items; - this._runHandler("itemsDone", null, item); - this.complete(true); - } else { - this.complete(false, response); - } -} - -/** - * Overload complete to report translation failure - */ -Zotero.Translate.Web.prototype.complete = async function(returnValue, error) { - // call super - var oldState = this._currentState; - var errorString = Zotero.Translate.Base.prototype.complete.apply(this, [returnValue, error]); - - /* - // CHANGED: Never report translation errors to Zotero - var promise; - if (Zotero.Prefs.getAsync) { - promise = Zotero.Prefs.getAsync('reportTranslationFailure'); - } else { - promise = Zotero.Promise.resolve(Zotero.Prefs.get("reportTranslationFailure")); - } - */ - var reportTranslationFailure = false; - // Report translation failure if we failed - if (oldState == "translate" && errorString && !this._parentTranslator && this.translator.length && - this.translator[0].inRepository && reportTranslationFailure) { - // Don't report failure if in private browsing mode - if (Zotero.isConnector && !Zotero.isBookmarklet && await Zotero.Connector_Browser.isIncognito()) { - return - } - - var translator = this.translator[0]; - var info = await Zotero.getSystemInfo(); - - var postBody = "id=" + encodeURIComponent(translator.translatorID) + - "&lastUpdated=" + encodeURIComponent(translator.lastUpdated) + - "&diagnostic=" + encodeURIComponent(info) + - "&errorData=" + encodeURIComponent(errorString); - return Zotero.HTTP.doPost(ZOTERO_CONFIG.REPOSITORY_URL + "report", postBody); - } -} - -/** - * @class Import translation - */ -Zotero.Translate.Import = function() { - this.init(); -} -Zotero.Translate.Import.prototype = new Zotero.Translate.Base(); -Zotero.Translate.Import.prototype.type = "import"; -Zotero.Translate.Import.prototype._entryFunctionSuffix = "Import"; -Zotero.Translate.Import.prototype._io = false; - -Zotero.Translate.Import.prototype.Sandbox = Zotero.Translate.Sandbox._inheritFromBase(Zotero.Translate.Sandbox.Import); - -/** - * Sets string for translation and initializes string IO - */ -Zotero.Translate.Import.prototype.setString = function(string) { - this._string = string; - this._io = false; -} - -/** - * Overload {@link Zotero.Translate.Base#complete} to close file - */ -Zotero.Translate.Import.prototype.complete = function(returnValue, error) { - if (this._io) { - this._progress = null; - this._io.close(false); - } - - // call super - Zotero.Translate.Base.prototype.complete.apply(this, [returnValue, error]); -} - -/** - * Get all potential import translators, ordering translators with the right file extension first - */ -Zotero.Translate.Import.prototype._getTranslatorsGetPotentialTranslators = async function() { - var translators = await (this.location ? - this._translatorProvider.getImportTranslatorsForLocation(this.location) : - this._translatorProvider.getAllForType(this.type)); - return [translators]; -} - -/** - * Overload {@link Zotero.Translate.Base#getTranslators} to return all translators immediately only - * if no string or location is set - */ -Zotero.Translate.Import.prototype.getTranslators = function() { - if (!this._string && !this.location) { - if (this._currentState === "detect") throw new Error("getTranslators: detection is already running"); - this._currentState = "detect"; - var me = this; - return this._translatorProvider.getAllForType(this.type). - then(function(translators) { - me._potentialTranslators = []; - me._foundTranslators = translators; - me.complete(true); - return me._foundTranslators; - }); - } else { - return Zotero.Translate.Base.prototype.getTranslators.call(this); - } -} - -/** - * Overload {@link Zotero.Translate.Base#_loadTranslator} to prepare translator IO - */ -Zotero.Translate.Import.prototype._loadTranslator = function(translator) { - return Zotero.Translate.Base.prototype._loadTranslator.call(this, translator) - .then(function() { - return this._loadTranslatorPrepareIO(translator); - }.bind(this)); -} - -/** - * Prepare translator IO - */ -Zotero.Translate.Import.prototype._loadTranslatorPrepareIO = Zotero.Promise.method(function(translator) { - var configOptions = this._translatorInfo.configOptions; - var dataMode = configOptions ? configOptions["dataMode"] : ""; - - if (!this._io) { - if (Zotero.Translate.IO.Read && this.location && this.location instanceof Components.interfaces.nsIFile) { - this._io = new Zotero.Translate.IO.Read(this.location, this._sandboxManager); - } else { - this._io = new Zotero.Translate.IO.String(this._string, this.path ? this.path : "", this._sandboxManager); - } - } - - this._io.init(dataMode); - this._sandboxManager.importObject(this._io); -}); - -/** - * Prepare translation - */ -Zotero.Translate.Import.prototype._prepareTranslation = Zotero.Promise.method(function() { - this._progress = undefined; - - var baseURI = null; - if (this.location) { - try { - baseURI = Components.classes["@mozilla.org/network/io-service;1"]. - getService(Components.interfaces.nsIIOService).newFileURI(this.location); - } catch (e) {} - } - - this._itemSaver = new Zotero.Translate.ItemSaver({ - libraryID: this._libraryID, - collections: this._collections, - forceTagType: this._forceTagType, - attachmentMode: Zotero.Translate.ItemSaver[(this._saveAttachments ? "ATTACHMENT_MODE_FILE" : "ATTACHMENT_MODE_IGNORE")], - linkFiles: this._linkFiles, - baseURI, - saveOptions: Object.assign({ - skipSelect: true - }, - this._saveOptions || {} - ) - }); - this.newItems = []; - this.newCollections = []; -}); - -/** - * Return the progress of the import operation, or null if progress cannot be determined - */ -Zotero.Translate.Import.prototype.getProgress = function() { - if (this._progress !== undefined) return this._progress; - if (Zotero.Translate.IO.rdfDataModes.indexOf(this._mode) !== -1 || this._mode === "xml/e4x" || this._mode == "xml/dom" || !this._io) { - return null; - } - return this._io.bytesRead / this._io.contentLength * 100; -}; - - -/** - * @class Export translation - */ -Zotero.Translate.Export = function() { - this.init(); -} -Zotero.Translate.Export.prototype = new Zotero.Translate.Base(); -Zotero.Translate.Export.prototype.type = "export"; -Zotero.Translate.Export.prototype._entryFunctionSuffix = "Export"; -Zotero.Translate.Export.prototype.Sandbox = Zotero.Translate.Sandbox._inheritFromBase(Zotero.Translate.Sandbox.Export); - -/** - * Sets the items to be exported - * @param {Zotero.Item[]} items - */ -Zotero.Translate.Export.prototype.setItems = function(items) { - this._export = { - type: 'items', - items: items - }; -} - -/** - * Sets the group to be exported (overrides setItems/setCollection) - * @param {Zotero.Group[]} group - */ -Zotero.Translate.Export.prototype.setLibraryID = function(libraryID) { - this._export = { - type: 'library', - id: libraryID - }; -} - -/** - * Sets the collection to be exported (overrides setItems/setGroup) - * @param {Zotero.Collection[]} collection - */ -Zotero.Translate.Export.prototype.setCollection = function(collection) { - this._export = { - type: 'collection', - collection: collection - }; -} - -/** - * Sets the translator to be used for export - * - * @param {Zotero.Translator|string} Translator object or ID. If this contains a displayOptions - * attribute, setDisplayOptions is automatically called with the specified value. - */ -Zotero.Translate.Export.prototype.setTranslator = function(translator) { - if (typeof translator == "object" && translator.displayOptions) { - this._displayOptions = translator.displayOptions; - } - return Zotero.Translate.Base.prototype.setTranslator.apply(this, [translator]); -} - -/** - * Sets translator display options. you can also pass a translator (not ID) to - * setTranslator that includes a displayOptions argument - */ -Zotero.Translate.Export.prototype.setDisplayOptions = function(displayOptions) { - this._displayOptions = displayOptions; -} - -/** - * Overload {@link Zotero.Translate.Base#complete} to close file and set complete - */ -Zotero.Translate.Export.prototype.complete = function(returnValue, error) { - if (this._io) { - this._progress = null; - this._io.close(true); - if (this._io instanceof Zotero.Translate.IO.String) { - this.string = this._io.string; - } - } - - // call super - Zotero.Translate.Base.prototype.complete.apply(this, [returnValue, error]); -} - -/** - * Overload {@link Zotero.Translate.Base#getTranslators} to return all translators immediately - */ -Zotero.Translate.Export.prototype.getTranslators = function() { - if (this._currentState === "detect") { - return Zotero.Promise.reject(new Error("getTranslators: detection is already running")); - } - var me = this; - return this._translatorProvider.getAllForType(this.type).then(function(translators) { - me._currentState = "detect"; - me._foundTranslators = translators; - me._potentialTranslators = []; - me.complete(true); - return me._foundTranslators; - }); -} - -/** - * Does the actual export, after code has been loaded and parsed - */ -Zotero.Translate.Export.prototype._prepareTranslation = Zotero.Promise.method(function() { - this._progress = undefined; - - // initialize ItemGetter - this._itemGetter = new Zotero.Translate.ItemGetter(); - - // Toggle legacy mode for translators pre-4.0.27 - // CHANGED: BibTeX exporter is no legacy exporter, so we don't need this check - this._itemGetter.legacy = false; - - var configOptions = this._translatorInfo.configOptions || {}, - getCollections = configOptions.getCollections || false; - var loadPromise = Zotero.Promise.resolve(); - switch (this._export.type) { - case 'collection': - this._itemGetter.setCollection(this._export.collection, getCollections); - break; - case 'items': - this._itemGetter.setItems(this._export.items); - break; - case 'library': - loadPromise = this._itemGetter.setAll(this._export.id, getCollections); - break; - default: - throw new Error('No export set up'); - break; - } - delete this._export; - - if (this.noWait) { - if (!loadPromise.isResolved()) { - throw new Error("Load promise is not resolved in noWait mode"); - } - rest.apply(this, arguments); - } else { - return loadPromise.then(() => rest.apply(this, arguments)) - } - - function rest() { - // export file data, if requested - if (this._displayOptions.exportFileData) { - this.location = this._itemGetter.exportFiles( - this.location, - this.translator[0].target, { - includeAnnotations: this._displayOptions.includeAnnotations - } - ); - } - - // initialize IO - // this is currently hackish since we pass null callbacks to the init function (they have - // callbacks to be consistent with import, but they are synchronous, so we ignore them) - if (!this.location) { - this._io = new Zotero.Translate.IO.String(null, this.path ? this.path : "", this._sandboxManager); - this._io.init(configOptions["dataMode"], function() {}); - } else if (!Zotero.Translate.IO.Write) { - throw new Error("Writing to files is not supported in this build of Zotero."); - } else { - this._io = new Zotero.Translate.IO.Write(this.location); - this._io.init(configOptions["dataMode"], - this._displayOptions["exportCharset"] ? this._displayOptions["exportCharset"] : null, - function() {}); - - // For the Note Markdown translator, replace the zotero:// URI scheme in the output if - // not the official Zotero app - if (this.translator.translatorID == '1412e9e2-51e1-42ec-aa35-e036a895534b' && - ZOTERO_CONFIG.ID != 'zotero') { - this._io.setDataProcessor((data) => { - return data.replace(/zotero:\/\//g, ZOTERO_CONFIG.ID + '://'); - }); - } - } - - this._sandboxManager.importObject(this._io); - } -}); - -/** - * Overload Zotero.Translate.Base#translate to make sure that - * Zotero.Translate.Export#translate is not called without setting a - * translator first. Doesn't make sense to run detection for export. - */ -Zotero.Translate.Export.prototype.translate = function() { - if (!this.translator || !this.translator.length) { - this.complete(false, new Error("Export translation initiated without setting a translator")); - } else { - return Zotero.Translate.Base.prototype.translate.apply(this, arguments); - } -}; - -/** - * Return the progress of the import operation, or null if progress cannot be determined - */ -Zotero.Translate.Export.prototype.getProgress = function() { - if (this._progress !== undefined) return this._progress; - if (!this._itemGetter) { - return null; - } - return (1 - this._itemGetter.numItemsRemaining / this._itemGetter.numItems) * 100; -}; - -/** - * @class Search translation - * @property {Array[]} search Item (in {@link Zotero.Item#serialize} format) to extrapolate data - * (set with setSearch) - */ -Zotero.Translate.Search = function() { - this.init(); -}; -Zotero.Translate.Search.prototype = new Zotero.Translate.Base(); -Zotero.Translate.Search.prototype.type = "search"; -Zotero.Translate.Search.prototype._entryFunctionSuffix = "Search"; -Zotero.Translate.Search.prototype.Sandbox = Zotero.Translate.Sandbox._inheritFromBase(Zotero.Translate.Sandbox.Search); -Zotero.Translate.Search.prototype.ERROR_NO_RESULTS = "No items returned from any translator"; - -/** - * @borrows Zotero.Translate.Web#setCookieSandbox - */ -Zotero.Translate.Search.prototype.setCookieSandbox = Zotero.Translate.Web.prototype.setCookieSandbox; - -/** - * Sets the item to be used for searching - * @param {Object} item An item, with as many fields as desired, in the format returned by - * {@link Zotero.Item#serialize} - */ -Zotero.Translate.Search.prototype.setSearch = function(search) { - this.search = search; -} - -/** - * Set an identifier to use for searching - * - * @param {Object} identifier - An object with 'DOI', 'ISBN', or 'PMID' - */ -Zotero.Translate.Search.prototype.setIdentifier = function(identifier) { - var search; - if (identifier.DOI) { - search = { - itemType: "journalArticle", - DOI: identifier.DOI - }; - } else if (identifier.ISBN) { - search = { - itemType: "book", - ISBN: identifier.ISBN - }; - } else if (identifier.PMID) { - search = { - itemType: "journalArticle", - contextObject: "rft_id=info:pmid/" + identifier.PMID - }; - } else if (identifier.arXiv) { - search = { - itemType: "journalArticle", - arXiv: identifier.arXiv - }; - } else if (identifier.adsBibcode) { - search = { - itemType: "journalArticle", - adsBibcode: identifier.adsBibcode - }; - } else { - throw new Error("Unrecognized identifier"); - } - this.setSearch(search); -} - -/** - * Overloads {@link Zotero.Translate.Base#getTranslators} to always return all potential translators - */ -Zotero.Translate.Search.prototype.getTranslators = function() { - return Zotero.Translate.Base.prototype.getTranslators.call(this, true); -} - -/** - * Overload Zotero.Translate.Base#complete to move onto the next translator if - * translation fails - */ -Zotero.Translate.Search.prototype.complete = function(returnValue, error) { - if (this._currentState == "translate" && - (!this.newItems || !this.newItems.length) && - !this._savingItems - //length is 0 only when translate was called without translators - && - this.translator.length) { - Zotero.debug("Translate: Could not find a result using " + this.translator[0].label + - (this.translator.length > 1 ? " -- trying next translator" : ""), 3); - if (error) Zotero.debug(this._generateErrorString(error), 3); - if (this.translator.length > 1) { - this.translator.shift(); - this.translate({ - libraryID: this._libraryID, - saveAttachments: this._saveAttachments, - collections: this._collections - }); - return; - } else { - Zotero.debug("No more translators to try"); - error = this.ERROR_NO_RESULTS; - returnValue = false; - } - } - - // call super - Zotero.Translate.Base.prototype.complete.apply(this, [returnValue, error]); -} - -/** - * Pass search item to detect* and do* functions - */ -Zotero.Translate.Search.prototype._getParameters = function() { - return [this.search]; -}; - -/** - * Extract sandbox location from translator target - */ -Zotero.Translate.Search.prototype._getSandboxLocation = function() { - // generate sandbox for search by extracting domain from translator target - if (this.translator && this.translator[0] && this.translator[0].target) { - // so that web translators work too - const searchSandboxRe = /^http:\/\/[\w.]+\//; - var tempURL = this.translator[0].target.replace(/\\/g, "").replace(/\^/g, ""); - var m = searchSandboxRe.exec(tempURL); - if (m) return m[0]; - } - return Zotero.Translate.Base.prototype._getSandboxLocation.call(this); -} - -Zotero.Translate.Search.prototype._prepareTranslation = Zotero.Translate.Web.prototype._prepareTranslation; - -/** - * IO-related functions - * @namespace - */ -Zotero.Translate.IO = { - /** - * Parses XML using DOMParser - */ - "parseDOMXML": function(input, charset, size) { - try { - var dp = new DOMParser(); - } catch (e) { - try { - var dp = Components.classes["@mozilla.org/xmlextras/domparser;1"] - .createInstance(Components.interfaces.nsIDOMParser); - } catch (e) { - throw new Error("DOMParser not supported"); - } - } - - if (typeof input == "string") { - var nodes = dp.parseFromString(input, "text/xml"); - } else { - var nodes = dp.parseFromStream(input, charset, size, "text/xml"); - } - - if (nodes.getElementsByTagName("parsererror").length) { - throw new Error("DOMParser error: loading data into data store failed"); - } - - if ("normalize" in nodes) nodes.normalize(); - - return nodes; - }, - - /** - * Names of RDF data modes - */ - "rdfDataModes": ["rdf", "rdf/xml", "rdf/n3"] -}; - -/******* String support *******/ - -/** - * @class Translate backend for translating from a string - */ -Zotero.Translate.IO.String = function(string, uri, sandboxManager) { - if (string && typeof string === "string") { - this.string = string; - } else { - this.string = ""; - } - this.contentLength = this.string.length; - this.bytesRead = 0; - this._uri = uri; - this._sandboxManager = sandboxManager; -} - -Zotero.Translate.IO.String.prototype = { - "__exposedProps__": { - "RDF": "r", - "read": "r", - "write": "r", - "setCharacterSet": "r", - "getXML": "r" - }, - - "_initRDF": function() { - Zotero.debug("Translate: Initializing RDF data store"); - this._dataStore = new Zotero.RDF.AJAW.IndexedFormula(); - this.RDF = new Zotero.Translate.IO._RDFSandbox(this._dataStore); - - if (this.contentLength) { - try { - var xml = Zotero.Translate.IO.parseDOMXML(this.string); - } catch (e) { - this._xmlInvalid = true; - throw e; - } - var parser = new Zotero.RDF.AJAW.RDFParser(this._dataStore); - parser.parse(xml, this._uri); - } - }, - - "setCharacterSet": function(charset) {}, - - "read": function(bytes) { - // if we are reading in RDF data mode and no string is set, serialize current RDF to the - // string - if (Zotero.Translate.IO.rdfDataModes.indexOf(this._mode) !== -1 && this.string === "") { - this.string = this.RDF.serialize(); - } - - // return false if string has been read - if (this.bytesRead >= this.contentLength) { - return false; - } - - if (bytes !== undefined) { - if (this.bytesRead >= this.contentLength) return false; - var oldPointer = this.bytesRead; - this.bytesRead += bytes; - return this.string.substr(oldPointer, bytes); - } else { - // bytes not specified; read a line - var oldPointer = this.bytesRead; - var lfIndex = this.string.indexOf("\n", this.bytesRead); - - if (lfIndex !== -1) { - // in case we have a CRLF - this.bytesRead = lfIndex + 1; - if (this.contentLength > lfIndex && this.string.substr(lfIndex - 1, 1) === "\r") { - lfIndex--; - } - return this.string.substr(oldPointer, lfIndex - oldPointer); - } - - if (!this._noCR) { - var crIndex = this.string.indexOf("\r", this.bytesRead); - if (crIndex === -1) { - this._noCR = true; - } else { - this.bytesRead = crIndex + 1; - return this.string.substr(oldPointer, crIndex - oldPointer - 1); - } - } - - this.bytesRead = this.contentLength; - return this.string.substr(oldPointer); - } - }, - - "write": function(data) { - this.string += data; - this.contentLength = this.string.length; - }, - - "getXML": function() { - try { - var xml = Zotero.Translate.IO.parseDOMXML(this.string); - } catch (e) { - this._xmlInvalid = true; - throw e; - } - return xml; - }, - - init: function(newMode) { - this.bytesRead = 0; - this._noCR = undefined; - - this._mode = newMode; - if (newMode === "xml/e4x") { - throw new Error("E4X is not supported"); - } else if (newMode && (Zotero.Translate.IO.rdfDataModes.indexOf(newMode) !== -1 || - newMode.substr(0, 3) === "xml/dom") && this._xmlInvalid) { - throw new Error("XML known invalid"); - } else if (Zotero.Translate.IO.rdfDataModes.indexOf(this._mode) !== -1) { - this._initRDF(); - } - }, - - "close": function(serialize) { - // if we are writing in RDF data mode and no string is set, serialize current RDF to the - // string - if (serialize && Zotero.Translate.IO.rdfDataModes.indexOf(this._mode) !== -1 && this.string === "") { - this.string = this.RDF.serialize(); - } - } -} - -/****** RDF DATA MODE ******/ - -/** - * @class An API for handling RDF from the sandbox. This is exposed to translators as Zotero.RDF. - * - * @property {Zotero.RDF.AJAW.IndexedFormula} _dataStore - * @property {Integer[]} _containerCounts - * @param {Zotero.RDF.AJAW.IndexedFormula} dataStore - */ -Zotero.Translate.IO._RDFSandbox = function(dataStore) { - this._dataStore = dataStore; -} - -Zotero.Translate.IO._RDFSandbox.prototype = { - "_containerCounts": [], - "__exposedProps__": { - "addStatement": "r", - "newResource": "r", - "newContainer": "r", - "addContainerElement": "r", - "getContainerElements": "r", - "addNamespace": "r", - "getAllResources": "r", - "getResourceURI": "r", - "getArcsIn": "r", - "getArcsOut": "r", - "getSources": "r", - "getTargets": "r", - "getStatementsMatching": "r", - "serialize": "r" - }, - - /** - * Gets a resource as a Zotero.RDF.AJAW.Symbol, rather than a string - * @param {String|Zotero.RDF.AJAW.Symbol} about - * @return {Zotero.RDF.AJAW.Symbol} - */ - "_getResource": function(about) { - return (typeof about == "object" ? about : new Zotero.RDF.AJAW.Symbol(about)); - }, - - /** - * Runs a callback to initialize this RDF store - */ - "_init": function() { - if (this._prepFunction) { - this._dataStore = this._prepFunction(); - delete this._prepFunction; - } - }, - - /** - * Serializes the current RDF to a string - */ - "serialize": function(dataMode) { - var serializer = Zotero.RDF.AJAW.Serializer(this._dataStore); - - for (var prefix in this._dataStore.namespaces) { - serializer.suggestPrefix(prefix, this._dataStore.namespaces[prefix]); - } - - // serialize in appropriate format - if (dataMode == "rdf/n3") { - return serializer.statementsToN3(this._dataStore.statements); - } - - return serializer.statementsToXML(this._dataStore.statements); - }, - - /** - * Adds an RDF triple - * @param {String|Zotero.RDF.AJAW.Symbol} about - * @param {String|Zotero.RDF.AJAW.Symbol} relation - * @param {String|Zotero.RDF.AJAW.Symbol} value - * @param {Boolean} literal Whether value should be treated as a literal (true) or a resource - * (false) - */ - "addStatement": function(about, relation, value, literal) { - if (about === null || about === undefined) { - throw new Error("about must be defined in Zotero.RDF.addStatement"); - } - if (relation === null || relation === undefined) { - throw new Error("relation must be defined in Zotero.RDF.addStatement"); - } - if (value === null || value === undefined) { - throw new Error("value must be defined in Zotero.RDF.addStatement"); - } - - if (literal) { - // zap chars that Mozilla will mangle - value = value.toString().replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]/g, ''); - } else { - value = this._getResource(value); - } - - this._dataStore.add(this._getResource(about), this._getResource(relation), value); - }, - - /** - * Creates a new anonymous resource - * @return {Zotero.RDF.AJAW.Symbol} - */ - "newResource": function() { - return new Zotero.RDF.AJAW.BlankNode(); - }, - - /** - * Creates a new container resource - * @param {String} type The type of the container ("bag", "seq", or "alt") - * @param {String|Zotero.RDF.AJAW.Symbol} about The URI of the resource - * @return {Zotero.Translate.RDF.prototype.newContainer - */ - "newContainer": function(type, about) { - const rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; - const containerTypes = { - "bag": "Bag", - "seq": "Seq", - "alt": "Alt" - }; - - type = type.toLowerCase(); - if (!containerTypes[type]) { - throw new Error("Invalid container type in Zotero.RDF.newContainer"); - } - - var about = this._getResource(about); - this.addStatement(about, rdf + "type", rdf + containerTypes[type], false); - this._containerCounts[about.toNT()] = 1; - - return about; - }, - - /** - * Adds a new element to a container - * @param {String|Zotero.RDF.AJAW.Symbol} about The container - * @param {String|Zotero.RDF.AJAW.Symbol} element The element to add to the container - * @param {Boolean} literal Whether element should be treated as a literal (true) or a resource - * (false) - */ - "addContainerElement": function(about, element, literal) { - const rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; - - var about = this._getResource(about); - this._dataStore.add(about, new Zotero.RDF.AJAW.Symbol(rdf + "_" + (this._containerCounts[about.toNT()]++)), element, literal); - }, - - /** - * Gets all elements within a container - * @param {String|Zotero.RDF.AJAW.Symbol} about The container - * @return {Zotero.RDF.AJAW.Symbol[]} - */ - "getContainerElements": function(about) { - const liPrefix = "http://www.w3.org/1999/02/22-rdf-syntax-ns#_"; - - var about = this._getResource(about); - var statements = this._dataStore.statementsMatching(about); - var containerElements = []; - - // loop over arcs out looking for list items - for (var i = 0; i < statements.length; i++) { - var statement = statements[i]; - if (statement.predicate.uri.substr(0, liPrefix.length) == liPrefix) { - var number = statement.predicate.uri.substr(liPrefix.length); - - // make sure these are actually numeric list items - var intNumber = parseInt(number); - if (number == intNumber.toString()) { - // add to element array - containerElements[intNumber - 1] = (statement.object.termType == "literal" ? statement.object.toString() : statement.object); - } - } - } - - return containerElements; - }, - - /** - * Adds a namespace for a specific URI - * @param {String} prefix Namespace prefix - * @param {String} uri Namespace URI - */ - "addNamespace": function(prefix, uri) { - this._dataStore.setPrefixForURI(prefix, uri); - }, - - /** - * Gets the URI a specific resource - * @param {String|Zotero.RDF.AJAW.Symbol} resource - * @return {String} - */ - "getResourceURI": function(resource) { - if (typeof(resource) == "string") return resource; - - if (resource.uri) return resource.uri; - - const rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; - var values = this.getStatementsMatching(resource, rdf + 'value'); - if (values && values.length) { - return values[0][2]; - } - - if (resource.toNT == undefined) throw new Error("Zotero.RDF: getResourceURI called on invalid resource"); - return resource.toNT(); - }, - - /** - * Gets all resources in the RDF data store - * @return {Zotero.RDF.AJAW.Symbol[]} - */ - "getAllResources": function() { - var returnArray = []; - for (var i in this._dataStore.subjectIndex) { - returnArray.push(this._dataStore.subjectIndex[i][0].subject); - } - return returnArray; - }, - - /** - * Gets all arcs (predicates) into a resource - * @return {Zotero.RDF.AJAW.Symbol[]} - * @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching} - */ - "getArcsIn": function(resource) { - var statements = this._dataStore.objectIndex[this._dataStore.canon(this._getResource(resource))]; - if (!statements) return false; - - var returnArray = []; - for (var i = 0; i < statements.length; i++) { - returnArray.push(statements[i].predicate.uri); - } - return returnArray; - }, - - /** - * Gets all arcs (predicates) out of a resource - * @return {Zotero.RDF.AJAW.Symbol[]} - * @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching} - */ - "getArcsOut": function(resource) { - var statements = this._dataStore.subjectIndex[this._dataStore.canon(this._getResource(resource))]; - if (!statements) return false; - - var returnArray = []; - for (var i = 0; i < statements.length; i++) { - returnArray.push(statements[i].predicate.uri); - } - return returnArray; - }, - - /** - * Gets all subjects whose predicates point to a resource - * @param {String|Zotero.RDF.AJAW.Symbol} resource Subject that predicates should point to - * @param {String|Zotero.RDF.AJAW.Symbol} property Predicate - * @return {Zotero.RDF.AJAW.Symbol[]} - * @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching} - */ - "getSources": function(resource, property) { - var statements = this._dataStore.statementsMatching(undefined, this._getResource(property), this._getResource(resource)); - if (!statements.length) return false; - - var returnArray = []; - for (var i = 0; i < statements.length; i++) { - returnArray.push(statements[i].subject); - } - return returnArray; - }, - - /** - * Gets all objects of a given subject with a given predicate - * @param {String|Zotero.RDF.AJAW.Symbol} resource Subject - * @param {String|Zotero.RDF.AJAW.Symbol} property Predicate - * @return {Zotero.RDF.AJAW.Symbol[]} - * @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching} - */ - "getTargets": function(resource, property) { - var statements = this._dataStore.statementsMatching(this._getResource(resource), this._getResource(property)); - if (!statements.length) return false; - - var returnArray = []; - for (var i = 0; i < statements.length; i++) { - returnArray.push(statements[i].object.termType == "literal" ? statements[i].object.toString() : statements[i].object); - } - return returnArray; - }, - - /** - * Gets statements matching a certain pattern - * - * @param {String|Zotero.RDF.AJAW.Symbol} subj Subject - * @param {String|Zotero.RDF.AJAW.Symbol} predicate Predicate - * @param {String|Zotero.RDF.AJAW.Symbol} obj Object - * @param {Boolean} objLiteral Whether the object is a literal (as - * opposed to a URI) - * @param {Boolean} justOne Whether to stop when a single result is - * retrieved - */ - "getStatementsMatching": function(subj, pred, obj, objLiteral, justOne) { - var statements = this._dataStore.statementsMatching( - (subj ? this._getResource(subj) : undefined), - (pred ? this._getResource(pred) : undefined), - (obj ? (objLiteral ? objLiteral : this._getResource(obj)) : undefined), - undefined, justOne); - if (!statements.length) return false; - - - var returnArray = []; - for (var i = 0; i < statements.length; i++) { - returnArray.push([statements[i].subject, statements[i].predicate, (statements[i].object.termType == "literal" ? statements[i].object.toString() : statements[i].object)]); - } - return returnArray; - } -}; - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = Zotero.Translate; -} \ No newline at end of file diff --git a/external-scripts/translate_inject.js b/external-scripts/translate_inject.js deleted file mode 100644 index 9f8d5c4e..00000000 --- a/external-scripts/translate_inject.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -var GlobalSandbox; - -/** - * @class Manages the translator sandbox - * @param {Zotero.Translate} translate - * @param {String|window} sandboxLocation - */ -Zotero.Translate.SandboxManager = function(sandboxLocation) { - this.sandbox = { - "Zotero": {} - }; -} - -Zotero.Translate.SandboxManager.prototype = { - /** - * Evaluates code in the sandbox - * @param {String} code Code to evaluate - * @param {String[]} functions Functions to import into the sandbox (rather than leaving - * as inner functions) - */ - "eval": function(code, functions) { - // delete functions to import - for (var i in functions) { - delete this.sandbox[functions[i]]; - } - - // Set global sandbox temporarily to this sandbox - GlobalSandbox = this.sandbox; - - // Prepend sandbox properties within eval environment (what a mess (1)) - for (var prop in this.sandbox) { - code = 'var ' + prop + ' = GlobalSandbox.' + prop + ';' + code; - } - - // Import inner functions back into the sandbox - for (var i in functions) { - try { - code += 'GlobalSandbox.' + functions[i] + ' = ' + functions[i] + ';'; - } catch (e) {} - } - - // Eval in a closure - // Eval script using tabs.contentScript instead of eval() - var codeClosure = "(function() {" + code + "})();"; - return browser.runtime.sendMessage({ - "eval": codeClosure - }); - }, - - /** - * Imports an object into the sandbox - * - * @param {Object} object Object to be imported (under Zotero) - * @param {Boolean} passTranslateAsFirstArgument Whether the translate instance should be passed - * as the first argument to the function. - */ - "importObject": function(object, passAsFirstArgument, attachTo) { - if (!attachTo) attachTo = this.sandbox.Zotero; - - for (var key in (object.__exposedProps__ ? object.__exposedProps__ : object)) { - if (Function.prototype[key]) continue; - if (typeof object[key] === "function" || typeof object[key] === "object") { - // magic closures - attachTo[key] = new function() { - var fn = object[key]; - return function() { - var args = (passAsFirstArgument ? [passAsFirstArgument] : []); - for (var i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - - return fn.apply(object, args); - }; - } - - // attach members - this.importObject(object[key], passAsFirstArgument ? passAsFirstArgument : null, attachTo[key]); - } else { - attachTo[key] = object[key]; - } - } - } -} \ No newline at end of file diff --git a/external-scripts/translate_item.js b/external-scripts/translate_item.js deleted file mode 100644 index d23a43c8..00000000 --- a/external-scripts/translate_item.js +++ /dev/null @@ -1,905 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2012 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Save translator items. - * - * @constructor - * @param {Object} options - *
  • libraryID - ID of library in which items should be saved
  • - *
  • collections - New collections to create (used during Import translation
  • - *
  • attachmentMode - One of Zotero.Translate.ItemSaver.ATTACHMENT_* specifying how attachments should be saved
  • - *
  • forceTagType - Force tags to specified tag type
  • - *
  • cookieSandbox - Cookie sandbox for attachment requests
  • - *
  • proxy - A proxy to deproxify item URLs
  • - *
  • baseURI - URI to which attachment paths should be relative
  • - *
  • sessionID - A sessionID for the save session to allow changes later
  • - * - */ -Zotero.Translate.ItemSaver = function(options) { - this.newItems = []; - this._sessionID = options.sessionID; - this._proxy = options.proxy; - this._baseURI = options.baseURI; - - // Add listener for callbacks, but only for Safari or the bookmarklet. In Chrome, we - // (have to) save attachments from the inject page. - if (Zotero.Messaging && !Zotero.Translate.ItemSaver._attachmentCallbackListenerAdded && - (Zotero.isBookmarklet || Zotero.isSafari)) { - Zotero.Messaging.addMessageListener("attachmentCallback", function(data) { - var id = data[0], - status = data[1]; - var callback = Zotero.Translate.ItemSaver._attachmentCallbacks[id]; - if (callback) { - if (status === false || status === 100) { - delete Zotero.Translate.ItemSaver._attachmentCallbacks[id]; - } else { - data[1] = 50 + data[1] / 2; - } - callback(data[1], data[2]); - } - }); - Zotero.Translate.ItemSaver._attachmentCallbackListenerAdded = true; - } -} -Zotero.Translate.ItemSaver._attachmentCallbackListenerAdded = false; -Zotero.Translate.ItemSaver._attachmentCallbacks = {}; - -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_IGNORE = 0; -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_DOWNLOAD = 1; -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_FILE = 2; - -Zotero.Translate.ItemSaver.prototype = { - saveAsWebpage: function(doc) { - var doc = doc || document; - var item = { - itemType: 'webpage', - title: doc.title, - url: doc.location.href, - attachments: [], - accessDate: Zotero.Date.dateToSQL(new Date(), true) - }; - return this.saveItems([item]); - }, - - /** - * Saves items to Standalone or the server - * @param items Items in Zotero.Item.toArray() format - * @param {Function} [attachmentCallback] A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - */ - saveItems: async function(items, attachmentCallback, itemsDoneCallback = () => 0) { - items = await this._processItems(items); - - // first try to save items via connector - var payload = { - items, - sessionID: this._sessionID, - uri: this._baseURI, - singleFile: true - }; - if (Zotero.isSafari) { - // This is the best in terms of cookies we can do in Safari - payload.cookie = document.cookie; - } - payload.proxy = this._proxy && this._proxy.toJSON(); - - // Add page data for snapshot - let singleFile = false; - for (let item of items) { - for (let attachment of item.attachments) { - if (attachment.mimeType !== 'text/html' || - attachment.snapshot === false) { - continue; - } - if (attachment.url && !this._urlMatchesLocation(attachment.url)) { - continue; - } - - attachment.singleFile = true; - singleFile = true; - } - } - - try { - var data = await Zotero.Connector.callMethodWithCookies("saveItems", payload) - } catch (e) { - if (e.status == 0) { - return this._saveToServer(items, attachmentCallback, itemsDoneCallback); - } - throw e; - } - - Zotero.debug("Translate: Save via Zotero succeeded"); - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { - sessionID: this._sessionID - }); - - if (data && data.items) { - itemsDoneCallback(data.items); - for (let i = 0; i < data.items.length; i++) { - let attachments = items[i].attachments = data.items[i].attachments; - for (let attachment of attachments) { - if (attachment.id) { - if (!attachment.title) attachment.title = 'Attachment'; - attachmentCallback(attachment, 0); - } - } - } - - // CHANGED: Moved this up in the if statement since data is sometimes undefined - this._pollForProgress(data.items, attachmentCallback); - } - - // If we have a snapshot and the client supports SingleFile snapshots - if (singleFile && data && data.singleFile) { - // Do not wait for async function so we continue to update UI - this._executeSingleFile(payload); - } - - // CHANGED: Added if check since data is sometimes undefined - if (data) { - return data.items; - } - }, - - _executeSingleFile: async function(payload) { - try { - payload.snapshotContent = await Zotero.SingleFile.retrievePageData(); - } catch (e) { - // We swallow this error and fall back to saving the - // page in the client - } - - try { - await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: { - "Content-Type": "application/json" - } - }, - payload - ); - } catch (e) { - if (e.status === 400 && e.value === 'Endpoint does not support content-type\n') { - let snapshotContent = payload.snapshotContent; - delete payload.snapshotContent; - - payload.pageData = { - content: snapshotContent, - resources: {} - }; - - // This means a Zotero client that expects SingleFileZ. We can just feed - // it a payload it is expecting with no resources. - await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: { - "Content-Type": "multipart/form-data" - } - }, { - payload: JSON.stringify(payload) - }); - } else { - throw e; - } - } - }, - - /** - * Return true if the attachment URL fuzzy matches the window location - * - * @param {String} attachmentURL - * @return {Boolean} - */ - _urlMatchesLocation: function(attachmentURL) { - // Complete match - if (attachmentURL === location.href) { - return true; - } - // Translators control the attachment URL and historically that URL was passed to - // the client to save a snapshot. Here we are trying to detect if the attachment URL - // has query params that are a subset of the current URL. So for example: - // - // Attachment URL: /records?id=1234 would match the following: - // - // Current URL: /records?id=1234#abstract - // Current URL: /records?id=1234&utm_source=search - // Current URL: /records?utm_source=search&id=1234 - // - // But not match: - // - // Current URL: /records - // Current URL: /records?utm_source=search - // Current URL: /records?id=5678 - const url = new URL(attachmentURL); - if (url.protocol + url.host + url.pathname === location.protocol + location.host + - location.pathname) { - const locationURL = new URL(location.href); - for (const [param, value] of url.searchParams) { - if (locationURL.searchParams.get(param) !== value) { - return false; - } - } - - return true; - } - - return false; - }, - - _processItems: function(items) { - var saveOptions = !Zotero.isBookmarklet && Zotero.Inject.sessionDetails.saveOptions; - if (saveOptions && saveOptions.note && items.length == 1) { - if (items[0].notes) { - items[0].notes.push({ - note: saveOptions.note - }) - } else { - items[0].notes = { - note: saveOptions.note - }; - } - } - return items; - }, - - /** - * Polls for updates to attachment progress - * @param items Items in Zotero.Item.toArray() format - * @param {Function} attachmentCallback A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - * attachmentCallback() will be called with all attachments that will be saved - */ - _pollForProgress: async function(items, attachmentCallback) { - var attachments = []; - for (let item of items) { - if (!item.attachments) continue; - for (let attachment of item.attachments) { - if (attachment.id) { - attachments.push(attachment); - } - } - } - - var nPolls = 0; - while (true) { - try { - var response = await Zotero.Connector.callMethod( - "sessionProgress", { - sessionID: this._sessionID - } - ) - } catch (e) { - // Zotero <=5.0.55 - if (e.status == 404) { - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return this._pollForProgressLegacy(items, attachmentCallback); - } else if (Zotero.isBookmarklet && e.status == 400) { - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - for (let item of items) { - for (let attachment of item.attachments) { - attachmentCallback(Object.assign({}, attachment, { - parentItem: item.id - }), 100); - } - } - } - - for (let attachment of attachments) { - attachmentCallback(attachment, false, "Lost connection to Zotero"); - } - return; - } - - // Store last version of attachments so we can cancel them if a subsequent request fails - let newAttachments = []; - for (let item of response.items) { - if (!item.attachments) continue; - for (let attachment of item.attachments) { - attachment.parentItem = item.id; - attachmentCallback(attachment, attachment.progress); - newAttachments.push(attachment); - } - } - attachments = newAttachments; - - if (nPolls++ < 60 && !response.done) { - await Zotero.Promise.delay(1000); - } else { - break; - } - } - - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - }, - - - _pollForProgressLegacy: function(items, attachmentCallback) { - var attachments = []; - var progressIDs = []; - var previousStatus = []; - for (var i = 0; i < items.length; i++) { - var itemAttachments = items[i].attachments; - for (var j = 0; j < itemAttachments.length; j++) { - if (itemAttachments[j].id) { - attachments.push(itemAttachments[j]); - progressIDs.push(itemAttachments[j].id); - previousStatus.push(0); - } - } - } - - var nPolls = 0; - var poll = function() { - return Zotero.Connector.callMethod("attachmentProgress", progressIDs).then(function(currentStatus) { - for (var i = 0; i < attachments.length; i++) { - if (currentStatus[i] === 100 || currentStatus[i] === false) { - attachmentCallback(attachments[i], currentStatus[i]); - attachments.splice(i, 1); - progressIDs.splice(i, 1); - previousStatus.splice(i, 1); - currentStatus.splice(i, 1); - i--; - } else if (currentStatus[i] !== previousStatus[i]) { - attachmentCallback(attachments[i], currentStatus[i]); - previousStatus[i] = currentStatus[i]; - } - } - - if (nPolls++ < 60 && attachments.length) { - setTimeout(poll, 1000); - } - }, function() { - for (var i = 0; i < attachments.length; i++) { - attachmentCallback(attachments[i], false, "Lost connection to Zotero Standalone"); - } - }); - }; - poll(); - }, - - - /** - * Saves items to server - * @param items Items in Zotero.Item.toArray() format - * @param {Function} attachmentCallback A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - * attachmentCallback() will be called with all attachments that will be saved - */ - _saveToServer: async function(items, attachmentCallback, itemsDoneCallback = () => 0) { - var newItems = [], - itemIndices = [], - typedArraysSupported = false; - try { - typedArraysSupported = !!(new Uint8Array(1) && new Blob()); - } catch (e) {} - - for (var i = 0, n = items.length; i < n; i++) { - var item = items[i]; - // deproxify url - if (this._proxy && item.url) { - item.url = this._proxy.toProper(item.url); - } - itemIndices[i] = newItems.length; - newItems = newItems.concat(Zotero.Utilities.Item.itemToAPIJSON(item)); - if (typedArraysSupported) { - for (let attachment of item.attachments) { - attachment.id = Zotero.Utilities.randomString(); - } - } else { - item.attachments = []; - } - } - - let response = await Zotero.API.createItem(newItems); - try { - var resp = JSON.parse(response); - } catch (e) { - throw new Error("Unexpected response received from server"); - } - - for (var key in resp.failed) { - throw new Error("Save to server failed with " + statusCode + " " + response); - } - - Zotero.debug("Translate: Save to server complete"); - return Zotero.Prefs.getAsync(["downloadAssociatedFiles", "automaticSnapshots"]) - .then(function(prefs) { - if (typedArraysSupported) { - for (var i = 0; i < items.length; i++) { - var item = items[i], - key = resp.success[itemIndices[i]]; - if (item.attachments && item.attachments.length) { - this._saveAttachmentsToServer(key, this._getFileBaseNameFromItem(item), - item.attachments, prefs, attachmentCallback); - } - } - } - - itemsDoneCallback(items); - return items; - }.bind(this)); - }, - - /** - * - * @param {String} itemKey The key of the parent item - * @param {String} baseName A string to use as the base name for attachments - * @param {Object[]} attachments An array of attachment objects - * @param {Object} prefs An object with the values of the downloadAssociatedFiles and automaticSnapshots preferences - * @param {Function} attachmentCallback A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - * @returns {Promise} resolves upon all attachments being uploaded or first failure to upload - * @private - */ - _saveAttachmentsToServer: function(itemKey, baseName, attachments, prefs, attachmentCallback = () => 0) { - var promises = []; - for (let attachment of attachments) { - let isSnapshot = false; - if (attachment.mimeType) { - switch (attachment.mimeType.toLowerCase()) { - case "text/html": - case "application/xhtml+xml": - isSnapshot = true; - } - } - - if ((isSnapshot && !prefs.automaticSnapshots) || (!isSnapshot && !prefs.downloadAssociatedFiles)) { - // Skip attachment due to prefs - continue; - } - - let deferredHeadersProcessed = Zotero.Promise.defer(); - let itemKeyPromise = deferredHeadersProcessed.promise - .then(() => this._createAttachmentItem(itemKey, attachment)); - let deferredAttachmentData = Zotero.Promise.defer(); - - if (attachment.snapshot === false && attachment.mimeType) { - // If we aren't taking a snapshot and we have the MIME type, we don't need - // to download any data - attachment.linkMode = "linked_url"; - attachmentCallback && attachmentCallback(attachment, 0); - deferredHeadersProcessed.resolve(); - deferredAttachmentData.resolve(); - } else if (Zotero.isBookmarklet && window.isSecureContext && attachment.url.indexOf('https') != 0) { - deferredAttachmentData.reject(new Error('Cannot load a HTTP attachment in a HTTPS page')); - } else { - let method = (attachment.snapshot === false ? "HEAD" : "GET"); - let options = { - responseType: (isSnapshot ? "document" : "arraybuffer"), - timeout: 60000 - }; - Zotero.HTTP.request(method, attachment.url, options).then((xhr) => { - deferredHeadersProcessed.resolve(this._processAttachmentHeaders(attachment, xhr, baseName)); - deferredAttachmentData.resolve(xhr.response); - }, (e) => { - deferredHeadersProcessed.reject(e); - deferredAttachmentData.reject(e); - }); - if (attachmentCallback) attachmentCallback(attachment, 0); - } - - let promise = Zotero.Promise.all([itemKeyPromise, deferredAttachmentData.promise]).then(function(result) { - attachmentCallback(attachment, 50); - // Attachment item created on zotero.org, store the key - attachment.key = result[0]; - // Attachment downloaded, store the data - attachment.data = result[1]; - if (attachment.linkMode !== "linked_url") { - return this._uploadAttachmentToServer(attachment, attachmentCallback); - } - }.bind(this)).then(function() { - attachmentCallback(attachment, 100); - }).catch(function(e) { - Zotero.logError(e); - attachmentCallback(Object.assign({}, attachment, { - parentItem: itemKey - }), false, e); - throw e; - }); - promises.push(promise); - } - // This throws if at least one upload fails - return Zotero.Promise.all(promises); - }, - - /** - * Creates an attachment item on the Zotero server. This assigns a "key" to the item - * and allows to upload the attachment data - * - * @param parentItemKey - * @param attachment - * @returns {Promise.} Item key - * @private - */ - _createAttachmentItem: function(parentItemKey, attachment) { - // deproxify url - if (this._proxy && attachment.url) { - attachment.url = this._proxy.toProper(attachment.url); - } - var item = [{ - "itemType": "attachment", - "parentItem": parentItemKey, - "linkMode": attachment.linkMode, - "title": (attachment.title ? attachment.title.toString() : "Untitled Attachment"), - "accessDate": "CURRENT_TIMESTAMP", - "url": attachment.url, - "note": (attachment.note ? attachment.note.toString() : ""), - "tags": (attachment.tags && attachment.tags instanceof Array ? attachment.tags : []) - }]; - - return Zotero.API.createItem(item).then(function(response) { - try { - return JSON.parse(response); - } catch (e) { - throw new Error(`Unexpected response from server ${response}`); - } - }).then(function(response) { - Zotero.debug(`Attachment item created for ${attachment.title}`); - return response.success[0]; - }); - }, - - /** - * Performs attachment header processing and throws an error upon failure. - * - * @param {Object} attachment - * @param {XMLHttpRequest} xhr - * @param {String} baseName - attachment base filename on the server - * @private - */ - _processAttachmentHeaders: function(attachment, xhr, baseName) { - // Validate status - if (xhr.status === 0 || attachment.snapshot === false) { - // Failed due to SOP, or we are supposed to be getting a snapshot - attachment.linkMode = "linked_url"; - } else if (xhr.status !== 200) { - throw new Error(`Zotero.org returned unexpected status code ${xhr.status}`); - } else { - // Validate content type - var contentType = "application/octet-stream", - charset = null, - contentTypeHeader = xhr.getResponseHeader("Content-Type"); - if (contentTypeHeader) { - // See RFC 2616 sec 3.7 - var m = /^[^\x00-\x1F\x7F()<>@,;:\\"\/\[\]?={} ]+\/[^\x00-\x1F\x7F()<>@,;:\\"\/\[\]?={} ]+/.exec(contentTypeHeader); - if (m) contentType = m[0].toLowerCase(); - m = /;\s*charset\s*=\s*("[^"]+"|[^\x00-\x1F\x7F()<>@,;:\\"\/\[\]?={} ]+)/.exec(contentTypeHeader); - if (m) { - charset = m[1]; - if (charset[0] === '"') charset = charset.substring(1, charset.length - 1); - } - - if (attachment.mimeType && - attachment.mimeType.toLowerCase() !== contentType.toLowerCase()) { - throw new Error("Attachment MIME type " + contentType + - " does not match specified type " + attachment.mimeType); - } - } - - attachment.mimeType = contentType; - attachment.linkMode = "imported_url"; - switch (contentType.toLowerCase()) { - case "application/pdf": - attachment.filename = baseName + ".pdf"; - break; - case "text/html": - case "application/xhtml+xml": - attachment.filename = baseName + ".html"; - break; - default: - attachment.filename = baseName; - } - if (charset) attachment.charset = charset; - } - }, - - /** - * Uploads an attachment to the Zotero server - * @param {Object} attachment Attachment object, including - * @param {Function} attachmentCallback A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - */ - "_uploadAttachmentToServer": function(attachment, attachmentCallback) { - Zotero.debug("Uploading attachment to server"); - switch (attachment.mimeType.toLowerCase()) { - case "text/html": - case "application/xhtml+xml": - // It's possible that we didn't know if this was a snapshot until after the - // download began. If this is the case, we need to convert it to a document. - if (attachment.data instanceof ArrayBuffer) { - var me = this, - blob = new Blob([attachment.data], { - "type": attachment.mimeType - }), - reader = new FileReader(); - reader.onloadend = function() { - if (reader.error) { - attachmentCallback(attachment, false, reader.error); - } else { - // Convert to an HTML document - var result = reader.result, - doc; - try { - // First try using DOMParser - doc = (new DOMParser()).parseFromString(result, "text/html"); - } catch (e) {} - - // If DOMParser fails, use document.implementation.createHTMLDocument, - // as documented at https://developer.mozilla.org/en-US/docs/Web/API/DOMParser - if (!doc) { - doc = document.implementation.createHTMLDocument(""); - var docEl = doc.documentElement; - // AMO reviewer: This code is not run in Firefox, and the document - // is never rendered anyway - docEl.innerHTML = result; - if (docEl.children.length === 1 && docEl.firstElementChild === "html") { - doc.replaceChild(docEl.firstElementChild, docEl); - } - } - - attachment.data = doc; - me._uploadAttachmentToServer(attachment, attachmentCallback); - } - } - reader.readAsText(blob, attachment.charset || "iso-8859-1"); - return; - } - - // We are now assured that attachment.data is an HTMLDocument, so we can - // add a base tag - - // Get the head tag - var doc = attachment.data, - head = doc.getElementsByTagName("head"); - if (!head.length) { - head = doc.createElement("head"); - var docEl = attachment.data.documentElement; - docEl.insertBefore(head, docEl.firstChildElement); - } else { - head = head[0]; - } - - // Add the base tag - var base = doc.createElement("base"); - base.href = attachment.url; - head.appendChild(base); - - // Remove content type tags - var metaTags = doc.getElementsByTagName("meta"), - metaTag; - for (var i = 0; i < metaTags.length; i++) { - metaTag = metaTags[i]; - var attr = metaTag.getAttribute("http-equiv"); - if (attr && attr.toLowerCase() === "content-type") { - metaTag.parentNode.removeChild(metaTag); - } - } - - // Add UTF-8 content type - metaTag = doc.createElement("meta"); - metaTag.setAttribute("http-equiv", "Content-Type"); - metaTag.setAttribute("content", attachment.mimeType + "; charset=UTF-8"); - head.insertBefore(metaTag, head.firstChild); - - // Serialize document to UTF-8 - var src = new XMLSerializer().serializeToString(doc), - srcLength = Zotero.Utilities.getStringByteLength(src), - srcArray = new Uint8Array(srcLength); - Zotero.Utilities.stringToUTF8Array(src, srcArray); - - // Rewrite data - attachment.data = srcArray.buffer; - attachment.charset = "UTF-8"; - break; - } - - var binaryHash = this._md5(new Uint8Array(attachment.data), 0, attachment.data.byteLength), - hash = ""; - for (var i = 0; i < binaryHash.length; i++) { - if (binaryHash[i] < 16) hash += "0"; - hash += binaryHash[i].toString(16); - } - attachment.md5 = hash; - - Zotero.Translate.ItemSaver._attachmentCallbacks[attachment.id] = function(status, error) { - attachmentCallback(attachment, status, error); - }; - Zotero.API.uploadAttachment(attachment); - }, - - /** - * Gets the base name for an attachment from an item object. This mimics the default behavior - * of Zotero.Attachments.getFileBaseNameFromItem - * @param {Object} item - */ - "_getFileBaseNameFromItem": function(item) { - var parts = []; - if (item.creators && item.creators.length) { - if (item.creators.length === 1) { - parts.push(item.creators[0].lastName); - } else if (item.creators.length === 2) { - parts.push(item.creators[0].lastName + " and " + item.creators[1].lastName); - } else { - parts.push(item.creators[0].lastName + " et al."); - } - } - - if (item.date) { - var date = Zotero.Date.strToDate(item.date); - if (date.year) parts.push(date.year); - } - - if (item.title) { - parts.push(item.title.substr(0, 50)); - } - - if (parts.length) return parts.join(" - "); - return "Attachment"; - }, - - /* - pdf.js MD5 implementation - Copyright (c) 2011 Mozilla Foundation - - Contributors: Andreas Gal - Chris G Jones - Shaon Barman - Vivien Nicolas <21@vingtetun.org> - Justin D'Arcangelo - Yury Delendik - Kalervo Kujala - Adil Allawi <@ironymark> - Jakob Miland - Artur Adib - Brendan Dahl - David Quintana - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - */ - "_md5": (function calculateMD5Closure() { - // Don't throw if typed arrays are not supported - try { - var r = new Uint8Array([ - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 - ]); - - var k = new Int32Array([ - -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, - -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, - 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, - 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, - 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, - 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, - -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, - -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, - -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, - -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, - -145523070, -1120210379, 718787259, -343485551 - ]); - } catch (e) {}; - - function hash(data, offset, length) { - var h0 = 1732584193, - h1 = -271733879, - h2 = -1732584194, - h3 = 271733878; - // pre-processing - var paddedLength = (length + 72) & ~63; // data + 9 extra bytes - var padded = new Uint8Array(paddedLength); - var i, j, n; - if (offset || length != data.byteLength) { - padded.set(new Uint8Array(data.buffer, offset, length)); - } else { - padded.set(data); - } - i = length; - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) - padded[i++] = 0; - padded[i++] = (length << 3) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - // chunking - // TODO ArrayBuffer ? - var w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = (padded[i] | (padded[i + 1] << 8) | - (padded[i + 2] << 16) | (padded[i + 3] << 24)); - } - var a = h0, - b = h1, - c = h2, - d = h3, - f, g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = (b & c) | ((~b) & d); - g = j; - } else if (j < 32) { - f = (d & b) | ((~d) & c); - g = (5 * j + 1) & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = (3 * j + 5) & 15; - } else { - f = c ^ (b | (~d)); - g = (7 * j) & 15; - } - var tmp = d, - rotateArg = (a + f + k[j] + w[g]) | 0, - rotate = r[j]; - d = c; - c = b; - b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; - a = tmp; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - } - return new Uint8Array([ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF - ]); - } - return hash; - })() -}; \ No newline at end of file diff --git a/external-scripts/translator.js b/external-scripts/translator.js deleted file mode 100644 index aaf93f0f..00000000 --- a/external-scripts/translator.js +++ /dev/null @@ -1,193 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2013 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -// Enumeration of types of translators -var TRANSLATOR_TYPES = { - "import": 1, - "export": 2, - "web": 4, - "search": 8 -}; - -// Properties required for every translator -var TRANSLATOR_REQUIRED_PROPERTIES = ["translatorID", "translatorType", "label", "creator", - "target", "priority", "lastUpdated" -]; -// Properties that are preserved if present -var TRANSLATOR_OPTIONAL_PROPERTIES = ["targetAll", "browserSupport", "minVersion", "maxVersion", - "inRepository", "configOptions", "displayOptions", - "hiddenPrefs", "itemType" -]; -// Properties that are passed from background to inject page in connector -var TRANSLATOR_PASSING_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES - .concat(["targetAll", "browserSupport", "code", "runMode", "itemType", "inRepository"]); - -var TRANSLATOR_CACHING_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES - .concat(["browserSupport", "targetAll"]); - -/** - * @class Represents an individual translator - * @constructor - * @property {String} translatorID Unique GUID of the translator - * @property {Integer} translatorType Type of the translator (use bitwise & with TRANSLATOR_TYPES to read) - * @property {String} label Human-readable name of the translator - * @property {String} creator Author(s) of the translator - * @property {String} target Location that the translator processes - * @property {String} minVersion Minimum Zotero version - * @property {String} maxVersion Minimum Zotero version - * @property {Integer} priority Lower-priority translators will be selected first - * @property {String} browserSupport String indicating browser supported by the translator - * g = Gecko (Firefox) - * c = Google Chrome (WebKit & V8) - * s = Safari (WebKit & Nitro/Squirrelfish Extreme) - * i = Internet Explorer - * b = Bookmarklet - * v = Server - * @property {Object} configOptions Configuration options for import/export - * @property {Object} displayOptions Display options for export - * @property {Object} hiddenPrefs Hidden preferences configurable through about:config - * @property {Boolean} inRepository Whether the translator may be found in the repository - * @property {String} lastUpdated SQL-style date and time of translator's last update - * @property {Object} metadata - Metadata block as object - * @property {String} code The executable JavaScript for the translator - * @property {Boolean} cacheCode Whether to cache code for this session (non-connector only) - * @property {String} [path] File path corresponding to this translator (non-connector only) - * @property {String} [fileName] File name corresponding to this translator (non-connector only) - */ -Zotero.Translator = function(info) { - this.init(info); -} - -/** - * Initializes a translator from a set of info, clearing code if it is set - */ -Zotero.Translator.prototype.init = function(info) { - // make sure we have all the properties - for (let property of TRANSLATOR_REQUIRED_PROPERTIES) { - if (info[property] === undefined) { - this.logError(new Error('Missing property "' + property + '" in translator metadata JSON object in ' + info.label)); - break; - } else { - this[property] = info[property]; - } - } - for (let property of TRANSLATOR_OPTIONAL_PROPERTIES) { - if (info[property] !== undefined) { - this[property] = info[property]; - } - } - - this.browserSupport = info["browserSupport"] ? info["browserSupport"] : "g"; - - var supported = !Zotero.isBookmarklet || this.browserSupport.includes("b") || - /(?:^|; ?)bookmarklet-debug-mode=1(?:$|; ?)/.test(document.cookie); - - if (supported) { - this.runMode = Zotero.Translator.RUN_MODE_IN_BROWSER; - } else { - this.runMode = Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE; - } - - if (this.translatorType & TRANSLATOR_TYPES["import"]) { - // compile import regexp to match only file extension - this.importRegexp = this.target ? new RegExp("\\." + this.target + "$", "i") : null; - } else if (this.hasOwnProperty("importRegexp")) { - delete this.importRegexp; - } - - // Always cache in the connector. Cache if property is set - this.cacheCode = Zotero.isConnector || info.cacheCode; - if (this.translatorType & TRANSLATOR_TYPES["web"]) { - // Also cache if there is no regexp target -- generic translator - this.cacheCode |= !this.target; - this.webRegexp = { - root: this.target ? new RegExp(this.target, "i") : null, - all: this.targetAll ? new RegExp(this.targetAll, "i") : null - }; - } else if (this.hasOwnProperty("webRegexp")) { - delete this.webRegexp; - } - - if (info.path) { - this.path = info.path; - this.fileName = OS.Path.basename(info.path); - } - if (info.code && this.cacheCode) { - this.code = info.code; - } else if (this.hasOwnProperty("code")) { - delete this.code; - } - // Save a copy of the metadata block - delete info.path; - delete info.code; - this.metadata = info; - -}; - -/** - * Get metadata block for a translator - */ -Zotero.Translator.prototype.serialize = function(properties) { - var info = {}; - for (var i in properties) { - var property = properties[i]; - info[property] = this[property]; - } - return info; -} - -/** - * Log a translator-related error - * @param {String} message The error message - * @param {String} [type] The error type ("error", "warning", "exception", or "strict") - * @param {String} [line] The text of the line on which the error occurred - * @param {Integer} lineNumber - * @param {Integer} colNumber - */ -Zotero.Translator.prototype.logError = function(message, type, line, lineNumber, colNumber) { - if (Zotero.isFx && this.path) { - Components.utils.import("resource://gre/modules/FileUtils.jsm"); - var file = new FileUtils.File(this.path); - var ios = Components.classes["@mozilla.org/network/io-service;1"]. - getService(Components.interfaces.nsIIOService); - Zotero.log(message, type ? type : "error", ios.newFileURI(file).spec); - Zotero.debug(message, 1); - } else { - Zotero.logError(message); - } -} - -Zotero.Translator.RUN_MODE_IN_BROWSER = 1; -Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE = 2; -Zotero.Translator.RUN_MODE_ZOTERO_SERVER = 4; -Zotero.Translator.TRANSLATOR_TYPES = TRANSLATOR_TYPES; -Zotero.Translator.TRANSLATOR_REQUIRED_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES; -Zotero.Translator.TRANSLATOR_OPTIONAL_PROPERTIES = TRANSLATOR_OPTIONAL_PROPERTIES; -Zotero.Translator.TRANSLATOR_PASSING_PROPERTIES = TRANSLATOR_PASSING_PROPERTIES; -Zotero.Translator.TRANSLATOR_CACHING_PROPERTIES = TRANSLATOR_CACHING_PROPERTIES; - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = Zotero.Translator; -} \ No newline at end of file diff --git a/external-scripts/translators.js b/external-scripts/translators.js deleted file mode 100644 index 5f5c7658..00000000 --- a/external-scripts/translators.js +++ /dev/null @@ -1,371 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -// Enumeration of types of translators -var TRANSLATOR_TYPES = Zotero.Translator.TRANSLATOR_TYPES; - -/** - * Singleton to handle loading and caching of translators - * @namespace - */ -Zotero.Translators = new function() { - var _cache, _translators; - var _initialized = false; - var _fullFrameDetectionWhitelist = ['resolver.ebscohost.com']; - var _resetAttempted = false; - - /** - * Initializes translator cache, loading all relevant translators into memory - * @param {Zotero.Translate[]} [translators] List of translators. If not specified, it will be - * retrieved from storage. - */ - this.init = async function(translators) { - if (!translators) { - translators = []; - if ((Zotero.isBrowserExt || Zotero.isSafari) && Zotero.Prefs.get("translatorMetadata")) { - try { - translators = Zotero.Prefs.get("translatorMetadata"); - if (typeof translators !== "object") { - translators = []; - } - } catch (e) {} - } - } - - _cache = { - "import": [], - "export": [], - "web": [], - "search": [] - }; - _translators = {}; - _initialized = true; - - // Build caches - for (var i = 0; i < translators.length; i++) { - try { - var translator = new Zotero.Translator(translators[i]); - _translators[translator.translatorID] = translator; - - for (var type in TRANSLATOR_TYPES) { - if (translator.translatorType & TRANSLATOR_TYPES[type]) { - _cache[type].push(translator); - } - } - } catch (e) { - Zotero.logError(e); - try { - Zotero.logError("Could not load translator " + JSON.stringify(translators[i])); - } catch (e) {} - } - } - - // Huge number of translator metadata missing. Attempt to reset. - // NOTE: If the number of translators significantly decreases (currently at 450ish) - // then this will trigger on every translator init. - if (Object.keys(_translators).length < 400 && !_resetAttempted) { - _resetAttempted = true; - Zotero.logError(new Error(`Only ${Object.keys(_translators).length} translators present in cache. Resetting`)); - Zotero.Prefs.clear("connector.repo.lastCheck.repoTime"); - Zotero.Prefs.clear("connector.repo.lastCheck.localTime"); - return Zotero.Repo.update(true); - } - - // Sort by priority - var cmp = function(a, b) { - if (a.priority > b.priority) { - return 1; - } else if (a.priority < b.priority) { - return -1; - } - } - for (var type in _cache) { - _cache[type].sort(cmp); - } - } - - /** - * Gets the translator that corresponds to a given ID, without attempting to retrieve code - * @param {String} id The ID of the translator - */ - this.getWithoutCode = async function(id) { - if (!_initialized) await Zotero.Translators.init(); - return _translators[id] ? _translators[id] : false; - } - - /** - * Load code for a translator - */ - this.getCodeForTranslator = async function(translator) { - if (!_initialized) await Zotero.Translators.init(); - if (translator.code) return translator.code; - - let code = await Zotero.Repo.getTranslatorCode(translator.translatorID); - translator.code = code; - return code; - } - - /** - * Gets the translator that corresponds to a given ID - * - * @param {String} id The ID of the translator - */ - this.get = async function(id) { - if (!_initialized) await Zotero.Translators.init(); - var translator = _translators[id]; - if (!translator) { - return false; - } - - // only need to get code if it is of some use - if (translator.runMode === Zotero.Translator.RUN_MODE_IN_BROWSER && - !translator.hasOwnProperty("code")) { - await Zotero.Translators.getCodeForTranslator(translator); - } - return translator; - }; - - /** - * Gets all translators for a specific type of translation - * @param {String} type The type of translators to get (import, export, web, or search) - * @param {Boolean} [debugMode] Whether to assume debugging mode. If true, code is included for - * unsupported translators, and code originally retrieved from the - * repo is re-retrieved from Zotero Standalone. - */ - this.getAllForType = async function(type, debugMode) { - if (!_initialized) await Zotero.Translators.init(); - var translators = _cache[type].slice(0); - var codeGetter = new Zotero.Translators.CodeGetter(translators, debugMode); - await codeGetter.getAll(); - return translators; - }; - - /** - * Gets web translators for a specific location - * - * NOTE: Keep in sync with the bookmarklet version - * - * @param {String} uri The URI for which to look for translators - * @return {Promise} - A promise for a 2-item array containing an array of translators and - * an array of functions for converting URLs from proper to proxied forms - */ - this.getWebTranslatorsForLocation = async function(URI, rootURI, callback) { - await Zotero.initDeferred.promise; - if (callback) { - // If callback is present then this call is coming from an injected frame, - // so we may as well treat it as if it's a root-frame - rootURI = URI; - } else { - // Hopefully a temporary hard-coded list - for (let str of _fullFrameDetectionWhitelist) { - if (URI.includes(str)) { - rootURI = URI; - break; - } - } - } - var isFrame = URI !== rootURI; - if (!_initialized) await Zotero.Translators.init(); - var allTranslators = _cache["web"]; - var potentialTranslators = []; - var proxies = []; - - var rootSearchURIs = Zotero.Proxies.getPotentialProxies(rootURI); - var frameSearchURIs = isFrame ? Zotero.Proxies.getPotentialProxies(URI) : rootSearchURIs; - - Zotero.debug("Translators: Looking for translators for " + Object.keys(frameSearchURIs).join(', ')); - - for (var i = 0; i < allTranslators.length; i++) { - var translator = allTranslators[i]; - if (isFrame && !translator.webRegexp.all) { - continue; - } - rootURIsLoop: - for (var rootSearchURI in rootSearchURIs) { - var isGeneric = !allTranslators[i].webRegexp.root; - // don't attempt to use generic translators that can't be run in this browser - // since that would require transmitting every page to Zotero host - if (isGeneric && allTranslators[i].runMode !== Zotero.Translator.RUN_MODE_IN_BROWSER) { - continue; - } - - var rootURIMatches = isGeneric || rootSearchURI.length < 8192 && translator.webRegexp.root.test(rootSearchURI); - if (translator.webRegexp.all && rootURIMatches) { - for (var frameSearchURI in frameSearchURIs) { - var frameURIMatches = frameSearchURI.length < 8192 && translator.webRegexp.all.test(frameSearchURI); - - if (frameURIMatches) { - potentialTranslators.push(translator); - proxies.push(frameSearchURIs[frameSearchURI]); - // prevent adding the translator multiple times - break rootURIsLoop; - } - } - } else if (!isFrame && (isGeneric || rootURIMatches)) { - potentialTranslators.push(translator); - proxies.push(rootSearchURIs[rootSearchURI]); - break; - } - } - } - - var codeGetter = new Zotero.Translators.CodeGetter(potentialTranslators); - await codeGetter.getAll(); - return [potentialTranslators, proxies]; - }; - - /** - * Converts translators to JSON-serializable objects - */ - this.serialize = function(translator, properties) { - // handle translator arrays - if (translator.length !== undefined) { - var newTranslators = new Array(translator.length); - for (var i in translator) { - newTranslators[i] = Zotero.Translators.serialize(translator[i], properties); - } - return newTranslators; - } - - // handle individual translator - var newTranslator = {}; - for (var i in properties) { - var property = properties[i]; - newTranslator[property] = translator[property]; - } - return newTranslator; - } - - /** - * Saves all translator metadata to localStorage - * @param {Object[]} newMetadata Metadata for new translators - * @param {Boolean} reset Whether to clear all existing translators and overwrite them with - * the specified translators. - */ - this.update = async function(newMetadata, reset = false) { - if (!_initialized) await Zotero.Translators.init(); - if (!newMetadata.length) return; - var serializedTranslators = []; - - if (reset) { - serializedTranslators = this.serialize(newMetadata, Zotero.Translator.TRANSLATOR_CACHING_PROPERTIES); - } else { - var hasChanged = false; - - // Update translators with new metadata - for (var i in newMetadata) { - var newTranslator = newMetadata[i]; - - if (newTranslator.deleted) continue; - - if (_translators.hasOwnProperty(newTranslator.translatorID)) { - var oldTranslator = _translators[newTranslator.translatorID]; - - // check whether translator has changed - if (oldTranslator.lastUpdated !== newTranslator.lastUpdated) { - // check whether newTranslator is actually newer than the existing - // translator, and if not, don't update - if (Zotero.Date.sqlToDate(newTranslator.lastUpdated) < Zotero.Date.sqlToDate(oldTranslator.lastUpdated)) { - continue; - } - - Zotero.debug(`Translators: Updating ${newTranslator.label}`); - oldTranslator.init(newTranslator); - hasChanged = true; - } - } else { - Zotero.debug(`Translators: Adding ${newTranslator.label}`); - _translators[newTranslator.translatorID] = new Zotero.Translator(newTranslator); - hasChanged = true; - } - } - - let deletedTranslators = newMetadata - .filter(translator => translator.deleted) - .map(translator => translator.translatorID); - - for (let id of deletedTranslators) { - // Already deleted - if (!_translators.hasOwnProperty(id)) continue; - - hasChanged = true; - Zotero.debug(`Translators: Removing ${_translators[id].label}`); - delete _translators[id]; - } - - if (!hasChanged) return; - - // Serialize translators - for (var i in _translators) { - var serializedTranslator = this.serialize(_translators[i], Zotero.Translator.TRANSLATOR_CACHING_PROPERTIES); - - serializedTranslators.push(serializedTranslator); - } - } - - // Store - if (Zotero.isBrowserExt || Zotero.isSafari) { - Zotero.Prefs.set('translatorMetadata', serializedTranslators); - Zotero.debug("Translators: Saved updated translator list (" + serializedTranslators.length + " translators)"); - } - - // Reinitialize - await Zotero.Translators.init(serializedTranslators); - } -} - -/** - * A class to get the code for a set of translators at once - * - * @param {Zotero.Translator[]} translators Translators for which to retrieve code - */ -Zotero.Translators.CodeGetter = function(translators) { - this._translators = translators; - this._concurrency = 2; -}; - -Zotero.Translators.CodeGetter.prototype.getCodeFor = async function(i) { - let translator = this._translators[i]; - try { - translator.code = await Zotero.Translators.getCodeForTranslator(translator); - } catch (e) { - Zotero.debug(`Failed to retrieve code for ${translator.translatorID}`) - } - return translator.code; -}; - -Zotero.Translators.CodeGetter.prototype.getAll = async function() { - let codes = []; - // Chain promises with some level of concurrency. If unchained, fires - // off hundreds of xhttprequests on connectors and crashes the extension - for (let i = 0; i < this._translators.length; i++) { - if (i < this._concurrency) { - codes.push(this.getCodeFor(i)); - } else { - codes.push(codes[i - this._concurrency].then(() => this.getCodeFor(i))); - } - } - return Promise.all(codes); -}; \ No newline at end of file diff --git a/external-scripts/utilities-common.js b/external-scripts/utilities-common.js deleted file mode 100644 index 298634d6..00000000 --- a/external-scripts/utilities-common.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - - "use strict"; - - Zotero.Utilities = Zotero.Utilities || {}; - - Zotero.Utilities.kbEventToShortcutString = function(e) { - const keymap = [ - ['ctrlKey', 'Ctrl+'], - ['shiftKey', 'Shift+'], - ['altKey', 'Alt+'], - ['metaKey', '⌘'], - ]; - let val = ""; - for (let [key, value] of keymap) { - if (e[key]) { - val += value; - } - } - val += e.key.length == 1 ? e.key.toUpperCase() : ''; - return val; - } - - if (!Zotero.Utilities.Internal) { - Zotero.Utilities.Internal = {}; - } - Zotero.Utilities.Internal.filterStack = function(stack) { - return stack; - } - -})(); \ No newline at end of file diff --git a/external-scripts/utilities-schema.js b/external-scripts/utilities-schema.js deleted file mode 100644 index 8e36071d..00000000 --- a/external-scripts/utilities-schema.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2021 Corporation for Digital Scholarship - Vienna, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.Schema = { - /** - * This must be called before translation - * @param data - Zotero schema from https://github.com/zotero/zotero-schema or - * https://api.zotero.org/schema - */ - init(data) { - if (typeof data == 'string') { - data = JSON.parse(data); - } - // CSL type/field mappings used by Utilities.Item.itemFromCSLJSON() - Zotero.Schema.CSL_TYPE_MAPPINGS = {}; - Zotero.Schema.CSL_TYPE_MAPPINGS_REVERSE = {}; - for (let cslType in data.csl.types) { - for (let zoteroType of data.csl.types[cslType]) { - Zotero.Schema.CSL_TYPE_MAPPINGS[zoteroType] = cslType; - } - Zotero.Schema.CSL_TYPE_MAPPINGS_REVERSE[cslType] = [...data.csl.types[cslType]]; - } - Zotero.Schema.CSL_TEXT_MAPPINGS = data.csl.fields.text; - Zotero.Schema.CSL_DATE_MAPPINGS = data.csl.fields.date; - Zotero.Schema.CSL_NAME_MAPPINGS = data.csl.names; - Zotero.Schema.CSL_FIELD_MAPPINGS_REVERSE = {}; - for (let cslField in data.csl.fields.text) { - for (let zoteroField of data.csl.fields.text[cslField]) { - Zotero.Schema.CSL_FIELD_MAPPINGS_REVERSE[zoteroField] = cslField; - } - } - for (let cslField in data.csl.fields.date) { - let zoteroField = data.csl.fields.date[cslField]; - Zotero.Schema.CSL_FIELD_MAPPINGS_REVERSE[zoteroField] = cslField; - } - } -}; - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = Zotero.Schema; -} \ No newline at end of file diff --git a/external-scripts/utilities.js b/external-scripts/utilities.js deleted file mode 100644 index 6875006e..00000000 --- a/external-scripts/utilities.js +++ /dev/null @@ -1,1895 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - - Utilities based in part on code taken from Piggy Bank 2.1.1 (BSD-licensed) - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - - function movedToUtilitiesInternal(fnName) { - return function() { - if (Zotero.Utilities && Zotero.Utilities.Internal) { - Zotero.debug(`Zotero.Utilities.${fnName}() is deprecated -- use Zotero.Utilities.Internal.${fnName}() instead`); - return Zotero.Utilities.Internal[fnName].apply(Zotero.Utilities.Internal, arguments); - } else { - throw new Error(`Zotero.Utilities.${fnName}() is only available in the zotero-client codebase`) - } - } - } - - /** - * @class Functions for text manipulation and other miscellaneous purposes - */ - var Utilities = { - /** - * Returns a function which will execute `fn` with provided arguments after `delay` milliseconds and not more - * than once, if called multiple times. See - * http://stackoverflow.com/questions/24004791/can-someone-explain-the-debounce-function-in-javascript - * @param fn {Function} function to debounce - * @param delay {Integer} number of milliseconds to delay the function execution - * @returns {Function} - */ - debounce: function(fn, delay = 500) { - var timer = null; - return function() { - let args = arguments; - clearTimeout(timer); - timer = setTimeout(function() { - fn.apply(this, args); - }.bind(this), delay); - }; - }, - - /** - * Creates and returns a new, throttled version of the - * passed function, that, when invoked repeatedly, - * will only actually call the original function at most - * once per every wait milliseconds - * - * By default, throttle will execute the function as soon - * as you call it for the first time, and, if you call it - * again any number of times during the wait period, as soon - * as that period is over. If you'd like to disable the - * leading-edge call, pass {leading: false}, and if you'd - * like to disable the execution on the trailing-edge, - * pass {trailing: false}. See - * https://underscorejs.org/#throttle - * https://github.com/jashkenas/underscore/blob/master/underscore.js - * (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Underscore may be freely distributed under the MIT license. - * - * @param {Function} func Function to throttle - * @param {Integer} wait Wait period in milliseconds - * @param {Boolean} [options.leading] Call at the beginning of the wait period - * @param {Boolean} [options.trailing] Call at the end of the wait period - */ - throttle: function(func, wait, options) { - var context, args, result; - var timeout = null; - var previous = 0; - if (!options) options = {}; - var later = function() { - previous = options.leading === false ? 0 : Date.now(); - timeout = null; - result = func.apply(context, args); - if (!timeout) context = args = null; - }; - return function() { - var now = Date.now(); - if (!previous && options.leading === false) previous = now; - var remaining = wait - (now - previous); - context = this; - args = arguments; - if (remaining <= 0 || remaining > wait) { - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - previous = now; - result = func.apply(context, args); - if (!timeout) context = args = null; - } else if (!timeout && options.trailing !== false) { - timeout = setTimeout(later, remaining); - } - return result; - }; - }, - - /** - * Fixes author name capitalization. - * Currently for all uppercase names only - * - * JOHN -> John - * GUTIÉRREZ-ALBILLA -> GutiĂ©rrez-Albilla - * O'NEAL -> O'Neal - * - * @param {String} string Uppercase author name - * @return {String} Title-cased author name - */ - capitalizeName: function(string) { - if (typeof string === "string" && string.toUpperCase() === string) { - string = Utilities.XRegExp.replace( - string.toLowerCase(), - Utilities.XRegExp('(^|[^\\pL])\\pL', 'g'), - m => m.toUpperCase() - ); - } - return string; - }, - - /** - * Cleans extraneous punctuation off a creator name and parse into first and last name - * - * @param {String} author Creator string - * @param {String} type Creator type string (e.g., "author" or "editor") - * @param {Boolean} useComma Whether the creator string is in inverted (Last, First) format - * @return {Object} firstName, lastName, and creatorType - */ - cleanAuthor: function(author, type, useComma) { - var allCaps = 'A-Z' + - '\u0400-\u042f'; //cyrilic - - var allCapsRe = new RegExp('^[' + allCaps + ']+$'); - var initialRe = new RegExp('^-?[' + allCaps + ']$'); - - if (typeof(author) != "string") { - throw new Error("cleanAuthor: author must be a string"); - } - - author = author.replace(/^[\s\u00A0\.\,\/\[\]\:]+/, '') - .replace(/[\s\u00A0\.\,\/\[\]\:]+$/, '') - .replace(/[\s\u00A0]+/, ' '); - - if (useComma) { - // Add spaces between periods - author = author.replace(/\.([^ ])/, ". $1"); - - var splitNames = author.split(/[,ØŒ] ?/); - if (splitNames.length > 1) { - var lastName = splitNames[0]; - var firstName = splitNames[1]; - } else { - var lastName = author; - } - } else { - // Don't parse "Firstname Lastname [Country]" as "[Country], Firstname Lastname" - var spaceIndex = author.length; - do { - spaceIndex = author.lastIndexOf(" ", spaceIndex - 1); - var lastName = author.substring(spaceIndex + 1); - var firstName = author.substring(0, spaceIndex); - } while (!Utilities.XRegExp('\\pL').test(lastName[0]) && spaceIndex > 0) - } - - if (firstName && allCapsRe.test(firstName) && - firstName.length < 4 && - (firstName.length == 1 || lastName.toUpperCase() != lastName)) { - // first name is probably initials - var newFirstName = ""; - for (var i = 0; i < firstName.length; i++) { - newFirstName += " " + firstName[i] + "."; - } - firstName = newFirstName.substr(1); - } - - //add periods after all the initials - if (firstName) { - var names = firstName.replace(/^[\s\.]+/, '') - .replace(/[\s\,]+$/, '') - //remove spaces surronding any dashes - .replace(/\s*([\u002D\u00AD\u2010-\u2015\u2212\u2E3A\u2E3B])\s*/, '-') - .split(/(?:[\s\.]+|(?=-))/); - var newFirstName = ''; - for (var i = 0, n = names.length; i < n; i++) { - newFirstName += names[i]; - if (initialRe.test(names[i])) newFirstName += '.'; - newFirstName += ' '; - } - firstName = newFirstName.replace(/ -/g, '-').trim(); - } - - return { - firstName: firstName, - lastName: lastName, - creatorType: type - }; - }, - - /** - * Removes leading and trailing whitespace from a string - * @type String - */ - trim: function( /**String*/ s) { - if (typeof(s) != "string") { - throw new Error("trim: argument must be a string"); - } - - s = s.replace(/^\s+/, ""); - return s.replace(/\s+$/, ""); - }, - - /** - * Cleans whitespace off a string and replaces multiple spaces with one - * @type String - */ - trimInternal: function( /**String*/ s) { - if (typeof(s) != "string") { - throw new Error("trimInternal: argument must be a string"); - } - - s = s.replace(/[\xA0\r\n\s]+/g, " "); - return this.trim(s); - }, - - /** - * Cleans any non-word non-parenthesis characters off the ends of a string - * @type String - */ - superCleanString: function( /**String*/ x) { - if (typeof(x) != "string") { - throw new Error("superCleanString: argument must be a string"); - } - - var x = x.replace(/^[\x00-\x27\x29-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F\s]+/, ""); - return x.replace(/[\x00-\x28\x2A-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F\s]+$/, ""); - }, - - isHTTPURL: function(url, allowNoScheme = false) { - // From https://stackoverflow.com/a/3809435 - var noSchemeRE = /^[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; - return /^https?:\/\//.test(url) || - (allowNoScheme && !url.startsWith('mailto:') && noSchemeRE.test(url)); - }, - - /** - * Cleans a http url string - * @param url {String} - * @params tryHttp {Boolean} Attempt prepending 'http://' to the url - * @returns {String} - */ - cleanURL: function(url, tryHttp = false) { - url = url.trim(); - if (!url) return false; - - try { - return Services.io.newURI(url, null, null).spec; // Valid URI if succeeds - } catch (e) { - if (e instanceof Components.Exception && - e.result == Components.results.NS_ERROR_MALFORMED_URI - ) { - if (tryHttp && /\w\.\w/.test(url)) { - // Assume it's a URL missing "http://" part - try { - return Services.io.newURI('http://' + url, null, null).spec; - } catch (e) {} - } - - Zotero.debug('cleanURL: Invalid URI: ' + url, 2); - return false; - } - throw e; - } - }, - - /** - * Eliminates HTML tags, replacing <br>s with newlines - * @type String - */ - cleanTags: function( /**String*/ x) { - if (typeof(x) != "string") { - throw new Error("cleanTags: argument must be a string"); - } - - x = x.replace(/]*>/gi, "\n"); - x = x.replace(/<\/p>/gi, "\n\n"); - return x.replace(/<[^>]+>/g, ""); - }, - - extractIdentifiers: function(text) { - var identifiers = []; - var foundIDs = new Set(); // keep track of identifiers to avoid duplicates - - // First look for DOIs - var ids = text.split(/[\s\u00A0]+/); // whitespace + non-breaking space - var doi; - for (let id of ids) { - if ((doi = Zotero.Utilities.cleanDOI(id)) && !foundIDs.has(doi)) { - identifiers.push({ - DOI: doi - }); - foundIDs.add(doi); - } - } - - // Then try ISBNs - if (!identifiers.length) { - // First try replacing dashes - let ids = text.replace(/[\u002D\u00AD\u2010-\u2015\u2212]+/g, "") // hyphens and dashes - .toUpperCase(); - let ISBN_RE = /(?:\D|^)(97[89]\d{10}|\d{9}[\dX])(?!\d)/g; - let isbn; - while (isbn = ISBN_RE.exec(ids)) { - isbn = Zotero.Utilities.cleanISBN(isbn[1]); - if (isbn && !foundIDs.has(isbn)) { - identifiers.push({ - ISBN: isbn - }); - foundIDs.add(isbn); - } - } - - // Next try spaces - if (!identifiers.length) { - ids = ids.replace(/[ \u00A0]+/g, ""); // space + non-breaking space - while (isbn = ISBN_RE.exec(ids)) { - isbn = Zotero.Utilities.cleanISBN(isbn[1]); - if (isbn && !foundIDs.has(isbn)) { - identifiers.push({ - ISBN: isbn - }); - foundIDs.add(isbn); - } - } - } - } - - // Next try arXiv - if (!identifiers.length) { - // arXiv identifiers are extracted without version number - // i.e. 0706.0044v1 is extracted as 0706.0044, - // because arXiv OAI API doesn't allow to access individual versions - let arXiv_RE = /((?:[^A-Za-z]|^)([\-A-Za-z\.]+\/\d{7})(?:(v[0-9]+)|)(?!\d))|((?:\D|^)(\d{4}\.\d{4,5})(?:(v[0-9]+)|)(?!\d))/g; - let m; - while ((m = arXiv_RE.exec(text))) { - let arXiv = m[2] || m[5]; - if (arXiv && !foundIDs.has(arXiv)) { - identifiers.push({ - arXiv: arXiv - }); - foundIDs.add(arXiv); - } - } - } - - // Next, try ADS Bibcodes - if (!identifiers.length) { - // regex as in the ADS Bibcode translator - let adsBibcode_RE = /\b(\d{4}\D\S{13}[A-Z.:])\b/g; - let adsBibcode; - while ((adsBibcode = adsBibcode_RE.exec(text)) && !foundIDs.has(adsBibcode)) { - identifiers.push({ - adsBibcode: adsBibcode[1] - }); - foundIDs.add(adsBibcode); - } - } - - // Finally, try PMID - if (!identifiers.length) { - // PMID; right now, the longest PMIDs are 8 digits, so it doesn't seem like we'll - // need to discriminate for a fairly long time - let PMID_RE = /(^|\s|,|:)(\d{1,9})(?=\s|,|$)/g; - let pmid; - while ((pmid = PMID_RE.exec(text)) && !foundIDs.has(pmid)) { - identifiers.push({ - PMID: pmid[2] - }); - foundIDs.add(pmid); - } - } - - return identifiers; - }, - - /** - * Strip info:doi prefix and any suffixes from a DOI - * @type String - */ - cleanDOI: function( /**String**/ x) { - if (typeof(x) != "string") { - throw new Error("cleanDOI: argument must be a string"); - } - - var doi = x.match(/10(?:\.[0-9]{4,})?\/[^\s]*[^\s\.,]/); - return doi ? doi[0] : null; - }, - - /** - * Clean and validate ISBN. - * Return isbn if valid, otherwise return false - * @param {String} isbn - * @param {Boolean} [dontValidate=false] Do not validate check digit - * @return {String|Boolean} Valid ISBN or false - */ - cleanISBN: function(isbnStr, dontValidate) { - isbnStr = isbnStr.toUpperCase() - .replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes - var isbnRE = /\b(?:97[89]\s*(?:\d\s*){9}\d|(?:\d\s*){9}[\dX])\b/g, - isbnMatch; - while (isbnMatch = isbnRE.exec(isbnStr)) { - var isbn = isbnMatch[0].replace(/\s+/g, ''); - - if (dontValidate) { - return isbn; - } - - if (isbn.length == 10) { - // Verify ISBN-10 checksum - var sum = 0; - for (var i = 0; i < 9; i++) { - sum += isbn[i] * (10 - i); - } - //check digit might be 'X' - sum += (isbn[9] == 'X') ? 10 : isbn[9] * 1; - - if (sum % 11 == 0) return isbn; - } else { - // Verify ISBN 13 checksum - var sum = 0; - for (var i = 0; i < 12; i += 2) sum += isbn[i] * 1; //to make sure it's int - for (var i = 1; i < 12; i += 2) sum += isbn[i] * 3; - sum += isbn[12] * 1; //add the check digit - - if (sum % 10 == 0) return isbn; - } - - isbnRE.lastIndex = isbnMatch.index + 1; // Retry the same spot + 1 - } - - return false; - }, - - /* - * Convert ISBN 10 to ISBN 13 - * @param {String} isbn ISBN 10 or ISBN 13 - * cleanISBN - * @return {String} ISBN-13 - */ - toISBN13: function(isbnStr) { - var isbn; - if (!(isbn = Utilities.cleanISBN(isbnStr, true))) { - throw new Error('ISBN not found in "' + isbnStr + '"'); - } - - if (isbn.length == 13) { - isbn = isbn.substr(0, 12); // Strip off check digit and re-calculate it - } else { - isbn = '978' + isbn.substr(0, 9); - } - - var sum = 0; - for (var i = 0; i < 12; i++) { - sum += isbn[i] * (i % 2 ? 3 : 1); - } - - var checkDigit = 10 - (sum % 10); - if (checkDigit == 10) checkDigit = 0; - - return isbn + checkDigit; - }, - - /** - * Clean and validate ISSN. - * Return issn if valid, otherwise return false - */ - cleanISSN: function( /**String*/ issnStr) { - issnStr = issnStr.toUpperCase() - .replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes - var issnRE = /\b(?:\d\s*){7}[\dX]\b/g, - issnMatch; - while (issnMatch = issnRE.exec(issnStr)) { - var issn = issnMatch[0].replace(/\s+/g, ''); - - // Verify ISSN checksum - var sum = 0; - for (var i = 0; i < 7; i++) { - sum += issn[i] * (8 - i); - } - //check digit might be 'X' - sum += (issn[7] == 'X') ? 10 : issn[7] * 1; - - if (sum % 11 == 0) { - return issn.substring(0, 4) + '-' + issn.substring(4); - } - - issnRE.lastIndex = issnMatch.index + 1; // Retry same spot + 1 - } - - return false; - }, - - /** - * Convert plain text to HTML by replacing special characters and replacing newlines with BRs or - * P tags - * @param {String} str Plain text string - * @param {Boolean} singleNewlineIsParagraph Whether single newlines should be considered as - * paragraphs. If true, each newline is replaced with a P tag. If false, double newlines - * are replaced with P tags, while single newlines are replaced with BR tags. - * @type String - */ - text2html: function( /**String**/ str, /**Boolean**/ singleNewlineIsParagraph) { - str = Utilities.htmlSpecialChars(str); - - // \n =>

    - if (singleNewlineIsParagraph) { - str = '

    ' + - str.replace(/\n/g, '

    ') - .replace(/ /g, '  ') + - '

    '; - } - // \n\n =>

    , \n =>
    - else { - str = '

    ' + - str.replace(/\n\n/g, '

    ') - .replace(/\n/g, '
    ') - .replace(/ /g, '  ') + - '

    '; - } - return str.replace(/

    \s*<\/p>/g, '

     

    '); - }, - - /** - * Encode special XML/HTML characters - * Certain entities can be inserted manually: - * =>
    - * => … - * - * @param {String} str - * @return {String} - */ - htmlSpecialChars: function(str) { - if (str && typeof str != 'string') { - Zotero.debug('#htmlSpecialChars: non-string arguments are deprecated. Update your code', - 1, undefined, true); - str = str.toString(); - } - - if (!str) return ''; - - return str - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>') - .replace(/<ZOTERO([^\/]+)\/>/g, function(str, p1, offset, s) { - switch (p1) { - case 'BREAK': - return '
    '; - case 'HELLIP': - return '…'; - default: - return p1; - } - }); - }, - - /** - * Decodes HTML entities within a string, returning plain text - * @type String - */ - "unescapeHTML": new function() { - var nsIScriptableUnescapeHTML, node; - - return function( /**String*/ str) { - // If no tags, no need to unescape - if (str.indexOf("<") === -1 && str.indexOf("&") === -1) return str; - - if (Zotero.isFx && !Zotero.isBookmarklet) { - // Create a node and use the textContent property to do unescaping where - // possible, because this approach preserves line endings in the HTML - if (node === undefined) { - node = Utilities.Internal.getDOMDocument().createElement("div"); - } - - node.innerHTML = str; - return node.textContent.replace(/ {2,}/g, " "); - } else if (Zotero.isNode) { - let { - JSDOM - } = require('jsdom'); - let document = (new JSDOM(str)).window.document; - return document.documentElement.textContent.replace(/ {2,}/g, " "); - } else { - if (!node) node = document.createElement("div"); - node.innerHTML = str; - return ("textContent" in node ? node.textContent : node.innerText).replace(/ {2,}/g, " "); - } - }; - }, - - /** - * Wrap URLs and DOIs in links in plain text - * - * Ignore URLs preceded by '>', just in case there are already links - * @type String - */ - autoLink: function( /**String**/ str) { - // "http://www.google.com." - // "http://www.google.com. " - // "" (and other characters, with or without a space after) - str = str.replace(/([^>])(https?:\/\/[^\s]+)([\."'>:\]\)](\s|$))/g, '$1$2$3'); - // "http://www.google.com" - // "http://www.google.com " - str = str.replace(/([^">])(https?:\/\/[^\s]+)(\s|$)/g, '$1$2$3'); - - // DOI - str = str.replace(/(doi:[ ]*)(10\.[^\s]+[0-9a-zA-Z])/g, '$1$2'); - return str; - }, - - /** - * Parses a text string for HTML/XUL markup and returns an array of parts. Currently only finds - * HTML links (<a> tags) - * - * @return {Array} An array of objects with the following form:
    - *
       {
    -		 *         type: 'text'|'link',
    -		 *         text: "text content",
    -		 *         [ attributes: { key1: val [ , key2: val, ...] }
    -		 *    }
    - */ - parseMarkup: function( /**String*/ str) { - var parts = []; - var splits = str.split(/(]+>[^<]*<\/a>)/); - - for (var i = 0; i < splits.length; i++) { - // Link - if (splits[i].indexOf(']+)>([^<]*)<\/a>/); - if (matches) { - // Attribute pairs - var attributes = {}; - var pairs = matches[1].match(/([^ =]+)="([^"]+")/g); - for (var j = 0; j < pairs.length; j++) { - var keyVal = pairs[j].split(/=/); - attributes[keyVal[0]] = keyVal[1].substr(1, keyVal[1].length - 2); - } - - parts.push({ - type: 'link', - text: matches[2], - attributes: attributes - }); - continue; - } - } - - parts.push({ - type: 'text', - text: splits[i] - }); - } - - return parts; - }, - - /** - * Calculates the Levenshtein distance between two strings - * @type Number - */ - levenshtein: function( /**String*/ a, /**String**/ b) { - var aLen = a.length; - var bLen = b.length; - - var arr = new Array(aLen + 1); - var i, j, cost; - - for (i = 0; i <= aLen; i++) { - arr[i] = new Array(bLen); - arr[i][0] = i; - } - - for (j = 0; j <= bLen; j++) { - arr[0][j] = j; - } - - for (i = 1; i <= aLen; i++) { - for (j = 1; j <= bLen; j++) { - cost = (a[i - 1] == b[j - 1]) ? 0 : 1; - arr[i][j] = Math.min(arr[i - 1][j] + 1, Math.min(arr[i][j - 1] + 1, arr[i - 1][j - 1] + cost)); - } - } - - return arr[aLen][bLen]; - }, - - /** - * Test if an object is empty - * - * @param {Object} obj - * @type Boolean - */ - isEmpty: function(obj) { - for (var i in obj) { - return false; - } - return true; - }, - - /** - * Compares an array with another and returns an array with - * the values from array1 that don't exist in array2 - * - * @param {Array} array1 - * @param {Array} array2 - * @param {Boolean} useIndex If true, return an array containing just - * the index of array2's elements; - * otherwise return the values - */ - arrayDiff: function(array1, array2, useIndex) { - if (!Array.isArray(array1)) { - throw new Error("array1 is not an array (" + array1 + ")"); - } - if (!Array.isArray(array2)) { - throw new Error("array2 is not an array (" + array2 + ")"); - } - - var val, pos, vals = []; - for (var i = 0; i < array1.length; i++) { - val = array1[i]; - pos = array2.indexOf(val); - if (pos == -1) { - vals.push(useIndex ? pos : val); - } - } - return vals; - }, - - - /** - * Determine whether two arrays are identical - * - * Modified from http://stackoverflow.com/a/14853974 - * - * @return {Boolean} - */ - arrayEquals: function(array1, array2) { - // If either array is a falsy value, return - if (!array1 || !array2) - return false; - - // Compare lengths - can save a lot of time - if (array1.length != array2.length) - return false; - - for (var i = 0, l = array1.length; i < l; i++) { - // Check if we have nested arrays - if (array1[i] instanceof Array && array2[i] instanceof Array) { - // Recurse into the nested arrays - if (!this.arrayEquals(array1[i], array2[i])) { - return false; - } - } else if (array1[i] != array2[i]) { - // Warning - two different object instances will never be equal: {x:20} != {x:20} - return false; - } - } - return true; - }, - - - /** - * Return new array with values shuffled - * - * From http://stackoverflow.com/a/6274398 - * - * @param {Array} arr - * @return {Array} - */ - arrayShuffle: function(array) { - var counter = array.length, - temp, index; - - // While there are elements in the array - while (counter--) { - // Pick a random index - index = (Math.random() * counter) | 0; - - // And swap the last element with it - temp = array[counter]; - array[counter] = array[index]; - array[index] = temp; - } - - return array; - }, - - - /** - * Return new array with duplicate values removed - * - * @param {Array} array - * @return {Array} - */ - arrayUnique: function(arr) { - return [...new Set(arr)]; - }, - - /** - * Generate a random integer between min and max inclusive - * - * @param {Integer} min - * @param {Integer} max - * @return {Integer} - */ - rand: function(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - }, - - /** - * Parse a page range - * - * @param {String} Page range to parse - * @return {Integer[]} Start and end pages - */ - getPageRange: function(pages) { - const pageRangeRegexp = /^\s*([0-9]+) ?[-\u2013] ?([0-9]+)\s*$/ - - var pageNumbers; - var m = pageRangeRegexp.exec(pages); - if (m) { - // A page range - pageNumbers = [m[1], m[2]]; - } else { - // Assume start and end are the same - pageNumbers = [pages, pages]; - } - return pageNumbers; - }, - - /** - * Pads a number or other string with a given string on the left - * - * @param {String} string String to pad - * @param {String} pad String to use as padding - * @length {Integer} length Length of new padded string - * @type String - */ - lpad: function(string, pad, length) { - string = string ? string + '' : ''; - while (string.length < length) { - string = pad + string; - } - return string; - }, - - /** - * Shorten and add an ellipsis to a string if necessary - * - * @param {String} str - * @param {Integer} len - * @param {Boolean} [wordBoundary=false] - * @param {Boolean} [countChars=false] - */ - ellipsize: function(str, len, wordBoundary = false, countChars) { - if (!len) { - throw ("Length not specified in Utilities.ellipsize()"); - } - if (str.length <= len) { - return str; - } - var origLen = str.length; - let radius = Math.min(len, 5); - if (wordBoundary) { - let min = len - radius; - // If next character is a space, include that so we stop at len - if (str.charAt(len).match(/\s/)) { - radius++; - } - // Remove trailing characters and spaces, up to radius - str = str.substr(0, min) + str.substr(min, radius).replace(/\W*\s\S*$/, ""); - } else { - str = str.substr(0, len) - } - return str + '\u2026' + (countChars ? ' (' + origLen + ' chars)' : ''); - }, - - - /** - * Return the proper plural form of a string - * - * For now, this is only used for debug output in English. - * - * @param {Integer} num - * @param {String[]|String} forms - If an array, an array of plural forms (e.g., ['object', 'objects']); - * currently only the two English forms are supported, for 1 and 0/many. If a single string, - * 's' is added automatically for 0/many. - * @return {String} - */ - pluralize: function(num, forms) { - if (typeof forms == 'string') { - forms = [forms, forms + 's']; - } - return num == 1 ? forms[0] : forms[1]; - }, - - - /** - * Port of PHP's number_format() - * - * MIT Licensed - * - * From http://kevin.vanzonneveld.net - * + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) - * + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - * + bugfix by: Michael White (http://getsprink.com) - * + bugfix by: Benjamin Lupton - * + bugfix by: Allan Jensen (http://www.winternet.no) - * + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) - * + bugfix by: Howard Yeend - * * example 1: number_format(1234.5678, 2, '.', ''); - * * returns 1: 1234.57 - */ - numberFormat: function(number, decimals, dec_point, thousands_sep) { - var n = number, - c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals; - var d = dec_point == undefined ? "." : dec_point; - var t = thousands_sep == undefined ? "," : thousands_sep, - s = n < 0 ? "-" : ""; - var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", - j = (j = i.length) > 3 ? j % 3 : 0; - - return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); - }, - - /** - * Cleans a title, converting it to title case and replacing " :" with ":" - * - * @param {String} string - * @param {Boolean} force Forces title case conversion, even if the capitalizeTitles pref is off - * @type String - */ - capitalizeTitle: function(string, force) { - const skipWords = ["but", "or", "yet", "so", "for", "and", "nor", "a", "an", - "the", "at", "by", "from", "in", "into", "of", "on", "to", "with", "up", - "down", "as" - ]; - - // this may only match a single character - const delimiterRegexp = /([ \/\u002D\u00AD\u2010-\u2015\u2212\u2E3A\u2E3B])/; - - string = this.trimInternal(string); - string = string.replace(/ : /g, ": "); - if (Zotero.Prefs && !Zotero.Prefs.get('capitalizeTitles') && !force) return string; - if (!string) return ""; - - // split words - var words = string.split(delimiterRegexp); - var isUpperCase = string.toUpperCase() == string; - - var newString = ""; - var delimiterOffset = words[0].length; - var lastWordIndex = words.length - 1; - var previousWordIndex = -1; - for (var i = 0; i <= lastWordIndex; i++) { - // only do manipulation if not a delimiter character - if (words[i].length != 0 && (words[i].length != 1 || !delimiterRegexp.test(words[i]))) { - var upperCaseVariant = words[i].toUpperCase(); - var lowerCaseVariant = words[i].toLowerCase(); - - // only use if word does not already possess some capitalization - if (isUpperCase || words[i] == lowerCaseVariant) { - if ( - // a skip word - skipWords.indexOf(lowerCaseVariant.replace(/[^a-zA-Z]+/, "")) != -1 - // not first or last word - && - i != 0 && i != lastWordIndex - // does not follow a colon - && - (previousWordIndex == -1 || words[previousWordIndex][words[previousWordIndex].length - 1].search(/[:\?!]/) == -1) - ) { - words[i] = lowerCaseVariant; - } else { - // this is not a skip word or comes after a colon; - // we must capitalize - // handle punctuation in the beginning, including multiple, as in "¿QuĂ© pasa?" - var punct = words[i].match(/^[\'\"¡¿“‘â€Â«\s]+/); - punct = punct ? punct[0].length + 1 : 1; - words[i] = words[i].length ? words[i].substr(0, punct).toUpperCase() + - words[i].substr(punct).toLowerCase() : words[i]; - } - } - - previousWordIndex = i; - } - - newString += words[i]; - } - - return newString; - }, - - capitalize: function(str) { - if (typeof str != 'string') throw new Error("Argument must be a string"); - if (!str) return str; // Empty string - return str[0].toUpperCase() + str.substr(1); - }, - - /** - * Replaces accented characters in a string with ASCII equivalents - * - * @param {String} str - * @param {Boolean} [lowercaseOnly] Limit conversions to lowercase characters - * (for improved performance on lowercase input) - * @return {String} - * - * From http://lehelk.com/2011/05/06/script-to-remove-diacritics/ - */ - removeDiacritics: function(str, lowercaseOnly) { - // Short-circuit on the most basic input - if (/^[a-zA-Z0-9_-]*$/.test(str)) return str; - - var map = this._diacriticsRemovalMap.lowercase; - for (var i = 0, len = map.length; i < len; i++) { - str = str.replace(map[i].letters, map[i].base); - } - - if (!lowercaseOnly) { - var map = this._diacriticsRemovalMap.uppercase; - for (var i = 0, len = map.length; i < len; i++) { - str = str.replace(map[i].letters, map[i].base); - } - } - - return str; - }, - - "_diacriticsRemovalMap": { - uppercase: [{ - 'base': 'A', - 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g - }, - { - 'base': 'AA', - 'letters': /[\uA732]/g - }, - { - 'base': 'AE', - 'letters': /[\u00C6\u01FC\u01E2]/g - }, - { - 'base': 'AO', - 'letters': /[\uA734]/g - }, - { - 'base': 'AU', - 'letters': /[\uA736]/g - }, - { - 'base': 'AV', - 'letters': /[\uA738\uA73A]/g - }, - { - 'base': 'AY', - 'letters': /[\uA73C]/g - }, - { - 'base': 'B', - 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g - }, - { - 'base': 'C', - 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g - }, - { - 'base': 'D', - 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g - }, - { - 'base': 'DZ', - 'letters': /[\u01F1\u01C4]/g - }, - { - 'base': 'Dz', - 'letters': /[\u01F2\u01C5]/g - }, - { - 'base': 'E', - 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g - }, - { - 'base': 'F', - 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g - }, - { - 'base': 'G', - 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g - }, - { - 'base': 'H', - 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g - }, - { - 'base': 'I', - 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g - }, - { - 'base': 'J', - 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g - }, - { - 'base': 'K', - 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g - }, - { - 'base': 'L', - 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g - }, - { - 'base': 'LJ', - 'letters': /[\u01C7]/g - }, - { - 'base': 'Lj', - 'letters': /[\u01C8]/g - }, - { - 'base': 'M', - 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g - }, - { - 'base': 'N', - 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g - }, - { - 'base': 'NJ', - 'letters': /[\u01CA]/g - }, - { - 'base': 'Nj', - 'letters': /[\u01CB]/g - }, - { - 'base': 'O', - 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g - }, - { - 'base': 'OE', - 'letters': /[\u0152]/g - }, - { - 'base': 'OI', - 'letters': /[\u01A2]/g - }, - { - 'base': 'OO', - 'letters': /[\uA74E]/g - }, - { - 'base': 'OU', - 'letters': /[\u0222]/g - }, - { - 'base': 'P', - 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g - }, - { - 'base': 'Q', - 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g - }, - { - 'base': 'R', - 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g - }, - { - 'base': 'S', - 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g - }, - { - 'base': 'T', - 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g - }, - { - 'base': 'TZ', - 'letters': /[\uA728]/g - }, - { - 'base': 'U', - 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g - }, - { - 'base': 'V', - 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g - }, - { - 'base': 'VY', - 'letters': /[\uA760]/g - }, - { - 'base': 'W', - 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g - }, - { - 'base': 'X', - 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g - }, - { - 'base': 'Y', - 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g - }, - { - 'base': 'Z', - 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g - }, - ], - - lowercase: [{ - 'base': 'a', - 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g - }, - { - 'base': 'aa', - 'letters': /[\uA733]/g - }, - { - 'base': 'ae', - 'letters': /[\u00E6\u01FD\u01E3]/g - }, - { - 'base': 'ao', - 'letters': /[\uA735]/g - }, - { - 'base': 'au', - 'letters': /[\uA737]/g - }, - { - 'base': 'av', - 'letters': /[\uA739\uA73B]/g - }, - { - 'base': 'ay', - 'letters': /[\uA73D]/g - }, - { - 'base': 'b', - 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g - }, - { - 'base': 'c', - 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g - }, - { - 'base': 'd', - 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g - }, - { - 'base': 'dz', - 'letters': /[\u01F3\u01C6]/g - }, - { - 'base': 'e', - 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g - }, - { - 'base': 'f', - 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g - }, - { - 'base': 'g', - 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g - }, - { - 'base': 'h', - 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g - }, - { - 'base': 'hv', - 'letters': /[\u0195]/g - }, - { - 'base': 'i', - 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g - }, - { - 'base': 'j', - 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g - }, - { - 'base': 'k', - 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g - }, - { - 'base': 'l', - 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g - }, - { - 'base': 'lj', - 'letters': /[\u01C9]/g - }, - { - 'base': 'm', - 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g - }, - { - 'base': 'n', - 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g - }, - { - 'base': 'nj', - 'letters': /[\u01CC]/g - }, - { - 'base': 'o', - 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g - }, - { - 'base': 'oe', - 'letters': /[\u0153]/g - }, - { - 'base': 'oi', - 'letters': /[\u01A3]/g - }, - { - 'base': 'ou', - 'letters': /[\u0223]/g - }, - { - 'base': 'oo', - 'letters': /[\uA74F]/g - }, - { - 'base': 'p', - 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g - }, - { - 'base': 'q', - 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g - }, - { - 'base': 'r', - 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g - }, - { - 'base': 's', - 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g - }, - { - 'base': 't', - 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g - }, - { - 'base': 'tz', - 'letters': /[\uA729]/g - }, - { - 'base': 'u', - 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g - }, - { - 'base': 'v', - 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g - }, - { - 'base': 'vy', - 'letters': /[\uA761]/g - }, - { - 'base': 'w', - 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g - }, - { - 'base': 'x', - 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g - }, - { - 'base': 'y', - 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g - }, - { - 'base': 'z', - 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g - } - ] - }, - - /** - * Performs a deep copy of a JavaScript object - * @param {Object} obj - * @return {Object} - */ - deepCopy: function(obj) { - var obj2 = (Array.isArray(obj) ? [] : {}); - for (var i in obj) { - if (!obj.hasOwnProperty(i)) continue; - - if (typeof obj[i] === "object" && obj[i] !== null) { - obj2[i] = Utilities.deepCopy(obj[i]); - } else { - obj2[i] = obj[i]; - } - } - return obj2; - }, - - /** - * Find valid creator types for a given item type - * - * @param {String} type Item type - * @return {String[]} Creator types - */ - getCreatorsForType: function(type) { - if (type === "attachment" || type === "note") return []; - var types = Zotero.CreatorTypes.getTypesForItemType(Zotero.ItemTypes.getID(type)); - var cleanTypes = new Array(); - for (var i = 0; i < types.length; i++) { - cleanTypes.push(types[i].name); - } - return cleanTypes; - }, - - /** - * Determine whether a given field is valid for a given item type - * - * @param {String} field Field name - * @param {String} type Item type - * @type Boolean - */ - fieldIsValidForType: function(field, type) { - return Zotero.ItemFields.isValidForType(field, Zotero.ItemTypes.getID(type)); - }, - - /** - * Gets a creator type name, localized to the current locale - * - * @param {String} type Creator type - * @param {String} Localized creator type - * @type Boolean - */ - getLocalizedCreatorType: function(type) { - try { - return Zotero.CreatorTypes.getLocalizedString(type); - } catch (e) { - return false; - } - }, - - /** - * Escapes metacharacters in a literal so that it may be used in a regular expression - */ - quotemeta: function(literal) { - if (typeof literal !== "string") { - throw new Error("Argument " + literal + " must be a string in Utilities.quotemeta()"); - } - const metaRegexp = /[-[\]{}()*+?.\\^$|,#\s]/g; - return literal.replace(metaRegexp, "\\$&"); - }, - - /** - * Evaluate an XPath - * - * @param {element|element[]} elements The element(s) to use as the context for the XPath - * @param {String} xpath The XPath expression - * @param {Object} [namespaces] An object whose keys represent namespace prefixes, and whose - * values represent their URIs - * @return {element[]} DOM elements matching XPath - */ - xpath: function(elements, xpath, namespaces) { - var nsResolver = null; - if (namespaces) { - nsResolver = function(prefix) { - return namespaces[prefix] || null; - }; - } - - if (!("length" in elements)) elements = [elements]; - - var results = []; - for (var i = 0, n = elements.length; i < n; i++) { - // For some reason, if elements is wrapped by an object - // Xray, we won't be able to unwrap the DOMWrapper around - // the element. So waive the object Xray. - var maybeWrappedEl = elements.wrappedJSObject ? elements.wrappedJSObject[i] : elements[i]; - - // Firefox 5 hack, so we will preserve Fx5DOMWrappers - var isWrapped = Zotero.Translate.DOMWrapper && Zotero.Translate.DOMWrapper.isWrapped(maybeWrappedEl); - var element = isWrapped ? Zotero.Translate.DOMWrapper.unwrap(maybeWrappedEl) : maybeWrappedEl; - - // We waived the object Xray above, which will waive the - // DOM Xray, so make sure we have a DOM Xray wrapper. - if (Zotero.isFx) { - element = new XPCNativeWrapper(element); - } - - if (element.ownerDocument) { - var rootDoc = element.ownerDocument; - } else if (element.documentElement) { - var rootDoc = element; - } else if (Zotero.isIE && element.documentElement === null) { - // IE: documentElement may be null if there is a parse error. In this - // case, we don't match anything to mimic what would happen with DOMParser - continue; - } else { - throw new Error("First argument must be either element(s) or document(s) in Utilities.xpath(elements, '" + xpath + "')"); - } - - if (!Zotero.isIE || "evaluate" in rootDoc) { - try { - // This may result in a deprecation warning in the console due to - // https://bugzilla.mozilla.org/show_bug.cgi?id=674437 - var xpathObject = rootDoc.evaluate(xpath, element, nsResolver, 5 /*ORDERED_NODE_ITERATOR_TYPE*/ , null); - } catch (e) { - // rethrow so that we get a stack - throw new Error(e.name + ": " + e.message); - } - - var newEl; - while (newEl = xpathObject.iterateNext()) { - // Firefox 5 hack - results.push(isWrapped ? Zotero.Translate.DOMWrapper.wrapIn(newEl, maybeWrappedEl) : newEl); - } - } else if ("selectNodes" in element) { - // We use JavaScript-XPath in IE for HTML documents, but with an XML - // document, we need to use selectNodes - if (namespaces) { - var ieNamespaces = []; - for (var j in namespaces) { - if (!j) continue; - ieNamespaces.push('xmlns:' + j + '="' + Utilities.htmlSpecialChars(namespaces[j]) + '"'); - } - rootDoc.setProperty("SelectionNamespaces", ieNamespaces.join(" ")); - } - var nodes = element.selectNodes(xpath); - for (var j = 0; j < nodes.length; j++) { - results.push(nodes[j]); - } - } else { - throw new Error("XPath functionality not available"); - } - } - - return results; - }, - - /** - * Generates a string from the content of nodes matching a given XPath - * - * @param {element} node The node representing the document and context - * @param {String} xpath The XPath expression - * @param {Object} [namespaces] An object whose keys represent namespace prefixes, and whose - * values represent their URIs - * @param {String} [delimiter] The string with which to join multiple matching nodes - * @return {String|null} DOM elements matching XPath, or null if no elements exist - */ - xpathText: function(node, xpath, namespaces, delimiter) { - var elements = Utilities.xpath(node, xpath, namespaces); - if (!elements.length) return null; - - var strings = new Array(elements.length); - for (var i = 0, n = elements.length; i < n; i++) { - var el = elements[i]; - if (el.wrappedJSObject) el = el.wrappedJSObject; - if (Zotero.Translate.DOMWrapper) el = Zotero.Translate.DOMWrapper.unwrap(el); - strings[i] = - (el.nodeType === 2 /*ATTRIBUTE_NODE*/ && "value" in el) ? el.value : - "textContent" in el ? el.textContent : - "innerText" in el ? el.innerText : - "text" in el ? el.text : - el.nodeValue; - } - - return strings.join(delimiter !== undefined ? delimiter : ", "); - }, - - - /** - * Generate a random string of length 'len' (defaults to 8) - **/ - randomString: function(len, chars) { - if (!chars) { - chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - } - if (!len) { - len = 8; - } - var randomstring = ''; - for (var i = 0; i < len; i++) { - var rnum = Math.floor(Math.random() * chars.length); - randomstring += chars.substring(rnum, rnum + 1); - } - return randomstring; - }, - - /** - * PHP var_dump equivalent for JS - * - * Adapted from http://binnyva.blogspot.com/2005/10/dump-function-javascript-equivalent-of.html - */ - varDump: function(obj, level, maxLevel, parentObjects, path) { - // Simple dump - var type = typeof obj; - if (type == 'number' || type == 'undefined' || type == 'boolean' || obj === null) { - if (!level) { - // When dumping these directly, make sure to distinguish them from regular - // strings as output by Zotero.debug (i.e. no quotes) - return '===>' + obj + '<=== (' + type + ')'; - } else { - return '' + obj; - } - } else if (type == 'string' || typeof obj.toJSON == 'function') { - return JSON.stringify(obj, false, ' '); - } else if (type == 'symbol') { - return obj.toString(); - } else if (type == 'function') { - var funcStr = ('' + obj).trim(); - if (!level) { - // Dump function contents as well if only dumping function - return funcStr; - } - - // Display [native code] label for native functions, but make it one line - if (/^[^{]+{\s*\[native code\]\s*}$/i.test(funcStr)) { - return funcStr.replace(/\s*(\[native code\])\s*/i, ' $1 '); - } - - // For non-native functions, display an ellipsis - return ('' + obj).replace(/{[\s\S]*}/, '{...}'); - } else if (type != 'object') { - return '<> ' + obj; - } - - // Don't descend into global object cache for data objects - if (Zotero.isClient && typeof obj == 'object' && obj instanceof Zotero.DataObject) { - maxLevel = 1; - } - - // More complex dump with indentation for objects - if (level === undefined) { - level = 0; - } - - if (maxLevel === undefined) { - maxLevel = 5; - } - - var objType = Object.prototype.toString.call(obj); - - if (level > maxLevel) { - return objType + " <>"; - } - - // The padding given at the beginning of the line. - var level_padding = ""; - for (var j = 0; j < level + 1; j++) { - level_padding += " "; - } - - //Special handling for Error or Exception - var isException = Zotero.isFx && !Zotero.isBookmarklet && obj instanceof Components.interfaces.nsIException; - var isError = obj instanceof Error; - if (!isException && !isError && obj.message !== undefined && obj.stack !== undefined) { - isError = true; - } - - if (isError || isException) { - var header = ''; - if (isError) { - header = (obj.constructor && obj.constructor.name) ? obj.constructor.name : 'Error'; - } else { - header = (obj.name ? obj.name + ' ' : '') + 'Exception'; - } - - let msg = (obj.message ? ('' + obj.message).replace(/^/gm, level_padding).trim() : ''); - if (obj.stack) { - let stack = obj.stack.trim().replace(/^(?=.)/gm, level_padding); - if (Utilities.Internal) { - stack = Utilities.Internal.filterStack(stack); - } - - msg += '\n\n'; - - // At least with Zotero.HTTP.UnexpectedStatusException, the stack contains "Error:" - // and the message in addition to the trace. I'm not sure what's causing that - // (Bluebird?), but fix it here. - if (stack.startsWith('Error:')) { - msg += stack.replace('Error: ' + obj.message + '\n', ''); - } else { - msg += stack; - } - } - - return header + ': ' + msg; - } - - // Only dump single level for nsIDOMNode objects (including document) - if (Zotero.isFx && !Zotero.isBookmarklet && - (obj instanceof Components.interfaces.nsIDOMNode || - obj instanceof Components.interfaces.nsIDOMWindow) - ) { - level = maxLevel; - } - - // Recursion checking - if (!parentObjects) { - parentObjects = [obj]; - path = ['ROOT']; - } - - var isArray = objType == '[object Array]' - if (isArray) { - var dumpedText = '['; - } else if (objType == '[object Object]') { - var dumpedText = '{'; - } else { - var dumpedText = objType + ' {'; - } - for (var prop in obj) { - dumpedText += '\n' + level_padding + JSON.stringify(prop) + ": "; - - try { - var value = obj[prop]; - } catch (e) { - dumpedText += "<>"; - continue; - } - - // Check for recursion - if (typeof(value) == 'object') { - var i = parentObjects.indexOf(value); - if (i != -1) { - var parentName = path.slice(0, i + 1).join('->'); - dumpedText += "<>"; - continue; - } - } - - try { - dumpedText += Utilities.varDump(value, level + 1, maxLevel, parentObjects.concat([value]), path.concat([prop])); - } catch (e) { - dumpedText += "<>"; - } - } - - var lastChar = dumpedText.charAt(dumpedText.length - 1); - if (lastChar != '[' && lastChar != '{') { - dumpedText += '\n' + level_padding.substr(4); - } - dumpedText += isArray ? ']' : '}'; - - return dumpedText; - }, - - /** - * Adds a string to a given array at a given offset, converted to UTF-8 - * @param {String} string The string to convert to UTF-8 - * @param {Array|Uint8Array} array The array to which to add the string - * @param {Integer} [offset] Offset at which to add the string - */ - stringToUTF8Array: function(string, array, offset) { - if (!offset) offset = 0; - var n = string.length; - for (var i = 0; i < n; i++) { - var val = string.charCodeAt(i); - if (val >= 128) { - if (val >= 2048) { - array[offset] = (val >>> 12) | 224; - array[offset + 1] = ((val >>> 6) & 63) | 128; - array[offset + 2] = (val & 63) | 128; - offset += 3; - } else { - array[offset] = ((val >>> 6) | 192); - array[offset + 1] = (val & 63) | 128; - offset += 2; - } - } else { - array[offset++] = val; - } - } - }, - - /** - * Gets the byte length of the UTF-8 representation of a given string - * @param {String} string - * @return {Integer} - */ - getStringByteLength: function(string) { - var length = 0, - n = string.length; - for (var i = 0; i < n; i++) { - var val = string.charCodeAt(i); - if (val >= 128) { - if (val >= 2048) { - length += 3; - } else { - length += 2; - } - } else { - length += 1; - } - } - return length; - }, - - semverCompare(a, b) { - a = a.split('.').map(version => isNaN(parseInt(version)) ? version : parseInt(version)); - b = b.split('.').map(version => isNaN(parseInt(version)) ? version : parseInt(version)); - for (let i = 0; i < a.length && i < b.length; i++) { - if (a[i] < b[i]) return -1; - else if (a[i] > b[i]) return 1; - } - return a.length - b.length; // E.g. 5.0.0 < 5.0.0.1 - }, - - allowedKeyChars: "23456789ABCDEFGHIJKLMNPQRSTUVWXYZ", - - /** - * Generates a valid object key for the server API - */ - generateObjectKey: function generateObjectKey() { - return Zotero.Utilities.randomString(8, Zotero.Utilities.allowedKeyChars); - }, - - /** - * Check if an object key is in a valid format - */ - isValidObjectKey: function(key) { - if (!Zotero.Utilities.objectKeyRegExp) { - Zotero.Utilities.objectKeyRegExp = new RegExp('^[' + Zotero.Utilities.allowedKeyChars + ']{8}$'); - } - return Zotero.Utilities.objectKeyRegExp.test(key); - }, - - itemTypeExists: function(type) { - Zotero.debug(`Zotero.Utilities.itemTypeExists() is deprecated -- use Zotero.Utilities.Item.itemTypeExists() instead`); - return Zotero.Utilities.Item.itemTypeExists(type); - }, - - itemToCSLJSON: function(zoteroItem) { - Zotero.debug(`Zotero.Utilities.itemToCSLJSON() is deprecated -- use Zotero.Utilities.Item.itemToCSLJSON() instead`); - return Zotero.Utilities.Item.itemToCSLJSON(zoteroItem); - }, - itemFromCSLJSON: function(item, cslItem) { - Zotero.debug(`Zotero.Utilities.itemFromCSLJSON() is deprecated -- use Zotero.Utilities.Item.itemFromCSLJSON() instead`); - return Zotero.Utilities.Item.itemFromCSLJSON(item, cslItem); - }, - - assignProps: movedToUtilitiesInternal("assignProps"), - parseURL: movedToUtilitiesInternal("parseURL"), - resolveIntermediateURL: movedToUtilitiesInternal("resolveIntermediateURL"), - determineAttachmentIcon: movedToUtilitiesInternal('determineAttachmentIcon'), - - // /** - // * Provides unicode support and other additional features for regular expressions - // * See https://github.com/slevithan/xregexp for usage - // */ - XRegExp: typeof XRegExp !== "undefined" ? XRegExp : null - } - - if (!Utilities.XRegExp) { - if (typeof module != 'undefined') { - Utilities.XRegExp = require('./xregexp-all'); - } - } - - if (typeof module != 'undefined') { - module.exports = Utilities; - } else if (typeof Zotero != 'undefined') { - Zotero.Utilities = Utilities; - } - -})(); \ No newline at end of file diff --git a/external-scripts/utilities_item.js b/external-scripts/utilities_item.js deleted file mode 100644 index 53b8fccf..00000000 --- a/external-scripts/utilities_item.js +++ /dev/null @@ -1,959 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2021 Corporation for Digital Scholarship - Vienna, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - - // Various Utility functions related to Zotero, API, Translation Item formats - // and their conversion or field access. - - var Utilities_Item = { - PARTICLE_GIVEN_REGEXP: /^([^ ]+(?:\u02bb |\u2019 | |\' ) *)(.+)$/, - PARTICLE_FAMILY_REGEXP: /^([^ ]+(?:\-|\u02bb|\u2019| |\') *)(.+)$/, - - /** - * Tests if an item type exists - * - * @param {String} type Item type - * @type Boolean - */ - itemTypeExists: function(type) { - return !!Zotero.ItemTypes.getID(type); - }, - - /** - * Converts an item from toArray() format to citeproc-js JSON - * @param {Zotero.Item} zoteroItem - * @return {Object|Promise} A CSL item, or a promise for a CSL item if a Zotero.Item - * is passed - */ - itemToCSLJSON: function(zoteroItem) { - // If a Zotero.Item was passed, convert it to the proper format (skipping child items) and - // call this function again with that object - // - // (Zotero.Item won't be defined in translation-server) - if (typeof Zotero.Item !== 'undefined' && zoteroItem instanceof Zotero.Item) { - return Utilities_Item.itemToCSLJSON( - Zotero.Utilities.Internal.itemToExportFormat(zoteroItem, false, true) - ); - } - - var cslType = Zotero.Schema.CSL_TYPE_MAPPINGS[zoteroItem.itemType]; - if (!cslType) { - throw new Error('Unexpected Zotero Item type "' + zoteroItem.itemType + '"'); - } - - var itemTypeID = Zotero.ItemTypes.getID(zoteroItem.itemType); - - var cslItem = { - 'id': zoteroItem.uri, - 'type': cslType - }; - - // get all text variables (there must be a better way) - for (var variable in Zotero.Schema.CSL_TEXT_MAPPINGS) { - if (variable === "shortTitle") continue; // read both title-short and shortTitle, but write only title-short - var fields = Zotero.Schema.CSL_TEXT_MAPPINGS[variable]; - for (var i = 0, n = fields.length; i < n; i++) { - var field = fields[i], - value = null; - - if (field in zoteroItem) { - value = zoteroItem[field]; - } else { - if (field == 'versionNumber') field = 'version'; // Until https://github.com/zotero/zotero/issues/670 - var fieldID = Zotero.ItemFields.getID(field), - typeFieldID; - if (fieldID && - (typeFieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(itemTypeID, fieldID)) - ) { - value = zoteroItem[Zotero.ItemFields.getName(typeFieldID)]; - } - } - - if (!value) continue; - - if (typeof value == 'string') { - if (field == 'ISBN') { - // Only use the first ISBN in CSL JSON - var isbn = value.match(/^(?:97[89]-?)?(?:\d-?){9}[\dx](?!-)\b/i); - if (isbn) value = isbn[0]; - } else if (field == 'extra') { - value = Zotero.Utilities.Item.extraToCSL(value); - } - - // Strip enclosing quotes - if (value.charAt(0) == '"' && value.indexOf('"', 1) == value.length - 1) { - value = value.substring(1, value.length - 1); - } - cslItem[variable] = value; - break; - } - } - } - - // separate name variables - if (zoteroItem.type != "attachment" && zoteroItem.type != "note") { - var author = Zotero.CreatorTypes.getName(Zotero.CreatorTypes.getPrimaryIDForType(itemTypeID)); - var creators = zoteroItem.creators; - for (var i = 0; creators && i < creators.length; i++) { - var creator = creators[i]; - var creatorType = creator.creatorType; - if (creatorType == author) { - creatorType = "author"; - } - - creatorType = Zotero.Schema.CSL_NAME_MAPPINGS[creatorType]; - if (!creatorType) continue; - - var nameObj; - if (creator.lastName || creator.firstName) { - nameObj = { - family: creator.lastName || '', - given: creator.firstName || '' - }; - - // Parse name particles - // Replicate citeproc-js logic for what should be parsed so we don't - // break current behavior. - if (nameObj.family && nameObj.given) { - // Don't parse if last name is quoted - if (nameObj.family.length > 1 && - nameObj.family.charAt(0) == '"' && - nameObj.family.charAt(nameObj.family.length - 1) == '"' - ) { - nameObj.family = nameObj.family.substr(1, nameObj.family.length - 2); - } else { - Zotero.Utilities.Item.parseParticles(nameObj); - } - } - } else if (creator.name) { - nameObj = { - 'literal': creator.name - }; - } - - if (cslItem[creatorType]) { - cslItem[creatorType].push(nameObj); - } else { - cslItem[creatorType] = [nameObj]; - } - } - } - - // get date variables - for (var variable in Zotero.Schema.CSL_DATE_MAPPINGS) { - var date = zoteroItem[Zotero.Schema.CSL_DATE_MAPPINGS[variable]]; - if (!date) { - var typeSpecificFieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(itemTypeID, Zotero.Schema.CSL_DATE_MAPPINGS[variable]); - if (typeSpecificFieldID) { - date = zoteroItem[Zotero.ItemFields.getName(typeSpecificFieldID)]; - } - } - - if (date) { - // Convert UTC timestamp to local timestamp for access date - if (Zotero.Schema.CSL_DATE_MAPPINGS[variable] == 'accessDate' && !Zotero.Date.isSQLDate(date)) { - // Accept ISO date - if (Zotero.Date.isISODate(date)) { - let d = Zotero.Date.isoToDate(date); - date = Zotero.Date.dateToSQL(d, true); - } - let localDate = Zotero.Date.sqlToDate(date, true); - date = Zotero.Date.dateToSQL(localDate); - } - var dateObj = Zotero.Date.strToDate(date); - // otherwise, use date-parts - var dateParts = []; - if (dateObj.year) { - // add year, month, and day, if they exist - dateParts.push(dateObj.year); - if (dateObj.month !== undefined) { - // strToDate() returns a JS-style 0-indexed month, so we add 1 to it - dateParts.push(dateObj.month + 1); - if (dateObj.day) { - dateParts.push(dateObj.day); - } - } - cslItem[variable] = { - "date-parts": [dateParts] - }; - - // if no month, use season as month - if (dateObj.part && dateObj.month === undefined) { - cslItem[variable].season = dateObj.part; - } - } else { - // if no year, pass date literally - cslItem[variable] = { - "literal": date - }; - } - } - } - - // Special mapping for note title - if (zoteroItem.itemType == 'note' && zoteroItem.note) { - cslItem.title = Zotero.Utilities.Item.noteToTitle(zoteroItem.note); - } - - //this._cache[zoteroItem.id] = cslItem; - return cslItem; - }, - - /** - * Converts an item in CSL JSON format to a Zotero item - * @param {Zotero.Item} item - * @param {Object} cslItem - */ - itemFromCSLJSON: function(item, cslItem) { - var isZoteroItem = !!item.setType, - zoteroType; - - if (!cslItem.type) { - Zotero.debug(cslItem, 1); - throw new Error("No 'type' provided in CSL-JSON"); - } - - // Some special cases to help us map item types correctly - // This ensures that we don't lose data on import. The fields - // we check are incompatible with the alternative item types - if (cslItem.type == 'bill' && (cslItem.publisher || cslItem['number-of-volumes'])) { - zoteroType = 'hearing'; - } else if (cslItem.type == 'broadcast' && - (cslItem['archive'] || - cslItem['archive_location'] || - cslItem['container-title'] || - cslItem['event-place'] || - cslItem['publisher'] || - cslItem['publisher-place'] || - cslItem['source'])) { - zoteroType = 'tvBroadcast'; - } else if (cslItem.type == 'book' && cslItem.version) { - zoteroType = 'computerProgram'; - } else if (cslItem.type == 'song' && cslItem.number) { - zoteroType = 'podcast'; - } else if (cslItem.type == 'motion_picture' && - (cslItem['collection-title'] || cslItem['publisher-place'] || - cslItem['event-place'] || cslItem.volume || - cslItem['number-of-volumes'] || cslItem.ISBN)) { - zoteroType = 'videoRecording'; - } else if (Zotero.Schema.CSL_TYPE_MAPPINGS_REVERSE[cslItem.type]) { - zoteroType = Zotero.Schema.CSL_TYPE_MAPPINGS_REVERSE[cslItem.type][0]; - } else { - Zotero.debug(`Unknown CSL type '${cslItem.type}' -- using 'document'`, 2); - zoteroType = "document" - } - - var itemTypeID = Zotero.ItemTypes.getID(zoteroType); - if (isZoteroItem) { - item.setType(itemTypeID); - } else { - item.itemID = cslItem.id; - item.itemType = zoteroType; - } - - // map text fields - for (let variable in Zotero.Schema.CSL_TEXT_MAPPINGS) { - if (variable in cslItem) { - let textMappings = Zotero.Schema.CSL_TEXT_MAPPINGS[variable]; - for (var i = 0; i < textMappings.length; i++) { - var field = textMappings[i]; - var fieldID = Zotero.ItemFields.getID(field); - - if (Zotero.ItemFields.isBaseField(fieldID)) { - var newFieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(itemTypeID, fieldID); - if (newFieldID) fieldID = newFieldID; - } - - if (Zotero.ItemFields.isValidForType(fieldID, itemTypeID)) { - // TODO: Convert restrictive Extra cheater syntax ('original-date: 2018') - // to nicer format we allow ('Original Date: 2018'), unless we've added - // those fields before we get to that - if (isZoteroItem) { - item.setField(fieldID, cslItem[variable]); - } else { - item[field] = cslItem[variable]; - } - - break; - } - } - } - } - - // separate name variables - for (let field in Zotero.Schema.CSL_NAME_MAPPINGS) { - if (Zotero.Schema.CSL_NAME_MAPPINGS[field] in cslItem) { - var creatorTypeID = Zotero.CreatorTypes.getID(field); - if (!Zotero.CreatorTypes.isValidForItemType(creatorTypeID, itemTypeID)) { - creatorTypeID = Zotero.CreatorTypes.getPrimaryIDForType(itemTypeID); - } - - let nameMappings = cslItem[Zotero.Schema.CSL_NAME_MAPPINGS[field]]; - for (var i in nameMappings) { - var cslAuthor = nameMappings[i]; - let creator = {}; - if (cslAuthor.family || cslAuthor.given) { - creator.lastName = cslAuthor.family || ''; - creator.firstName = cslAuthor.given || ''; - } else if (cslAuthor.literal) { - creator.lastName = cslAuthor.literal; - creator.fieldMode = 1; - } else { - continue; - } - creator.creatorTypeID = creatorTypeID; - - if (isZoteroItem) { - item.setCreator(item.getCreators().length, creator); - } else { - creator.creatorType = Zotero.CreatorTypes.getName(creatorTypeID); - if (Zotero.isFx && !Zotero.isBookmarklet) { - creator = Components.utils.cloneInto(creator, item); - } - item.creators.push(creator); - } - } - } - } - - // get date variables - for (let variable in Zotero.Schema.CSL_DATE_MAPPINGS) { - if (variable in cslItem) { - let field = Zotero.Schema.CSL_DATE_MAPPINGS[variable]; - let fieldID = Zotero.ItemFields.getID(field); - let cslDate = cslItem[variable]; - if (Zotero.ItemFields.isBaseField(fieldID)) { - var newFieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(itemTypeID, fieldID); - if (newFieldID) fieldID = newFieldID; - } - - if (Zotero.ItemFields.isValidForType(fieldID, itemTypeID)) { - var date = ""; - if (cslDate.literal || cslDate.raw) { - date = cslDate.literal || cslDate.raw; - if (variable === "accessed") { - date = Zotero.Date.strToISO(date); - } - } else { - var newDate = Zotero.Utilities.deepCopy(cslDate); - if (cslDate["date-parts"] && typeof cslDate["date-parts"] === "object" && - cslDate["date-parts"] !== null && - typeof cslDate["date-parts"][0] === "object" && - cslDate["date-parts"][0] !== null) { - if (cslDate["date-parts"][0][0]) newDate.year = cslDate["date-parts"][0][0]; - if (cslDate["date-parts"][0][1]) newDate.month = cslDate["date-parts"][0][1]; - if (cslDate["date-parts"][0][2]) newDate.day = cslDate["date-parts"][0][2]; - } - - if (newDate.year) { - if (variable === "accessed") { - // Need to convert to SQL - var date = Zotero.Utilities.lpad(newDate.year, "0", 4); - if (newDate.month) { - date += "-" + Zotero.Utilities.lpad(newDate.month, "0", 2); - if (newDate.day) { - date += "-" + Zotero.Utilities.lpad(newDate.day, "0", 2); - } - } - } else { - if (newDate.month) newDate.month--; - date = Zotero.Date.formatDate(newDate); - if (newDate.season) { - date = newDate.season + " " + date; - } - } - } - } - - if (isZoteroItem) { - item.setField(fieldID, date); - } else { - item[field] = date; - } - } - } - } - }, - - /** - * Given API JSON for an item, return the best single first creator, regardless of creator order - * - * Note that this is just a single creator, not the firstCreator field return from the - * Zotero.Item::firstCreator property or Zotero.Items.getFirstCreatorFromData() - * - * @return {Object|false} - Creator in API JSON format, or false - */ - getFirstCreatorFromItemJSON: function(json) { - var primaryCreatorType = Zotero.CreatorTypes.getName( - Zotero.CreatorTypes.getPrimaryIDForType( - Zotero.ItemTypes.getID(json.itemType) - ) - ); - let firstCreator = json.creators.find(creator => { - return creator.creatorType == primaryCreatorType || creator.creatorType == 'author'; - }); - if (!firstCreator) { - firstCreator = json.creators.find(creator => creator.creatorType == 'editor'); - } - if (!firstCreator) { - return false; - } - return firstCreator; - }, - - /** - * Taken from citeproc-js. Extracts particles (e.g. de, von, etc.) from family name and given name. - * - * Copyright (c) 2009-2019 Frank Bennett - * This program is free software: you can redistribute it and/or - * modify it under EITHER - * - * * the terms of the Common Public Attribution License (CPAL) as - * published by the Open Source Initiative, either version 1 of - * the CPAL, or (at your option) any later version; OR - * - * * the terms of the GNU Affero General Public License (AGPL) - * as published by the Free Software Foundation, either version - * 3 of the AGPL, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Affero General Public License for more details. - * - * You should have received copies of the Common Public Attribution - * License and of the GNU Affero General Public License along with - * this program. If not, see or - * respectively. - */ - parseParticles: function(nameObj) { - function splitParticles(nameValue, firstNameFlag, caseOverride) { - // Parse particles out from name fields. - // * nameValue (string) is the field content to be parsed. - // * firstNameFlag (boolean) parse trailing particles - // (default is to parse leading particles) - // * caseOverride (boolean) include all but one word in particle set - // (default is to include only words with lowercase first char) - // [caseOverride is not used in this application] - // Returns an array with: - // * (boolean) flag indicating whether a particle was found - // * (string) the name after removal of particles - // * (array) the list of particles found - var origNameValue = nameValue; - nameValue = caseOverride ? nameValue.toLowerCase() : nameValue; - var particleList = []; - var rex; - var hasParticle; - if (firstNameFlag) { - nameValue = nameValue.split("").reverse().join(""); - rex = Utilities_Item.PARTICLE_GIVEN_REGEXP; - } else { - rex = Utilities_Item.PARTICLE_FAMILY_REGEXP; - } - var m = nameValue.match(rex); - while (m) { - var m1 = firstNameFlag ? m[1].split("").reverse().join("") : m[1]; - var firstChar = m ? m1 : false; - var firstChar = firstChar ? m1.replace(/^[-\'\u02bb\u2019\s]*(.).*$/, "$1") : false; - hasParticle = firstChar ? firstChar.toUpperCase() !== firstChar : false; - if (!hasParticle) { - break; - } - if (firstNameFlag) { - particleList.push(origNameValue.slice(m1.length * -1)); - origNameValue = origNameValue.slice(0, m1.length * -1); - } else { - particleList.push(origNameValue.slice(0, m1.length)); - origNameValue = origNameValue.slice(m1.length); - } - //particleList.push(m1); - nameValue = m[2]; - m = nameValue.match(rex); - } - if (firstNameFlag) { - nameValue = nameValue.split("").reverse().join(""); - particleList.reverse(); - for (var i = 1, ilen = particleList.length; i < ilen; i++) { - if (particleList[i].slice(0, 1) == " ") { - particleList[i - 1] += " "; - } - } - for (var i = 0, ilen = particleList.length; i < ilen; i++) { - if (particleList[i].slice(0, 1) == " ") { - particleList[i] = particleList[i].slice(1); - } - } - nameValue = origNameValue.slice(0, nameValue.length); - } else { - nameValue = origNameValue.slice(nameValue.length * -1); - } - return [hasParticle, nameValue, particleList]; - } - - function trimLast(str) { - var lastChar = str.slice(-1); - str = str.trim(); - if (lastChar === " " && ["\'", "\u2019"].indexOf(str.slice(-1)) > -1) { - str += " "; - } - return str; - } - - function parseSuffix(nameObj) { - if (!nameObj.suffix && nameObj.given) { - var m = nameObj.given.match(/(\s*,!*\s*)/); - if (m) { - var idx = nameObj.given.indexOf(m[1]); - var possible_suffix = nameObj.given.slice(idx + m[1].length); - var possible_comma = nameObj.given.slice(idx, idx + m[1].length).replace(/\s*/g, ""); - if (possible_suffix.replace(/\./g, "") === 'et al' && !nameObj["dropping-particle"]) { - // This hack covers the case where "et al." is explicitly used in the - // authorship information of the work. - nameObj["dropping-particle"] = possible_suffix; - nameObj["comma-dropping-particle"] = ","; - } else { - if (possible_comma.length === 2) { - nameObj["comma-suffix"] = true; - } - nameObj.suffix = possible_suffix; - } - nameObj.given = nameObj.given.slice(0, idx); - } - } - } - // Extract and set non-dropping particle(s) from family name field - var res = splitParticles(nameObj.family); - var lastNameValue = res[1]; - var lastParticleList = res[2]; - nameObj.family = lastNameValue; - var nonDroppingParticle = trimLast(lastParticleList.join("")); - if (nonDroppingParticle) { - nameObj['non-dropping-particle'] = nonDroppingParticle; - } - // Split off suffix first of all - parseSuffix(nameObj); - // Extract and set dropping particle(s) from given name field - var res = splitParticles(nameObj.given, true); - var firstNameValue = res[1]; - var firstParticleList = res[2]; - nameObj.given = firstNameValue; - var droppingParticle = firstParticleList.join("").trim(); - if (droppingParticle) { - nameObj['dropping-particle'] = droppingParticle; - } - }, - - /** - * Return first line (or first MAX_LENGTH characters) of note content - **/ - noteToTitle: function(text) { - var MAX_TITLE_LENGTH = 120; - var origText = text; - text = text.trim(); - text = text.replace(//g, ' '); - text = Zotero.Utilities.unescapeHTML(text); - - // If first line is just an opening HTML tag, remove it - // - // Example: - // - //
    - //

    Foo

    - //
    - if (/^<[^>\n]+[^\/]>\n/.test(origText)) { - text = text.trim(); - } - - var t = text.substring(0, MAX_TITLE_LENGTH); - var ln = t.indexOf("\n"); - if (ln > -1 && ln < MAX_TITLE_LENGTH) { - t = t.substring(0, ln); - } - return t; - }, - - /** - * Preprocess Zotero item extra field for passing to citeproc-js for extra CSL properties - * @param extra - * @returns {String|string|void|*} - */ - extraToCSL: function(extra) { - return extra.replace(/^([A-Za-z \-]+)(:\s*.+)/gm, function(_, field, value) { - var originalField = field; - field = field.toLowerCase().replace(/ /g, '-'); - // Fields from https://aurimasv.github.io/z2csl/typeMap.xml - switch (field) { - // Standard fields - case 'abstract': - case 'accessed': - case 'annote': - case 'archive': - case 'archive-place': - case 'author': - case 'authority': - case 'call-number': - case 'chapter-number': - case 'citation-label': - case 'citation-number': - case 'collection-editor': - case 'collection-number': - case 'collection-title': - case 'composer': - case 'container': - case 'container-author': - case 'container-title': - case 'container-title-short': - case 'dimensions': - case 'director': - case 'edition': - case 'editor': - case 'editorial-director': - case 'event': - case 'event-date': - case 'event-place': - case 'first-reference-note-number': - case 'genre': - case 'illustrator': - case 'interviewer': - case 'issue': - case 'issued': - case 'jurisdiction': - case 'keyword': - case 'language': - case 'locator': - case 'medium': - case 'note': - case 'number': - case 'number-of-pages': - case 'number-of-volumes': - case 'original-author': - case 'original-date': - case 'original-publisher': - case 'original-publisher-place': - case 'original-title': - case 'page': - case 'page-first': - case 'publisher': - case 'publisher-place': - case 'recipient': - case 'references': - case 'reviewed-author': - case 'reviewed-title': - case 'scale': - case 'section': - case 'source': - case 'status': - case 'submitted': - case 'title': - case 'title-short': - case 'translator': - case 'type': - case 'version': - case 'volume': - case 'year-suffix': - break; - - // Uppercase fields - case 'doi': - case 'isbn': - case 'issn': - case 'pmcid': - case 'pmid': - case 'url': - field = field.toUpperCase(); - break; - - // Weirdo - case 'archive-location': - field = 'archive_location'; - break; - - default: - // See if this is a Zotero field written out (e.g., "Publication Title"), and if so - // convert to its associated CSL field - var zoteroField = originalField.replace(/ ([A-Z])/, '$1'); - // If second character is lowercase (so not an acronym), lowercase first letter too - if (zoteroField[1] && zoteroField[1] == zoteroField[1].toLowerCase()) { - zoteroField = zoteroField[0].toLowerCase() + zoteroField.substr(1); - } - if (Zotero.Schema.CSL_FIELD_MAPPINGS_REVERSE[zoteroField]) { - field = Zotero.Schema.CSL_FIELD_MAPPINGS_REVERSE[zoteroField]; - } - // Don't change other lines - else { - field = originalField; - } - } - return field + value; - }); - }, - - /** - * Converts an item from toArray() format to an array of items in - * the content=json format used by the server - * - * (for origin see: https://github.com/zotero/zotero/blob/56f9f043/chrome/content/zotero/xpcom/utilities.js#L1526-L1526) - * - */ - itemToAPIJSON: function(item) { - var newItem = { - key: Zotero.Utilities.generateObjectKey(), - version: 0 - }, - newItems = [newItem]; - - var typeID = Zotero.ItemTypes.getID(item.itemType); - if (!typeID) { - Zotero.debug(`itemToAPIJSON: Invalid itemType ${item.itemType}; using webpage`); - item.itemType = "webpage"; - typeID = Zotero.ItemTypes.getID(item.itemType); - } - - var accessDateFieldID = Zotero.ItemFields.getID('accessDate'); - - var fieldID, itemFieldID; - for (var field in item) { - if (field === "complete" || field === "itemID" || field === "attachments" || - field === "seeAlso") continue; - - var val = item[field]; - - if (field === "itemType") { - newItem[field] = val; - } else if (field === "creators") { - // normalize creators - var n = val.length; - var newCreators = newItem.creators = []; - for (var j = 0; j < n; j++) { - var creator = val[j]; - - if (!creator.firstName && !creator.lastName) { - Zotero.debug("itemToAPIJSON: Silently dropping empty creator"); - continue; - } - - // Single-field mode - if (!creator.firstName || (creator.fieldMode && creator.fieldMode == 1)) { - var newCreator = { - name: creator.lastName - }; - } - // Two-field mode - else { - var newCreator = { - firstName: creator.firstName, - lastName: creator.lastName - }; - } - - // ensure creatorType is present and valid - if (creator.creatorType) { - if (Zotero.CreatorTypes.getID(creator.creatorType)) { - newCreator.creatorType = creator.creatorType; - } else { - Zotero.debug(`itemToAPIJSON: Invalid creator type ${creator.creatorType}; ` + - "falling back to author"); - } - } - if (!newCreator.creatorType) newCreator.creatorType = "author"; - - newCreators.push(newCreator); - } - } else if (field === "tags") { - // normalize tags - var n = val.length; - var newTags = newItem.tags = []; - for (var j = 0; j < n; j++) { - var tag = val[j]; - if (typeof tag === "object") { - if (tag.tag) { - tag = tag.tag; - } else if (tag.name) { - tag = tag.name; - } else { - Zotero.debug("itemToAPIJSON: Discarded invalid tag"); - continue; - } - } else if (tag === "") { - continue; - } - newTags.push({ - "tag": tag.toString(), - "type": 1 - }); - } - } else if (field === "notes") { - // normalize notes - var n = val.length; - for (var j = 0; j < n; j++) { - var note = val[j]; - if (typeof note === "object") { - if (!note.note) { - Zotero.debug("itemToAPIJSON: Discarded invalid note"); - continue; - } - note = note.note; - } - newItems.push({ - itemType: "note", - parentItem: newItem.key, - note: note.toString() - }); - } - } else if ((fieldID = Zotero.ItemFields.getID(field))) { - // if content is not a string, either stringify it or delete it - if (typeof val !== "string") { - if (val || val === 0) { - val = val.toString(); - } else { - continue; - } - } - - // map from base field if possible - if ((itemFieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(typeID, fieldID))) { - let fieldName = Zotero.ItemFields.getName(itemFieldID); - // Only map if item field does not exist - if (fieldName !== field && !newItem[fieldName]) newItem[fieldName] = val; - continue; // already know this is valid - } - - // if field is valid for this type, set field - if (Zotero.ItemFields.isValidForType(fieldID, typeID)) { - // Convert access date placeholder to current time - if (fieldID == accessDateFieldID && val == "CURRENT_TIMESTAMP") { - val = Zotero.Date.dateToISO(new Date()); - } - - newItem[field] = val; - } else { - Zotero.debug(`itemToAPIJSON: Discarded field ${field}: ` + - `field not valid for type ${item.itemType}`, 3); - } - } else { - Zotero.debug(`itemToAPIJSON: Discarded unknown field ${field}`, 3); - } - } - - return newItems; - }, - - /** - * Converts a current Zotero Item to a format that export translators written for Zotero versions pre-4.0.26 - * See https://github.com/zotero/translation-server/issues/73 - * @param {Object} item - * @returns {Object} - */ - itemToLegacyExportFormat: function(item) { - item.uniqueFields = {}; - - // Map base fields - for (let field in item) { - try { - var baseField = Zotero.ItemFields.getName( - Zotero.ItemFields.getBaseIDFromTypeAndField(item.itemType, field) - ); - } catch (e) { - continue; - } - - if (!baseField || baseField == field) { - item.uniqueFields[field] = item[field]; - } else { - item[baseField] = item[field]; - item.uniqueFields[baseField] = item[field]; - } - } - - // Meaningless local item ID, but some older export translators depend on it - item.itemID = Zotero.Utilities.randomString(6); - item.key = Zotero.Utilities.randomString(6); // CSV translator exports this - - // "version" is expected to be a field for "computerProgram", which is now - // called "versionNumber" - delete item.version; - if (item.versionNumber) { - item.version = item.uniqueFields.version = item.versionNumber; - delete item.versionNumber; - } - - // Creators - if (item.creators) { - for (let i = 0; i < item.creators.length; i++) { - let creator = item.creators[i]; - - if (creator.name) { - creator.fieldMode = 1; - creator.lastName = creator.name; - delete creator.name; - } - - // Old format used to supply creatorID (the database ID), but no - // translator ever used it - } - } else { - item.creators = []; - } - - item.sourceItemKey = item.parentItem; - - // Tags - if (item.tags) { - for (let i = 0; i < item.tags.length; i++) { - if (!item.tags[i].type) { - item.tags[i].type = 0; - } - // No translator ever used "primary", "fields", or "linkedItems" objects - } - } else { - item.tags = []; - } - - // seeAlso was always present, but it was always an empty array. - // Zotero RDF translator pretended to use it - item.seeAlso = []; - - if (item.contentType) { - item.mimeType = item.uniqueFields.mimeType = item.contentType; - } - - if (item.note) { - item.uniqueFields.note = item.note; - } - - return item; - } - } - - if (typeof module != 'undefined') { - module.exports = Utilities_Item; - } else if (typeof Zotero != 'undefined' && typeof Zotero.Utilities != 'undefined') { - Zotero.Utilities.Item = Utilities_Item; - } else { - console.log('Could not find a way to expose utilities_item.js. Check your load order.') - } - -})(); \ No newline at end of file diff --git a/external-scripts/utilities_translate.js b/external-scripts/utilities_translate.js deleted file mode 100644 index 4c4630c1..00000000 --- a/external-scripts/utilities_translate.js +++ /dev/null @@ -1,483 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - - Utilities based in part on code taken from Piggy Bank 2.1.1 (BSD-licensed) - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @class All functions accessible from within Zotero.Utilities namespace inside sandboxed - * translators - * - * @constructor - * @augments Zotero.Utilities - * @borrows Zotero.Date.formatDate as this.formatDate - * @borrows Zotero.Date.strToDate as this.strToDate - * @borrows Zotero.Date.strToISO as this.strToISO - * @borrows Zotero.OpenURL.createContextObject as this.createContextObject - * @borrows Zotero.OpenURL.parseContextObject as this.parseContextObject - * @borrows Zotero.HTTP.processDocuments as this.processDocuments - * @borrows Zotero.HTTP.doPost as this.doPost - * @param {Zotero.Translate} translate - */ -Zotero.Utilities.Translate = function(translate) { - this._translate = translate; -} - -var tmp = function() {}; -tmp.prototype = Zotero.Utilities; -Zotero.Utilities.Translate.prototype = new tmp(); - -Zotero.Utilities.Translate.prototype.formatDate = Zotero.Date.formatDate; -Zotero.Utilities.Translate.prototype.strToDate = Zotero.Date.strToDate; -Zotero.Utilities.Translate.prototype.strToISO = Zotero.Date.strToISO; -Zotero.Utilities.Translate.prototype.createContextObject = Zotero.OpenURL.createContextObject; -Zotero.Utilities.Translate.prototype.parseContextObject = Zotero.OpenURL.parseContextObject; - -/** - * Hack to overloads {@link Zotero.Utilities.capitalizeTitle} to allow overriding capitalizeTitles - * pref on a per-translate instance basis (for translator testing only) - */ -Zotero.Utilities.Translate.prototype.capitalizeTitle = function(string, force) { - if (force === undefined) { - var translate = this._translate; - do { - if (translate.capitalizeTitles !== undefined) { - force = translate.capitalizeTitles; - break; - } - } while (translate = translate._parentTranslator); - } - - return Zotero.Utilities.capitalizeTitle(string, force); -} - -/** - * Gets the current Zotero version - * - * @type String - */ -Zotero.Utilities.Translate.prototype.getVersion = function() { - return Zotero.version; -} - -/** - * Takes an XPath query and returns the results - * - * @deprecated Use {@link Zotero.Utilities.xpath} or doc.evaluate() directly - * @type Node[] - */ -Zotero.Utilities.Translate.prototype.gatherElementsOnXPath = function(doc, parentNode, xpath, nsResolver) { - var elmts = []; - - var iterator = doc.evaluate(xpath, parentNode, nsResolver, XPathResult.ANY_TYPE, null); - var elmt = iterator.iterateNext(); - var i = 0; - while (elmt) { - elmts[i++] = elmt; - elmt = iterator.iterateNext(); - } - return elmts; -} - -/** - * Gets a given node as a string containing all child nodes - * - * @deprecated Use doc.evaluate and the "nodeValue" or "textContent" property - * @type String - */ -Zotero.Utilities.Translate.prototype.getNodeString = function(doc, contextNode, xpath, nsResolver) { - var elmts = this.gatherElementsOnXPath(doc, contextNode, xpath, nsResolver); - var returnVar = ""; - for (var i = 0; i < elmts.length; i++) { - returnVar += elmts[i].nodeValue; - } - return returnVar; -} - -/** - * Grabs items based on URLs - * - * @param {Document} doc DOM document object - * @param {Element|Element[]} inHere DOM element(s) to process - * @param {RegExp} [urlRe] Regexp of URLs to add to list - * @param {RegExp} [urlRe] Regexp of URLs to reject - * @return {Object} Associative array of link => textContent pairs, suitable for passing to - * Zotero.selectItems from within a translator - */ -Zotero.Utilities.Translate.prototype.getItemArray = function(doc, inHere, urlRe, rejectRe) { - var availableItems = new Object(); // Technically, associative arrays are objects - - // Require link to match this - if (urlRe) { - if (urlRe.exec) { - var urlRegexp = urlRe; - } else { - var urlRegexp = new RegExp(); - urlRegexp.compile(urlRe, "i"); - } - } - // Do not allow text to match this - if (rejectRe) { - if (rejectRe.exec) { - var rejectRegexp = rejectRe; - } else { - var rejectRegexp = new RegExp(); - rejectRegexp.compile(rejectRe, "i"); - } - } - - if (!inHere.length) { - inHere = new Array(inHere); - } - - for (var j = 0; j < inHere.length; j++) { - var links = inHere[j].getElementsByTagName("a"); - for (var i = 0; i < links.length; i++) { - if (!urlRe || urlRegexp.test(links[i].href)) { - var text = "textContent" in links[i] ? links[i].textContent : links[i].innerText; - if (text) { - text = this.trimInternal(text); - if (!rejectRe || !rejectRegexp.test(text)) { - if (availableItems[links[i].href]) { - if (text != availableItems[links[i].href]) { - availableItems[links[i].href] += " " + text; - } - } else { - availableItems[links[i].href] = text; - } - } - } - } - } - } - - return availableItems; -} - - -/** - * Load a single document in a hidden browser - * - * @deprecated Use processDocuments with a single URL - * @see Zotero.Utilities.Translate#processDocuments - */ -Zotero.Utilities.Translate.prototype.loadDocument = function(url, succeeded, failed) { - Zotero.debug("Zotero.Utilities.loadDocument is deprecated; please use processDocuments in new code"); - this.processDocuments([url], succeeded, null, failed); -} - -/** - * Already documented in Zotero.HTTP, except this optionally takes noCompleteOnError, which prevents - * the translation process from being cancelled automatically on error, as it is normally. The promise - * is still rejected on error for handling by the calling function. - * @deprecated in Zotero 6.0; prefer requestDocument - * @see Zotero.Utilities.Translate#requestDocument - * @ignore - */ -Zotero.Utilities.Translate.prototype.processDocuments = async function(urls, processor, noCompleteOnError) { - // Handle old signature: urls, processor, onDone, onError - if (arguments.length > 3 || typeof arguments[2] == 'function') { - Zotero.debug("ZU.processDocuments() now takes only 3 arguments -- update your code"); - var onDone = arguments[2]; - var onError = arguments[3]; - noCompleteOnError = false; - } - - var translate = this._translate; - - if (typeof urls == "string") { - urls = [translate.resolveURL(urls)]; - } else { - for (var i in urls) { - urls[i] = translate.resolveURL(urls[i]); - } - } - - var processDoc = function(doc) { - return processor(doc, doc.location.href); - }; - - var funcs = []; - // If current URL passed, use loaded document instead of reloading - for (var i = 0; i < urls.length; i++) { - if (translate.document && translate.document.location && - translate.document.location.toString() === urls[i]) { - Zotero.debug("Translate: Attempted to load the current document using processDocuments; using loaded document instead"); - funcs.push(() => processDoc(this._translate.document, urls[i])); - urls.splice(i, 1); - i--; - } - } - - translate.incrementAsyncProcesses("Zotero.Utilities.Translate#processDocuments"); - - if (urls.length) { - funcs.push( - () => Zotero.HTTP.processDocuments( - urls, - function(doc) { - if (!processor) return; - return processDoc(doc); - }, { - cookieSandbox: translate.cookieSandbox - } - ) - ); - } - - var f; - while (f = funcs.shift()) { - try { - let maybePromise = f(); - // The processor may or may not return a promise - if (maybePromise) { - await maybePromise; - } - } catch (e) { - if (onError) { - try { - onError(e); - } catch (e) { - translate.complete(false, e); - } - } - // Unless instructed otherwise, end the translation on error - else if (!noCompleteOnError) { - translate.complete(false, e); - } - throw e; - } - } - - // Deprecated - if (onDone) { - onDone(); - } - - translate.decrementAsyncProcesses("Zotero.Utilities.Translate#processDocuments"); -}; - -/** - * Send an asynchronous HTTP request, returning a promise. - * - * @param {string} url URL to request - * @param {string} [options.method] The method of the request ("GET", "POST", etc.) - * @param {object} [options.requestHeaders] HTTP headers to send with the request - * @param {string} [options.body] The request's body - * @param {string} [options.responseCharset] The charset the response should be interpreted as - * @param {string} [options.responseType] 'text', 'json', or 'document'. - * If 'json', the response's body will be parsed with JSON.parse before being returned. - * If 'document', the response's body will be parsed as an HTML document (like deprecated processDocuments). - * @return {Promise} A promise resolved with an object containing status, - * headers, and body attributes if the request succeeds. - * If the browser is offline or the response contains a non-2XX status code, - * the promise will be rejected with a Zotero.HTTP.UnexpectedStatusException. - */ -Zotero.Utilities.Translate.prototype.request = async function(url, options = {}) { - url = this._translate.resolveURL(url); - - let method = options.method || 'GET'; - - let internalOptions = { - headers: Object.assign({}, this._translate.requestHeaders, options.headers), - body: options.body, - responseCharset: options.responseCharset, - responseType: options.responseType, - cookieSandbox: this._translate.cookieSandbox - }; - - // If the request fails or a non-2XX status is returned, Zotero.HTTP.request rejects its promise. - // We let the Zotero.HTTP.UnexpectedStatusException bubble up to the caller. - let xhr = await Zotero.HTTP.request(method, url, internalOptions); - let status = xhr.status; - let headers = {}; - xhr.getAllResponseHeaders() - .trim() - .split(/[\r\n]+/) - .map(line => line.split(': ')) - .forEach(parts => headers[parts.shift()] = parts.join(': ')); - let body = xhr.response; - - return { - status, - headers, - body - }; -}; - -/** - * Convenience wrapper for request that returns the text of a successful response. - * @return {Promise} A promise resolved with the text of a successful - * response or rejected with a Zotero.HTTP.UnexpectedStatusException. - */ -Zotero.Utilities.Translate.prototype.requestText = async function(url, options = {}) { - return (await this.request(url, { - ...options, - responseType: 'text' - })).body; -}; - -/** - * Convenience wrapper for request that returns the body of a successful response parsed as JSON. - * @return {Promise} A promise resolved with the body of a successful - * response (parsed with JSON.parse) or rejected with a Zotero.HTTP.UnexpectedStatusException. - */ -Zotero.Utilities.Translate.prototype.requestJSON = async function(url, options = {}) { - return (await this.request(url, { - ...options, - responseType: 'json' - })).body; -}; - -/** - * Convenience wrapper for request that returns the body of a successful response parsed as an HTML document. - * @return {Promise} A promise resolved with the body of a successful - * response (parsed with DOMParser) or rejected with a Zotero.HTTP.UnexpectedStatusException. - */ -Zotero.Utilities.Translate.prototype.requestDocument = async function(url, options = {}) { - return (await this.request(url, { - ...options, - responseType: 'document' - })).body; -}; - -/** - * Send an HTTP GET request via XMLHTTPRequest - * - * @deprecated in Zotero 6.0; prefer request[Text|JSON|Document] - * @see Zotero.Utilities.Translate#request - * @param {String|String[]} urls URL(s) to request - * @param {Function} processor Callback to be executed for each document loaded - * @param {Function} done Callback to be executed after all documents have been loaded - * @param {String} responseCharset Character set to force on the response - * @param {Object} requestHeaders HTTP headers to include with request - * @param {Number[]} successCodes - HTTP status codes that are considered - * successful, or FALSE to allow all - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ -Zotero.Utilities.Translate.prototype.doGet = function(urls, processor, done, responseCharset, requestHeaders, successCodes) { - var callAgain = false, - me = this, - translate = this._translate; - - if (typeof(urls) == "string") { - var url = urls; - } else { - if (urls.length > 1) callAgain = true; - var url = urls.shift(); - } - - url = translate.resolveURL(url); - - translate.incrementAsyncProcesses("Zotero.Utilities.Translate#doGet"); - var xmlhttp = Zotero.HTTP.doGet(url, function(xmlhttp) { - if (successCodes) { - var success = successCodes.includes(xmlhttp.status); - } else if (successCodes === false) { - var success = true; - } else { - var success = xmlhttp.status >= 200 && xmlhttp.status < 400; - } - if (!success) { - translate.complete(false, `HTTP GET ${url} failed with status code ${xmlhttp.status}`); - return; - } - - try { - if (processor) { - processor(xmlhttp.responseText, xmlhttp, url); - } - - if (callAgain) { - me.doGet(urls, processor, done, responseCharset); - } else { - if (done) { - done(); - } - } - translate.decrementAsyncProcesses("Zotero.Utilities.Translate#doGet"); - } catch (e) { - translate.complete(false, e); - } - }, responseCharset, this._translate.cookieSandbox, Object.assign({}, this._translate.requestHeaders, requestHeaders)); -} - -/** - * Already documented in Zotero.HTTP - * @deprecated in Zotero 6.0; prefer request[Text|JSON|Document] - * @see Zotero.Utilities.Translate#request - * @ignore - */ -Zotero.Utilities.Translate.prototype.doPost = function(url, body, onDone, headers, responseCharset, successCodes) { - var translate = this._translate; - url = translate.resolveURL(url); - - translate.incrementAsyncProcesses("Zotero.Utilities.Translate#doPost"); - var xmlhttp = Zotero.HTTP.doPost(url, body, function(xmlhttp) { - if (successCodes) { - var success = successCodes.includes(xmlhttp.status); - } else if (successCodes === false) { - var success = true; - } else { - var success = xmlhttp.status >= 200 && xmlhttp.status < 400; - } - if (!success) { - translate.complete(false, `HTTP POST ${url} failed with status code ${xmlhttp.status}`); - return; - } - - try { - onDone(xmlhttp.responseText, xmlhttp); - translate.decrementAsyncProcesses("Zotero.Utilities.Translate#doPost"); - } catch (e) { - translate.complete(false, e); - } - }, Object.assign({}, translate.requestHeaders, headers), responseCharset, translate.cookieSandbox ? translate.cookieSandbox : undefined); -} - -Zotero.Utilities.Translate.prototype.urlToProxy = function(url) { - var proxy = this._translate._proxy; - if (proxy) return proxy.toProxy(url); - return url; -}; - -Zotero.Utilities.Translate.prototype.urlToProper = function(url) { - var proxy = this._translate._proxy; - if (proxy) return proxy.toProper(url); - return url; -}; - -Zotero.Utilities.Translate.prototype.__exposedProps__ = { - "HTTP": "r" -}; -for (var j in Zotero.Utilities.Translate.prototype) { - if (typeof Zotero.Utilities.Translate.prototype[j] === "function" && j[0] !== "_" && j != "Translate") { - Zotero.Utilities.Translate.prototype.__exposedProps__[j] = "r"; - } -} - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = Zotero.Utilities.Translate; -} \ No newline at end of file diff --git a/external-scripts/xregexp-all.js b/external-scripts/xregexp-all.js deleted file mode 100644 index 35b7a109..00000000 --- a/external-scripts/xregexp-all.js +++ /dev/null @@ -1,4723 +0,0 @@ -(function(f) { - if (typeof exports === "object" && typeof module !== "undefined") { - module.exports = f() - } else if (typeof define === "function" && define.amd) { - define([], f) - } else { - var g; - if (typeof window !== "undefined") { - g = window - } else if (typeof global !== "undefined") { - g = global - } else if (typeof self !== "undefined") { - g = self - } else { - g = this - } - g.XRegExp = f() - } -})(function() { - var define, module, exports; - return (function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof require == "function" && require; - if (!u && a) return a(o, !0); - if (i) return i(o, !0); - var f = new Error("Cannot find module '" + o + "'"); - throw f.code = "MODULE_NOT_FOUND", f - } - var l = n[o] = { - exports: {} - }; - t[o][0].call(l.exports, function(e) { - var n = t[o][1][e]; - return s(n ? n : e) - }, l, l.exports, e, t, n, r) - } - return n[o].exports - } - var i = typeof require == "function" && require; - for (var o = 0; o < r.length; o++) s(r[o]); - return s - })({ - 1: [function(require, module, exports) { - /*! - * XRegExp.build 3.2.0 - * - * Steven Levithan (c) 2012-2017 MIT License - * Inspired by Lea Verou's RegExp.create - */ - - module.exports = function(XRegExp) { - 'use strict'; - - var REGEX_DATA = 'xregexp'; - var subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; - var parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', { - conjunction: 'or' - }); - - /** - * Strips a leading `^` and trailing unescaped `$`, if both are present. - * - * @private - * @param {String} pattern Pattern to process. - * @returns {String} Pattern with edge anchors removed. - */ - function deanchor(pattern) { - // Allow any number of empty noncapturing groups before/after anchors, because regexes - // built/generated by XRegExp sometimes include them - var leadingAnchor = /^(?:\(\?:\))*\^/; - var trailingAnchor = /\$(?:\(\?:\))*$/; - - if ( - leadingAnchor.test(pattern) && - trailingAnchor.test(pattern) && - // Ensure that the trailing `$` isn't escaped - trailingAnchor.test(pattern.replace(/\\[\s\S]/g, '')) - ) { - return pattern.replace(leadingAnchor, '').replace(trailingAnchor, ''); - } - - return pattern; - } - - /** - * Converts the provided value to an XRegExp. Native RegExp flags are not preserved. - * - * @private - * @param {String|RegExp} value Value to convert. - * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not - * already a regex generated by XRegExp - * @returns {RegExp} XRegExp object with XRegExp syntax applied. - */ - function asXRegExp(value, addFlagX) { - var flags = addFlagX ? 'x' : ''; - return XRegExp.isRegExp(value) ? - (value[REGEX_DATA] && value[REGEX_DATA].captureNames ? - // Don't recompile, to preserve capture names - value : - // Recompile as XRegExp - XRegExp(value.source, flags) - ) : - // Compile string as XRegExp - XRegExp(value, flags); - } - - /** - * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in - * the outer pattern and provided subpatterns are automatically renumbered to work correctly. - * Native flags used by provided subpatterns are ignored in favor of the `flags` argument. - * - * @memberOf XRegExp - * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows - * `({{name}})` as shorthand for `(?{{name}})`. Patterns cannot be embedded within - * character classes. - * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A - * leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present. - * @param {String} [flags] Any combination of XRegExp flags. - * @returns {RegExp} Regex with interpolated subpatterns. - * @example - * - * var time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', { - * hours: XRegExp.build('{{h12}} : | {{h24}}', { - * h12: /1[0-2]|0?[1-9]/, - * h24: /2[0-3]|[01][0-9]/ - * }, 'x'), - * minutes: /^[0-5][0-9]$/ - * }); - * time.test('10:59'); // -> true - * XRegExp.exec('10:59', time).minutes; // -> '59' - */ - XRegExp.build = function(pattern, subs, flags) { - flags = flags || ''; - // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how - // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\` - // and `n`. See more details at . - var addFlagX = flags.indexOf('x') > -1; - var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern); - // Add flags within a leading mode modifier to the overall pattern's flags - if (inlineFlags) { - flags = XRegExp._clipDuplicates(flags + inlineFlags[1]); - } - - var data = {}; - for (var p in subs) { - if (subs.hasOwnProperty(p)) { - // Passing to XRegExp enables extended syntax and ensures independent validity, - // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For - // subpatterns provided as native regexes, it dies on octals and adds the property - // used to hold extended regex instance data, for simplicity. - var sub = asXRegExp(subs[p], addFlagX); - data[p] = { - // Deanchoring allows embedding independently useful anchored regexes. If you - // really need to keep your anchors, double them (i.e., `^^...$$`). - pattern: deanchor(sub.source), - names: sub[REGEX_DATA].captureNames || [] - }; - } - } - - // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid; - // helps keep this simple. Named captures will be put back. - var patternAsRegex = asXRegExp(pattern, addFlagX); - - // 'Caps' is short for 'captures' - var numCaps = 0; - var numPriorCaps; - var numOuterCaps = 0; - var outerCapsMap = [0]; - var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || []; - var output = patternAsRegex.source.replace(parts, function($0, $1, $2, $3, $4) { - var subName = $1 || $2; - var capName; - var intro; - var localCapIndex; - // Named subpattern - if (subName) { - if (!data.hasOwnProperty(subName)) { - throw new ReferenceError('Undefined property ' + $0); - } - // Named subpattern was wrapped in a capturing group - if ($1) { - capName = outerCapNames[numOuterCaps]; - outerCapsMap[++numOuterCaps] = ++numCaps; - // If it's a named group, preserve the name. Otherwise, use the subpattern name - // as the capture name - intro = '(?<' + (capName || subName) + '>'; - } else { - intro = '(?:'; - } - numPriorCaps = numCaps; - return intro + data[subName].pattern.replace(subParts, function(match, paren, backref) { - // Capturing group - if (paren) { - capName = data[subName].names[numCaps - numPriorCaps]; - ++numCaps; - // If the current capture has a name, preserve the name - if (capName) { - return '(?<' + capName + '>'; - } - // Backreference - } else if (backref) { - localCapIndex = +backref - 1; - // Rewrite the backreference - return data[subName].names[localCapIndex] ? - // Need to preserve the backreference name in case using flag `n` - '\\k<' + data[subName].names[localCapIndex] + '>' : - '\\' + (+backref + numPriorCaps); - } - return match; - }) + ')'; - } - // Capturing group - if ($3) { - capName = outerCapNames[numOuterCaps]; - outerCapsMap[++numOuterCaps] = ++numCaps; - // If the current capture has a name, preserve the name - if (capName) { - return '(?<' + capName + '>'; - } - // Backreference - } else if ($4) { - localCapIndex = +$4 - 1; - // Rewrite the backreference - return outerCapNames[localCapIndex] ? - // Need to preserve the backreference name in case using flag `n` - '\\k<' + outerCapNames[localCapIndex] + '>' : - '\\' + outerCapsMap[+$4]; - } - return $0; - }); - - return XRegExp(output, flags); - }; - - }; - - }, {}], - 2: [function(require, module, exports) { - /*! - * XRegExp.matchRecursive 3.2.0 - * - * Steven Levithan (c) 2009-2017 MIT License - */ - - module.exports = function(XRegExp) { - 'use strict'; - - /** - * Returns a match detail object composed of the provided values. - * - * @private - */ - function row(name, value, start, end) { - return { - name: name, - value: value, - start: start, - end: end - }; - } - - /** - * Returns an array of match strings between outermost left and right delimiters, or an array of - * objects with detailed match parts and position data. An error is thrown if delimiters are - * unbalanced within the data. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {String} left Left delimiter as an XRegExp pattern. - * @param {String} right Right delimiter as an XRegExp pattern. - * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters. - * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options. - * @returns {Array} Array of matches, or an empty array. - * @example - * - * // Basic usage - * var str = '(t((e))s)t()(ing)'; - * XRegExp.matchRecursive(str, '\\(', '\\)', 'g'); - * // -> ['t((e))s', '', 'ing'] - * - * // Extended information mode with valueNames - * str = 'Here is
    an
    example'; - * XRegExp.matchRecursive(str, '', '', 'gi', { - * valueNames: ['between', 'left', 'match', 'right'] - * }); - * // -> [ - * // {name: 'between', value: 'Here is ', start: 0, end: 8}, - * // {name: 'left', value: '
    ', start: 8, end: 13}, - * // {name: 'match', value: '
    an
    ', start: 13, end: 27}, - * // {name: 'right', value: '
    ', start: 27, end: 33}, - * // {name: 'between', value: ' example', start: 33, end: 41} - * // ] - * - * // Omitting unneeded parts with null valueNames, and using escapeChar - * str = '...{1}.\\{{function(x,y){return {y:x}}}'; - * XRegExp.matchRecursive(str, '{', '}', 'g', { - * valueNames: ['literal', null, 'value', null], - * escapeChar: '\\' - * }); - * // -> [ - * // {name: 'literal', value: '...', start: 0, end: 3}, - * // {name: 'value', value: '1', start: 4, end: 5}, - * // {name: 'literal', value: '.\\{', start: 6, end: 9}, - * // {name: 'value', value: 'function(x,y){return {y:x}}', start: 10, end: 37} - * // ] - * - * // Sticky mode via flag y - * str = '<1><<<2>>><3>4<5>'; - * XRegExp.matchRecursive(str, '<', '>', 'gy'); - * // -> ['1', '<<2>>', '3'] - */ - XRegExp.matchRecursive = function(str, left, right, flags, options) { - flags = flags || ''; - options = options || {}; - var global = flags.indexOf('g') > -1; - var sticky = flags.indexOf('y') > -1; - // Flag `y` is controlled internally - var basicFlags = flags.replace(/y/g, ''); - var escapeChar = options.escapeChar; - var vN = options.valueNames; - var output = []; - var openTokens = 0; - var delimStart = 0; - var delimEnd = 0; - var lastOuterEnd = 0; - var outerStart; - var innerStart; - var leftMatch; - var rightMatch; - var esc; - left = XRegExp(left, basicFlags); - right = XRegExp(right, basicFlags); - - if (escapeChar) { - if (escapeChar.length > 1) { - throw new Error('Cannot use more than one escape character'); - } - escapeChar = XRegExp.escape(escapeChar); - // Example of concatenated `esc` regex: - // `escapeChar`: '%' - // `left`: '<' - // `right`: '>' - // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/ - esc = new RegExp( - '(?:' + escapeChar + '[\\S\\s]|(?:(?!' + - // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`. - // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax - // transformation resulting from those flags was already applied to `left` and - // `right` when they were passed through the XRegExp constructor above. - XRegExp.union([left, right], '', { - conjunction: 'or' - }).source + - ')[^' + escapeChar + '])+)+', - // Flags `gy` not needed here - flags.replace(/[^imu]+/g, '') - ); - } - - while (true) { - // If using an escape character, advance to the delimiter's next starting position, - // skipping any escaped characters in between - if (escapeChar) { - delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length; - } - leftMatch = XRegExp.exec(str, left, delimEnd); - rightMatch = XRegExp.exec(str, right, delimEnd); - // Keep the leftmost match only - if (leftMatch && rightMatch) { - if (leftMatch.index <= rightMatch.index) { - rightMatch = null; - } else { - leftMatch = null; - } - } - // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens): - // LM | RM | OT | Result - // 1 | 0 | 1 | loop - // 1 | 0 | 0 | loop - // 0 | 1 | 1 | loop - // 0 | 1 | 0 | throw - // 0 | 0 | 1 | throw - // 0 | 0 | 0 | break - // The paths above don't include the sticky mode special case. The loop ends after the - // first completed match if not `global`. - if (leftMatch || rightMatch) { - delimStart = (leftMatch || rightMatch).index; - delimEnd = delimStart + (leftMatch || rightMatch)[0].length; - } else if (!openTokens) { - break; - } - if (sticky && !openTokens && delimStart > lastOuterEnd) { - break; - } - if (leftMatch) { - if (!openTokens) { - outerStart = delimStart; - innerStart = delimEnd; - } - ++openTokens; - } else if (rightMatch && openTokens) { - if (!--openTokens) { - if (vN) { - if (vN[0] && outerStart > lastOuterEnd) { - output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart)); - } - if (vN[1]) { - output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart)); - } - if (vN[2]) { - output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart)); - } - if (vN[3]) { - output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd)); - } - } else { - output.push(str.slice(innerStart, delimStart)); - } - lastOuterEnd = delimEnd; - if (!global) { - break; - } - } - } else { - throw new Error('Unbalanced delimiter found in string'); - } - // If the delimiter matched an empty string, avoid an infinite loop - if (delimStart === delimEnd) { - ++delimEnd; - } - } - - if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) { - output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length)); - } - - return output; - }; - - }; - - }, {}], - 3: [function(require, module, exports) { - /*! - * XRegExp Unicode Base 3.2.0 - * - * Steven Levithan (c) 2008-2017 MIT License - */ - - module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds base support for Unicode matching: - * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or - * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the - * braces for token names that are a single letter (e.g. `\pL` or `PL`). - * - Adds flag A (astral), which enables 21-bit Unicode support. - * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data. - * - * Unicode Base relies on externally provided Unicode character data. Official addons are - * available to provide data for Unicode categories, scripts, blocks, and properties. - * - * @requires XRegExp - */ - - // ==--------------------------== - // Private stuff - // ==--------------------------== - - // Storage for Unicode data - var unicode = {}; - - // Reuse utils - var dec = XRegExp._dec; - var hex = XRegExp._hex; - var pad4 = XRegExp._pad4; - - // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed - function normalize(name) { - return name.replace(/[- _]+/g, '').toLowerCase(); - } - - // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal - function charCode(chr) { - var esc = /^\\[xu](.+)/.exec(chr); - return esc ? - dec(esc[1]) : - chr.charCodeAt(chr.charAt(0) === '\\' ? 1 : 0); - } - - // Inverts a list of ordered BMP characters and ranges - function invertBmp(range) { - var output = ''; - var lastEnd = -1; - - XRegExp.forEach( - range, - /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, - function(m) { - var start = charCode(m[1]); - if (start > (lastEnd + 1)) { - output += '\\u' + pad4(hex(lastEnd + 1)); - if (start > (lastEnd + 2)) { - output += '-\\u' + pad4(hex(start - 1)); - } - } - lastEnd = charCode(m[2] || m[1]); - } - ); - - if (lastEnd < 0xFFFF) { - output += '\\u' + pad4(hex(lastEnd + 1)); - if (lastEnd < 0xFFFE) { - output += '-\\uFFFF'; - } - } - - return output; - } - - // Generates an inverted BMP range on first use - function cacheInvertedBmp(slug) { - var prop = 'b!'; - return ( - unicode[slug][prop] || - (unicode[slug][prop] = invertBmp(unicode[slug].bmp)) - ); - } - - // Combines and optionally negates BMP and astral data - function buildAstral(slug, isNegated) { - var item = unicode[slug]; - var combined = ''; - - if (item.bmp && !item.isBmpLast) { - combined = '[' + item.bmp + ']' + (item.astral ? '|' : ''); - } - if (item.astral) { - combined += item.astral; - } - if (item.isBmpLast && item.bmp) { - combined += (item.astral ? '|' : '') + '[' + item.bmp + ']'; - } - - // Astral Unicode tokens always match a code point, never a code unit - return isNegated ? - '(?:(?!' + combined + ')(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))' : - '(?:' + combined + ')'; - } - - // Builds a complete astral pattern on first use - function cacheAstral(slug, isNegated) { - var prop = isNegated ? 'a!' : 'a='; - return ( - unicode[slug][prop] || - (unicode[slug][prop] = buildAstral(slug, isNegated)) - ); - } - - // ==--------------------------== - // Core functionality - // ==--------------------------== - - /* - * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`. - */ - XRegExp.addToken( - // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` - /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, - function(match, scope, flags) { - var ERR_DOUBLE_NEG = 'Invalid double negation '; - var ERR_UNKNOWN_NAME = 'Unknown Unicode token '; - var ERR_UNKNOWN_REF = 'Unicode token missing data '; - var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token '; - var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; - // Negated via \P{..} or \p{^..} - var isNegated = match[1] === 'P' || !!match[2]; - // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A - var isAstralMode = flags.indexOf('A') > -1; - // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}` - var slug = normalize(match[4] || match[3]); - // Token data object - var item = unicode[slug]; - - if (match[1] === 'P' && match[2]) { - throw new SyntaxError(ERR_DOUBLE_NEG + match[0]); - } - if (!unicode.hasOwnProperty(slug)) { - throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]); - } - - // Switch to the negated form of the referenced Unicode token - if (item.inverseOf) { - slug = normalize(item.inverseOf); - if (!unicode.hasOwnProperty(slug)) { - throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf); - } - item = unicode[slug]; - isNegated = !isNegated; - } - - if (!(item.bmp || isAstralMode)) { - throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]); - } - if (isAstralMode) { - if (scope === 'class') { - throw new SyntaxError(ERR_ASTRAL_IN_CLASS); - } - - return cacheAstral(slug, isNegated); - } - - return scope === 'class' ? - (isNegated ? cacheInvertedBmp(slug) : item.bmp) : - (isNegated ? '[^' : '[') + item.bmp + ']'; - }, { - scope: 'all', - optionalFlags: 'A', - leadChar: '\\' - } - ); - - /** - * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`. - * - * @memberOf XRegExp - * @param {Array} data Objects with named character ranges. Each object may have properties - * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are - * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If - * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent, - * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are - * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and - * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan - * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and - * `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape - * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be - * escaped, apart from range-creating hyphens. The `astral` data can additionally use - * character classes and alternation, and should use surrogate pairs to represent astral code - * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is - * defined as the exact inverse of another token. - * @example - * - * // Basic use - * XRegExp.addUnicodeData([{ - * name: 'XDigit', - * alias: 'Hexadecimal', - * bmp: '0-9A-Fa-f' - * }]); - * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true - */ - XRegExp.addUnicodeData = function(data) { - var ERR_NO_NAME = 'Unicode token requires name'; - var ERR_NO_DATA = 'Unicode token has no character data '; - var item; - - for (var i = 0; i < data.length; ++i) { - item = data[i]; - if (!item.name) { - throw new Error(ERR_NO_NAME); - } - if (!(item.inverseOf || item.bmp || item.astral)) { - throw new Error(ERR_NO_DATA + item.name); - } - unicode[normalize(item.name)] = item; - if (item.alias) { - unicode[normalize(item.alias)] = item; - } - } - - // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and - // flags might now produce different results - XRegExp.cache.flush('patterns'); - }; - - /** - * @ignore - * - * Return a reference to the internal Unicode definition structure for the given Unicode - * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex - * constructs. - * - * @memberOf XRegExp - * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive), - * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode - * Properties and Property Aliases. - * @returns {Object} Reference to definition structure when the name matches a Unicode Property. - * - * @note - * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories. - * - * @note - * This method is *not* part of the officially documented API and may change or be removed in - * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode - * structures set up by XRegExp. - */ - XRegExp._getUnicodeProperty = function(name) { - var slug = normalize(name); - return unicode[slug]; - }; - - }; - - }, {}], - 4: [function(require, module, exports) { - /*! - * XRegExp Unicode Blocks 3.2.0 - * - * Steven Levithan (c) 2010-2017 MIT License - * Unicode data by Mathias Bynens - */ - - module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g., - * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and - * underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ - - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks'); - } - - XRegExp.addUnicodeData([{ - name: 'InAdlam', - astral: '\uD83A[\uDD00-\uDD5F]' - }, - { - name: 'InAegean_Numbers', - astral: '\uD800[\uDD00-\uDD3F]' - }, - { - name: 'InAhom', - astral: '\uD805[\uDF00-\uDF3F]' - }, - { - name: 'InAlchemical_Symbols', - astral: '\uD83D[\uDF00-\uDF7F]' - }, - { - name: 'InAlphabetic_Presentation_Forms', - bmp: '\uFB00-\uFB4F' - }, - { - name: 'InAnatolian_Hieroglyphs', - astral: '\uD811[\uDC00-\uDE7F]' - }, - { - name: 'InAncient_Greek_Musical_Notation', - astral: '\uD834[\uDE00-\uDE4F]' - }, - { - name: 'InAncient_Greek_Numbers', - astral: '\uD800[\uDD40-\uDD8F]' - }, - { - name: 'InAncient_Symbols', - astral: '\uD800[\uDD90-\uDDCF]' - }, - { - name: 'InArabic', - bmp: '\u0600-\u06FF' - }, - { - name: 'InArabic_Extended_A', - bmp: '\u08A0-\u08FF' - }, - { - name: 'InArabic_Mathematical_Alphabetic_Symbols', - astral: '\uD83B[\uDE00-\uDEFF]' - }, - { - name: 'InArabic_Presentation_Forms_A', - bmp: '\uFB50-\uFDFF' - }, - { - name: 'InArabic_Presentation_Forms_B', - bmp: '\uFE70-\uFEFF' - }, - { - name: 'InArabic_Supplement', - bmp: '\u0750-\u077F' - }, - { - name: 'InArmenian', - bmp: '\u0530-\u058F' - }, - { - name: 'InArrows', - bmp: '\u2190-\u21FF' - }, - { - name: 'InAvestan', - astral: '\uD802[\uDF00-\uDF3F]' - }, - { - name: 'InBalinese', - bmp: '\u1B00-\u1B7F' - }, - { - name: 'InBamum', - bmp: '\uA6A0-\uA6FF' - }, - { - name: 'InBamum_Supplement', - astral: '\uD81A[\uDC00-\uDE3F]' - }, - { - name: 'InBasic_Latin', - bmp: '\0-\x7F' - }, - { - name: 'InBassa_Vah', - astral: '\uD81A[\uDED0-\uDEFF]' - }, - { - name: 'InBatak', - bmp: '\u1BC0-\u1BFF' - }, - { - name: 'InBengali', - bmp: '\u0980-\u09FF' - }, - { - name: 'InBhaiksuki', - astral: '\uD807[\uDC00-\uDC6F]' - }, - { - name: 'InBlock_Elements', - bmp: '\u2580-\u259F' - }, - { - name: 'InBopomofo', - bmp: '\u3100-\u312F' - }, - { - name: 'InBopomofo_Extended', - bmp: '\u31A0-\u31BF' - }, - { - name: 'InBox_Drawing', - bmp: '\u2500-\u257F' - }, - { - name: 'InBrahmi', - astral: '\uD804[\uDC00-\uDC7F]' - }, - { - name: 'InBraille_Patterns', - bmp: '\u2800-\u28FF' - }, - { - name: 'InBuginese', - bmp: '\u1A00-\u1A1F' - }, - { - name: 'InBuhid', - bmp: '\u1740-\u175F' - }, - { - name: 'InByzantine_Musical_Symbols', - astral: '\uD834[\uDC00-\uDCFF]' - }, - { - name: 'InCJK_Compatibility', - bmp: '\u3300-\u33FF' - }, - { - name: 'InCJK_Compatibility_Forms', - bmp: '\uFE30-\uFE4F' - }, - { - name: 'InCJK_Compatibility_Ideographs', - bmp: '\uF900-\uFAFF' - }, - { - name: 'InCJK_Compatibility_Ideographs_Supplement', - astral: '\uD87E[\uDC00-\uDE1F]' - }, - { - name: 'InCJK_Radicals_Supplement', - bmp: '\u2E80-\u2EFF' - }, - { - name: 'InCJK_Strokes', - bmp: '\u31C0-\u31EF' - }, - { - name: 'InCJK_Symbols_and_Punctuation', - bmp: '\u3000-\u303F' - }, - { - name: 'InCJK_Unified_Ideographs', - bmp: '\u4E00-\u9FFF' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_A', - bmp: '\u3400-\u4DBF' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_B', - astral: '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_C', - astral: '\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_D', - astral: '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_E', - astral: '\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]' - }, - { - name: 'InCarian', - astral: '\uD800[\uDEA0-\uDEDF]' - }, - { - name: 'InCaucasian_Albanian', - astral: '\uD801[\uDD30-\uDD6F]' - }, - { - name: 'InChakma', - astral: '\uD804[\uDD00-\uDD4F]' - }, - { - name: 'InCham', - bmp: '\uAA00-\uAA5F' - }, - { - name: 'InCherokee', - bmp: '\u13A0-\u13FF' - }, - { - name: 'InCherokee_Supplement', - bmp: '\uAB70-\uABBF' - }, - { - name: 'InCombining_Diacritical_Marks', - bmp: '\u0300-\u036F' - }, - { - name: 'InCombining_Diacritical_Marks_Extended', - bmp: '\u1AB0-\u1AFF' - }, - { - name: 'InCombining_Diacritical_Marks_Supplement', - bmp: '\u1DC0-\u1DFF' - }, - { - name: 'InCombining_Diacritical_Marks_for_Symbols', - bmp: '\u20D0-\u20FF' - }, - { - name: 'InCombining_Half_Marks', - bmp: '\uFE20-\uFE2F' - }, - { - name: 'InCommon_Indic_Number_Forms', - bmp: '\uA830-\uA83F' - }, - { - name: 'InControl_Pictures', - bmp: '\u2400-\u243F' - }, - { - name: 'InCoptic', - bmp: '\u2C80-\u2CFF' - }, - { - name: 'InCoptic_Epact_Numbers', - astral: '\uD800[\uDEE0-\uDEFF]' - }, - { - name: 'InCounting_Rod_Numerals', - astral: '\uD834[\uDF60-\uDF7F]' - }, - { - name: 'InCuneiform', - astral: '\uD808[\uDC00-\uDFFF]' - }, - { - name: 'InCuneiform_Numbers_and_Punctuation', - astral: '\uD809[\uDC00-\uDC7F]' - }, - { - name: 'InCurrency_Symbols', - bmp: '\u20A0-\u20CF' - }, - { - name: 'InCypriot_Syllabary', - astral: '\uD802[\uDC00-\uDC3F]' - }, - { - name: 'InCyrillic', - bmp: '\u0400-\u04FF' - }, - { - name: 'InCyrillic_Extended_A', - bmp: '\u2DE0-\u2DFF' - }, - { - name: 'InCyrillic_Extended_B', - bmp: '\uA640-\uA69F' - }, - { - name: 'InCyrillic_Extended_C', - bmp: '\u1C80-\u1C8F' - }, - { - name: 'InCyrillic_Supplement', - bmp: '\u0500-\u052F' - }, - { - name: 'InDeseret', - astral: '\uD801[\uDC00-\uDC4F]' - }, - { - name: 'InDevanagari', - bmp: '\u0900-\u097F' - }, - { - name: 'InDevanagari_Extended', - bmp: '\uA8E0-\uA8FF' - }, - { - name: 'InDingbats', - bmp: '\u2700-\u27BF' - }, - { - name: 'InDomino_Tiles', - astral: '\uD83C[\uDC30-\uDC9F]' - }, - { - name: 'InDuployan', - astral: '\uD82F[\uDC00-\uDC9F]' - }, - { - name: 'InEarly_Dynastic_Cuneiform', - astral: '\uD809[\uDC80-\uDD4F]' - }, - { - name: 'InEgyptian_Hieroglyphs', - astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]' - }, - { - name: 'InElbasan', - astral: '\uD801[\uDD00-\uDD2F]' - }, - { - name: 'InEmoticons', - astral: '\uD83D[\uDE00-\uDE4F]' - }, - { - name: 'InEnclosed_Alphanumeric_Supplement', - astral: '\uD83C[\uDD00-\uDDFF]' - }, - { - name: 'InEnclosed_Alphanumerics', - bmp: '\u2460-\u24FF' - }, - { - name: 'InEnclosed_CJK_Letters_and_Months', - bmp: '\u3200-\u32FF' - }, - { - name: 'InEnclosed_Ideographic_Supplement', - astral: '\uD83C[\uDE00-\uDEFF]' - }, - { - name: 'InEthiopic', - bmp: '\u1200-\u137F' - }, - { - name: 'InEthiopic_Extended', - bmp: '\u2D80-\u2DDF' - }, - { - name: 'InEthiopic_Extended_A', - bmp: '\uAB00-\uAB2F' - }, - { - name: 'InEthiopic_Supplement', - bmp: '\u1380-\u139F' - }, - { - name: 'InGeneral_Punctuation', - bmp: '\u2000-\u206F' - }, - { - name: 'InGeometric_Shapes', - bmp: '\u25A0-\u25FF' - }, - { - name: 'InGeometric_Shapes_Extended', - astral: '\uD83D[\uDF80-\uDFFF]' - }, - { - name: 'InGeorgian', - bmp: '\u10A0-\u10FF' - }, - { - name: 'InGeorgian_Supplement', - bmp: '\u2D00-\u2D2F' - }, - { - name: 'InGlagolitic', - bmp: '\u2C00-\u2C5F' - }, - { - name: 'InGlagolitic_Supplement', - astral: '\uD838[\uDC00-\uDC2F]' - }, - { - name: 'InGothic', - astral: '\uD800[\uDF30-\uDF4F]' - }, - { - name: 'InGrantha', - astral: '\uD804[\uDF00-\uDF7F]' - }, - { - name: 'InGreek_Extended', - bmp: '\u1F00-\u1FFF' - }, - { - name: 'InGreek_and_Coptic', - bmp: '\u0370-\u03FF' - }, - { - name: 'InGujarati', - bmp: '\u0A80-\u0AFF' - }, - { - name: 'InGurmukhi', - bmp: '\u0A00-\u0A7F' - }, - { - name: 'InHalfwidth_and_Fullwidth_Forms', - bmp: '\uFF00-\uFFEF' - }, - { - name: 'InHangul_Compatibility_Jamo', - bmp: '\u3130-\u318F' - }, - { - name: 'InHangul_Jamo', - bmp: '\u1100-\u11FF' - }, - { - name: 'InHangul_Jamo_Extended_A', - bmp: '\uA960-\uA97F' - }, - { - name: 'InHangul_Jamo_Extended_B', - bmp: '\uD7B0-\uD7FF' - }, - { - name: 'InHangul_Syllables', - bmp: '\uAC00-\uD7AF' - }, - { - name: 'InHanunoo', - bmp: '\u1720-\u173F' - }, - { - name: 'InHatran', - astral: '\uD802[\uDCE0-\uDCFF]' - }, - { - name: 'InHebrew', - bmp: '\u0590-\u05FF' - }, - { - name: 'InHigh_Private_Use_Surrogates', - bmp: '\uDB80-\uDBFF' - }, - { - name: 'InHigh_Surrogates', - bmp: '\uD800-\uDB7F' - }, - { - name: 'InHiragana', - bmp: '\u3040-\u309F' - }, - { - name: 'InIPA_Extensions', - bmp: '\u0250-\u02AF' - }, - { - name: 'InIdeographic_Description_Characters', - bmp: '\u2FF0-\u2FFF' - }, - { - name: 'InIdeographic_Symbols_and_Punctuation', - astral: '\uD81B[\uDFE0-\uDFFF]' - }, - { - name: 'InImperial_Aramaic', - astral: '\uD802[\uDC40-\uDC5F]' - }, - { - name: 'InInscriptional_Pahlavi', - astral: '\uD802[\uDF60-\uDF7F]' - }, - { - name: 'InInscriptional_Parthian', - astral: '\uD802[\uDF40-\uDF5F]' - }, - { - name: 'InJavanese', - bmp: '\uA980-\uA9DF' - }, - { - name: 'InKaithi', - astral: '\uD804[\uDC80-\uDCCF]' - }, - { - name: 'InKana_Supplement', - astral: '\uD82C[\uDC00-\uDCFF]' - }, - { - name: 'InKanbun', - bmp: '\u3190-\u319F' - }, - { - name: 'InKangxi_Radicals', - bmp: '\u2F00-\u2FDF' - }, - { - name: 'InKannada', - bmp: '\u0C80-\u0CFF' - }, - { - name: 'InKatakana', - bmp: '\u30A0-\u30FF' - }, - { - name: 'InKatakana_Phonetic_Extensions', - bmp: '\u31F0-\u31FF' - }, - { - name: 'InKayah_Li', - bmp: '\uA900-\uA92F' - }, - { - name: 'InKharoshthi', - astral: '\uD802[\uDE00-\uDE5F]' - }, - { - name: 'InKhmer', - bmp: '\u1780-\u17FF' - }, - { - name: 'InKhmer_Symbols', - bmp: '\u19E0-\u19FF' - }, - { - name: 'InKhojki', - astral: '\uD804[\uDE00-\uDE4F]' - }, - { - name: 'InKhudawadi', - astral: '\uD804[\uDEB0-\uDEFF]' - }, - { - name: 'InLao', - bmp: '\u0E80-\u0EFF' - }, - { - name: 'InLatin_Extended_Additional', - bmp: '\u1E00-\u1EFF' - }, - { - name: 'InLatin_Extended_A', - bmp: '\u0100-\u017F' - }, - { - name: 'InLatin_Extended_B', - bmp: '\u0180-\u024F' - }, - { - name: 'InLatin_Extended_C', - bmp: '\u2C60-\u2C7F' - }, - { - name: 'InLatin_Extended_D', - bmp: '\uA720-\uA7FF' - }, - { - name: 'InLatin_Extended_E', - bmp: '\uAB30-\uAB6F' - }, - { - name: 'InLatin_1_Supplement', - bmp: '\x80-\xFF' - }, - { - name: 'InLepcha', - bmp: '\u1C00-\u1C4F' - }, - { - name: 'InLetterlike_Symbols', - bmp: '\u2100-\u214F' - }, - { - name: 'InLimbu', - bmp: '\u1900-\u194F' - }, - { - name: 'InLinear_A', - astral: '\uD801[\uDE00-\uDF7F]' - }, - { - name: 'InLinear_B_Ideograms', - astral: '\uD800[\uDC80-\uDCFF]' - }, - { - name: 'InLinear_B_Syllabary', - astral: '\uD800[\uDC00-\uDC7F]' - }, - { - name: 'InLisu', - bmp: '\uA4D0-\uA4FF' - }, - { - name: 'InLow_Surrogates', - bmp: '\uDC00-\uDFFF' - }, - { - name: 'InLycian', - astral: '\uD800[\uDE80-\uDE9F]' - }, - { - name: 'InLydian', - astral: '\uD802[\uDD20-\uDD3F]' - }, - { - name: 'InMahajani', - astral: '\uD804[\uDD50-\uDD7F]' - }, - { - name: 'InMahjong_Tiles', - astral: '\uD83C[\uDC00-\uDC2F]' - }, - { - name: 'InMalayalam', - bmp: '\u0D00-\u0D7F' - }, - { - name: 'InMandaic', - bmp: '\u0840-\u085F' - }, - { - name: 'InManichaean', - astral: '\uD802[\uDEC0-\uDEFF]' - }, - { - name: 'InMarchen', - astral: '\uD807[\uDC70-\uDCBF]' - }, - { - name: 'InMathematical_Alphanumeric_Symbols', - astral: '\uD835[\uDC00-\uDFFF]' - }, - { - name: 'InMathematical_Operators', - bmp: '\u2200-\u22FF' - }, - { - name: 'InMeetei_Mayek', - bmp: '\uABC0-\uABFF' - }, - { - name: 'InMeetei_Mayek_Extensions', - bmp: '\uAAE0-\uAAFF' - }, - { - name: 'InMende_Kikakui', - astral: '\uD83A[\uDC00-\uDCDF]' - }, - { - name: 'InMeroitic_Cursive', - astral: '\uD802[\uDDA0-\uDDFF]' - }, - { - name: 'InMeroitic_Hieroglyphs', - astral: '\uD802[\uDD80-\uDD9F]' - }, - { - name: 'InMiao', - astral: '\uD81B[\uDF00-\uDF9F]' - }, - { - name: 'InMiscellaneous_Mathematical_Symbols_A', - bmp: '\u27C0-\u27EF' - }, - { - name: 'InMiscellaneous_Mathematical_Symbols_B', - bmp: '\u2980-\u29FF' - }, - { - name: 'InMiscellaneous_Symbols', - bmp: '\u2600-\u26FF' - }, - { - name: 'InMiscellaneous_Symbols_and_Arrows', - bmp: '\u2B00-\u2BFF' - }, - { - name: 'InMiscellaneous_Symbols_and_Pictographs', - astral: '\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF]' - }, - { - name: 'InMiscellaneous_Technical', - bmp: '\u2300-\u23FF' - }, - { - name: 'InModi', - astral: '\uD805[\uDE00-\uDE5F]' - }, - { - name: 'InModifier_Tone_Letters', - bmp: '\uA700-\uA71F' - }, - { - name: 'InMongolian', - bmp: '\u1800-\u18AF' - }, - { - name: 'InMongolian_Supplement', - astral: '\uD805[\uDE60-\uDE7F]' - }, - { - name: 'InMro', - astral: '\uD81A[\uDE40-\uDE6F]' - }, - { - name: 'InMultani', - astral: '\uD804[\uDE80-\uDEAF]' - }, - { - name: 'InMusical_Symbols', - astral: '\uD834[\uDD00-\uDDFF]' - }, - { - name: 'InMyanmar', - bmp: '\u1000-\u109F' - }, - { - name: 'InMyanmar_Extended_A', - bmp: '\uAA60-\uAA7F' - }, - { - name: 'InMyanmar_Extended_B', - bmp: '\uA9E0-\uA9FF' - }, - { - name: 'InNKo', - bmp: '\u07C0-\u07FF' - }, - { - name: 'InNabataean', - astral: '\uD802[\uDC80-\uDCAF]' - }, - { - name: 'InNew_Tai_Lue', - bmp: '\u1980-\u19DF' - }, - { - name: 'InNewa', - astral: '\uD805[\uDC00-\uDC7F]' - }, - { - name: 'InNumber_Forms', - bmp: '\u2150-\u218F' - }, - { - name: 'InOgham', - bmp: '\u1680-\u169F' - }, - { - name: 'InOl_Chiki', - bmp: '\u1C50-\u1C7F' - }, - { - name: 'InOld_Hungarian', - astral: '\uD803[\uDC80-\uDCFF]' - }, - { - name: 'InOld_Italic', - astral: '\uD800[\uDF00-\uDF2F]' - }, - { - name: 'InOld_North_Arabian', - astral: '\uD802[\uDE80-\uDE9F]' - }, - { - name: 'InOld_Permic', - astral: '\uD800[\uDF50-\uDF7F]' - }, - { - name: 'InOld_Persian', - astral: '\uD800[\uDFA0-\uDFDF]' - }, - { - name: 'InOld_South_Arabian', - astral: '\uD802[\uDE60-\uDE7F]' - }, - { - name: 'InOld_Turkic', - astral: '\uD803[\uDC00-\uDC4F]' - }, - { - name: 'InOptical_Character_Recognition', - bmp: '\u2440-\u245F' - }, - { - name: 'InOriya', - bmp: '\u0B00-\u0B7F' - }, - { - name: 'InOrnamental_Dingbats', - astral: '\uD83D[\uDE50-\uDE7F]' - }, - { - name: 'InOsage', - astral: '\uD801[\uDCB0-\uDCFF]' - }, - { - name: 'InOsmanya', - astral: '\uD801[\uDC80-\uDCAF]' - }, - { - name: 'InPahawh_Hmong', - astral: '\uD81A[\uDF00-\uDF8F]' - }, - { - name: 'InPalmyrene', - astral: '\uD802[\uDC60-\uDC7F]' - }, - { - name: 'InPau_Cin_Hau', - astral: '\uD806[\uDEC0-\uDEFF]' - }, - { - name: 'InPhags_pa', - bmp: '\uA840-\uA87F' - }, - { - name: 'InPhaistos_Disc', - astral: '\uD800[\uDDD0-\uDDFF]' - }, - { - name: 'InPhoenician', - astral: '\uD802[\uDD00-\uDD1F]' - }, - { - name: 'InPhonetic_Extensions', - bmp: '\u1D00-\u1D7F' - }, - { - name: 'InPhonetic_Extensions_Supplement', - bmp: '\u1D80-\u1DBF' - }, - { - name: 'InPlaying_Cards', - astral: '\uD83C[\uDCA0-\uDCFF]' - }, - { - name: 'InPrivate_Use_Area', - bmp: '\uE000-\uF8FF' - }, - { - name: 'InPsalter_Pahlavi', - astral: '\uD802[\uDF80-\uDFAF]' - }, - { - name: 'InRejang', - bmp: '\uA930-\uA95F' - }, - { - name: 'InRumi_Numeral_Symbols', - astral: '\uD803[\uDE60-\uDE7F]' - }, - { - name: 'InRunic', - bmp: '\u16A0-\u16FF' - }, - { - name: 'InSamaritan', - bmp: '\u0800-\u083F' - }, - { - name: 'InSaurashtra', - bmp: '\uA880-\uA8DF' - }, - { - name: 'InSharada', - astral: '\uD804[\uDD80-\uDDDF]' - }, - { - name: 'InShavian', - astral: '\uD801[\uDC50-\uDC7F]' - }, - { - name: 'InShorthand_Format_Controls', - astral: '\uD82F[\uDCA0-\uDCAF]' - }, - { - name: 'InSiddham', - astral: '\uD805[\uDD80-\uDDFF]' - }, - { - name: 'InSinhala', - bmp: '\u0D80-\u0DFF' - }, - { - name: 'InSinhala_Archaic_Numbers', - astral: '\uD804[\uDDE0-\uDDFF]' - }, - { - name: 'InSmall_Form_Variants', - bmp: '\uFE50-\uFE6F' - }, - { - name: 'InSora_Sompeng', - astral: '\uD804[\uDCD0-\uDCFF]' - }, - { - name: 'InSpacing_Modifier_Letters', - bmp: '\u02B0-\u02FF' - }, - { - name: 'InSpecials', - bmp: '\uFFF0-\uFFFF' - }, - { - name: 'InSundanese', - bmp: '\u1B80-\u1BBF' - }, - { - name: 'InSundanese_Supplement', - bmp: '\u1CC0-\u1CCF' - }, - { - name: 'InSuperscripts_and_Subscripts', - bmp: '\u2070-\u209F' - }, - { - name: 'InSupplemental_Arrows_A', - bmp: '\u27F0-\u27FF' - }, - { - name: 'InSupplemental_Arrows_B', - bmp: '\u2900-\u297F' - }, - { - name: 'InSupplemental_Arrows_C', - astral: '\uD83E[\uDC00-\uDCFF]' - }, - { - name: 'InSupplemental_Mathematical_Operators', - bmp: '\u2A00-\u2AFF' - }, - { - name: 'InSupplemental_Punctuation', - bmp: '\u2E00-\u2E7F' - }, - { - name: 'InSupplemental_Symbols_and_Pictographs', - astral: '\uD83E[\uDD00-\uDDFF]' - }, - { - name: 'InSupplementary_Private_Use_Area_A', - astral: '[\uDB80-\uDBBF][\uDC00-\uDFFF]' - }, - { - name: 'InSupplementary_Private_Use_Area_B', - astral: '[\uDBC0-\uDBFF][\uDC00-\uDFFF]' - }, - { - name: 'InSutton_SignWriting', - astral: '\uD836[\uDC00-\uDEAF]' - }, - { - name: 'InSyloti_Nagri', - bmp: '\uA800-\uA82F' - }, - { - name: 'InSyriac', - bmp: '\u0700-\u074F' - }, - { - name: 'InTagalog', - bmp: '\u1700-\u171F' - }, - { - name: 'InTagbanwa', - bmp: '\u1760-\u177F' - }, - { - name: 'InTags', - astral: '\uDB40[\uDC00-\uDC7F]' - }, - { - name: 'InTai_Le', - bmp: '\u1950-\u197F' - }, - { - name: 'InTai_Tham', - bmp: '\u1A20-\u1AAF' - }, - { - name: 'InTai_Viet', - bmp: '\uAA80-\uAADF' - }, - { - name: 'InTai_Xuan_Jing_Symbols', - astral: '\uD834[\uDF00-\uDF5F]' - }, - { - name: 'InTakri', - astral: '\uD805[\uDE80-\uDECF]' - }, - { - name: 'InTamil', - bmp: '\u0B80-\u0BFF' - }, - { - name: 'InTangut', - astral: '[\uD81C-\uD821][\uDC00-\uDFFF]' - }, - { - name: 'InTangut_Components', - astral: '\uD822[\uDC00-\uDEFF]' - }, - { - name: 'InTelugu', - bmp: '\u0C00-\u0C7F' - }, - { - name: 'InThaana', - bmp: '\u0780-\u07BF' - }, - { - name: 'InThai', - bmp: '\u0E00-\u0E7F' - }, - { - name: 'InTibetan', - bmp: '\u0F00-\u0FFF' - }, - { - name: 'InTifinagh', - bmp: '\u2D30-\u2D7F' - }, - { - name: 'InTirhuta', - astral: '\uD805[\uDC80-\uDCDF]' - }, - { - name: 'InTransport_and_Map_Symbols', - astral: '\uD83D[\uDE80-\uDEFF]' - }, - { - name: 'InUgaritic', - astral: '\uD800[\uDF80-\uDF9F]' - }, - { - name: 'InUnified_Canadian_Aboriginal_Syllabics', - bmp: '\u1400-\u167F' - }, - { - name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended', - bmp: '\u18B0-\u18FF' - }, - { - name: 'InVai', - bmp: '\uA500-\uA63F' - }, - { - name: 'InVariation_Selectors', - bmp: '\uFE00-\uFE0F' - }, - { - name: 'InVariation_Selectors_Supplement', - astral: '\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'InVedic_Extensions', - bmp: '\u1CD0-\u1CFF' - }, - { - name: 'InVertical_Forms', - bmp: '\uFE10-\uFE1F' - }, - { - name: 'InWarang_Citi', - astral: '\uD806[\uDCA0-\uDCFF]' - }, - { - name: 'InYi_Radicals', - bmp: '\uA490-\uA4CF' - }, - { - name: 'InYi_Syllables', - bmp: '\uA000-\uA48F' - }, - { - name: 'InYijing_Hexagram_Symbols', - bmp: '\u4DC0-\u4DFF' - } - ]); - - }; - - }, {}], - 5: [function(require, module, exports) { - /*! - * XRegExp Unicode Categories 3.2.0 - * - * Steven Levithan (c) 2010-2017 MIT License - * Unicode data by Mathias Bynens - */ - - module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See - * category descriptions in UAX #44 . Token - * names are case insensitive, and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ - - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); - } - - XRegExp.addUnicodeData([{ - name: 'C', - alias: 'Other', - isBmpLast: true, - bmp: '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF', - astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]' - }, - { - name: 'Cc', - alias: 'Control', - bmp: '\0-\x1F\x7F-\x9F' - }, - { - name: 'Cf', - alias: 'Format', - bmp: '\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', - astral: '\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]' - }, - { - name: 'Cn', - alias: 'Unassigned', - bmp: '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF', - astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]' - }, - { - name: 'Co', - alias: 'Private_Use', - bmp: '\uE000-\uF8FF', - astral: '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]' - }, - { - name: 'Cs', - alias: 'Surrogate', - bmp: '\uD800-\uDFFF' - }, - { - name: 'L', - alias: 'Letter', - bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Ll', - alias: 'Lowercase_Letter', - bmp: 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', - astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' - }, - { - name: 'Lm', - alias: 'Modifier_Letter', - bmp: '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F', - astral: '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0]' - }, - { - name: 'Lo', - alias: 'Other_Letter', - bmp: '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Lt', - alias: 'Titlecase_Letter', - bmp: '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC' - }, - { - name: 'Lu', - alias: 'Uppercase_Letter', - bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', - astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]' - }, - { - name: 'M', - alias: 'Mark', - bmp: '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDCA-\uDDCC\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'Mc', - alias: 'Spacing_Mark', - bmp: '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF2\u1CF3\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BD-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC', - astral: '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4]|\uD81B[\uDF51-\uDF7E]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]' - }, - { - name: 'Me', - alias: 'Enclosing_Mark', - bmp: '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672' - }, - { - name: 'Mn', - alias: 'Nonspacing_Mark', - bmp: '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D01\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDCA-\uDDCC\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'N', - alias: 'Number', - bmp: '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - astral: '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2]|\uD807[\uDC50-\uDC6C]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83C[\uDD00-\uDD0C]' - }, - { - name: 'Nd', - alias: 'Decimal_Number', - bmp: '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - astral: '\uD801[\uDCA0-\uDCA9]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9]|\uD807[\uDC50-\uDC59]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDD50-\uDD59]' - }, - { - name: 'Nl', - alias: 'Letter_Number', - bmp: '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF', - astral: '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]' - }, - { - name: 'No', - alias: 'Other_Number', - bmp: '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835', - astral: '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C]|\uD81A[\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD83A[\uDCC7-\uDCCF]|\uD83C[\uDD00-\uDD0C]' - }, - { - name: 'P', - alias: 'Punctuation', - bmp: '\x21-\x23\x25-\\x2A\x2C-\x2F\x3A\x3B\\x3F\x40\\x5B-\\x5D\x5F\\x7B\x7D\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65', - astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - name: 'Pc', - alias: 'Connector_Punctuation', - bmp: '\x5F\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' - }, - { - name: 'Pd', - alias: 'Dash_Punctuation', - bmp: '\\x2D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D' - }, - { - name: 'Pe', - alias: 'Close_Punctuation', - bmp: '\\x29\\x5D\x7D\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63' - }, - { - name: 'Pf', - alias: 'Final_Punctuation', - bmp: '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21' - }, - { - name: 'Pi', - alias: 'Initial_Punctuation', - bmp: '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20' - }, - { - name: 'Po', - alias: 'Other_Punctuation', - bmp: '\x21-\x23\x25-\x27\\x2A\x2C\\x2E\x2F\x3A\x3B\\x3F\x40\\x5C\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166D\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43\u2E44\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65', - astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - name: 'Ps', - alias: 'Open_Punctuation', - bmp: '\\x28\\x5B\\x7B\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62' - }, - { - name: 'S', - alias: 'Symbol', - bmp: '\\x24\\x2B\x3C-\x3E\\x5E\x60\\x7C\x7E\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20BE\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD', - astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83B[\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' - }, - { - name: 'Sc', - alias: 'Currency_Symbol', - bmp: '\\x24\xA2-\xA5\u058F\u060B\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BE\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6' - }, - { - name: 'Sk', - alias: 'Modifier_Symbol', - bmp: '\\x5E\x60\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3', - astral: '\uD83C[\uDFFB-\uDFFF]' - }, - { - name: 'Sm', - alias: 'Math_Symbol', - bmp: '\\x2B\x3C-\x3E\\x7C\x7E\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC', - astral: '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]' - }, - { - name: 'So', - alias: 'Other_Symbol', - bmp: '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFDFD\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', - astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' - }, - { - name: 'Z', - alias: 'Separator', - bmp: '\x20\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' - }, - { - name: 'Zl', - alias: 'Line_Separator', - bmp: '\u2028' - }, - { - name: 'Zp', - alias: 'Paragraph_Separator', - bmp: '\u2029' - }, - { - name: 'Zs', - alias: 'Space_Separator', - bmp: '\x20\xA0\u1680\u2000-\u200A\u202F\u205F\u3000' - } - ]); - - }; - - }, {}], - 6: [function(require, module, exports) { - /*! - * XRegExp Unicode Properties 3.2.0 - * - * Steven Levithan (c) 2012-2017 MIT License - * Unicode data by Mathias Bynens - */ - - module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See - * . Following are definitions of these properties from - * UAX #44 : - * - * - Alphabetic - * Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm + - * Lo + Nl + Other_Alphabetic. - * - * - Default_Ignorable_Code_Point - * For programmatic determination of default ignorable code points. New characters that should - * be ignored in rendering (unless explicitly supported) will be assigned in these ranges, - * permitting programs to correctly handle the default rendering of such characters when not - * otherwise supported. - * - * - Lowercase - * Characters with the Lowercase property. Generated from: Ll + Other_Lowercase. - * - * - Noncharacter_Code_Point - * Code points permanently reserved for internal use. - * - * - Uppercase - * Characters with the Uppercase property. Generated from: Lu + Other_Uppercase. - * - * - White_Space - * Spaces, separator characters and other control characters which should be treated by - * programming languages as "white space" for the purpose of parsing elements. - * - * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS - * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are - * included in XRegExp's Unicode Categories and Unicode Scripts addons. - * - * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ - - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Properties'); - } - - var unicodeData = [{ - name: 'ASCII', - bmp: '\0-\x7F' - }, - { - name: 'Alphabetic', - bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0345\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05B0-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0657\u0659-\u065F\u066E-\u06D3\u06D5-\u06DC\u06E1-\u06E8\u06ED-\u06EF\u06FA-\u06FC\u06FF\u0710-\u073F\u074D-\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0817\u081A-\u082C\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08DF\u08E3-\u08E9\u08F0-\u093B\u093D-\u094C\u094E-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD-\u09C4\u09C7\u09C8\u09CB\u09CC\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09F0\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3E-\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A51\u0A59-\u0A5C\u0A5E\u0A70-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD-\u0AC5\u0AC7-\u0AC9\u0ACB\u0ACC\u0AD0\u0AE0-\u0AE3\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D-\u0B44\u0B47\u0B48\u0B4B\u0B4C\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD0\u0BD7\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4C\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCC\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E46\u0E4D\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0ECD\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F71-\u0F81\u0F88-\u0F97\u0F99-\u0FBC\u1000-\u1036\u1038\u103B-\u103F\u1050-\u1062\u1065-\u1068\u106E-\u1086\u108E\u109C\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17C8\u17D7\u17DC\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u1938\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A1B\u1A20-\u1A5E\u1A61-\u1A74\u1AA7\u1B00-\u1B33\u1B35-\u1B43\u1B45-\u1B4B\u1B80-\u1BA9\u1BAC-\u1BAF\u1BBA-\u1BE5\u1BE7-\u1BF1\u1C00-\u1C35\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1D00-\u1DBF\u1DE7-\u1DF4\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA674-\uA67B\uA67F-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA827\uA840-\uA873\uA880-\uA8C3\uA8C5\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA92A\uA930-\uA952\uA960-\uA97C\uA980-\uA9B2\uA9B4-\uA9BF\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA60-\uAA76\uAA7A\uAA7E-\uAABE\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF5\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC45\uDC82-\uDCB8\uDCD0-\uDCE8\uDD00-\uDD32\uDD50-\uDD72\uDD76\uDD80-\uDDBF\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE34\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEE8\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D-\uDF44\uDF47\uDF48\uDF4B\uDF4C\uDF50\uDF57\uDF5D-\uDF63]|\uD805[\uDC00-\uDC41\uDC43-\uDC45\uDC47-\uDC4A\uDC80-\uDCC1\uDCC4\uDCC5\uDCC7\uDD80-\uDDB5\uDDB8-\uDDBE\uDDD8-\uDDDD\uDE00-\uDE3E\uDE40\uDE44\uDE80-\uDEB5\uDF00-\uDF19\uDF1D-\uDF2A]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC3E\uDC40\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF36\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9E]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD47]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Any', - isBmpLast: true, - bmp: '\0-\uFFFF', - astral: '[\uD800-\uDBFF][\uDC00-\uDFFF]' - }, - { - name: 'Default_Ignorable_Code_Point', - bmp: '\xAD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8', - astral: '\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|[\uDB40-\uDB43][\uDC00-\uDFFF]' - }, - { - name: 'Lowercase', - bmp: 'a-z\xAA\xB5\xBA\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02B8\u02C0\u02C1\u02E0-\u02E4\u0345\u0371\u0373\u0377\u037A-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1DBF\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u2071\u207F\u2090-\u209C\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2170-\u217F\u2184\u24D0-\u24E9\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7D\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B-\uA69D\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7F8-\uA7FA\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', - astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' - }, - { - name: 'Noncharacter_Code_Point', - bmp: '\uFDD0-\uFDEF\uFFFE\uFFFF', - astral: '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]' - }, - { - name: 'Uppercase', - bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', - astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]' - }, - { - name: 'White_Space', - bmp: '\x09-\x0D\x20\x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' - } - ]; - - // Add non-generated data - unicodeData.push({ - name: 'Assigned', - // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode - // Categories addon is required to use this property - inverseOf: 'Cn' - }); - - XRegExp.addUnicodeData(unicodeData); - - }; - - }, {}], - 7: [function(require, module, exports) { - /*! - * XRegExp Unicode Scripts 3.2.0 - * - * Steven Levithan (c) 2010-2017 MIT License - * Unicode data by Mathias Bynens - */ - - module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive, - * and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ - - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts'); - } - - XRegExp.addUnicodeData([{ - name: 'Adlam', - astral: '\uD83A[\uDD00-\uDD4A\uDD50-\uDD59\uDD5E\uDD5F]' - }, - { - name: 'Ahom', - astral: '\uD805[\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF3F]' - }, - { - name: 'Anatolian_Hieroglyphs', - astral: '\uD811[\uDC00-\uDE46]' - }, - { - name: 'Arabic', - bmp: '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061E\u0620-\u063F\u0641-\u064A\u0656-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC', - astral: '\uD803[\uDE60-\uDE7E]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB\uDEF0\uDEF1]' - }, - { - name: 'Armenian', - bmp: '\u0531-\u0556\u0559-\u055F\u0561-\u0587\u058A\u058D-\u058F\uFB13-\uFB17' - }, - { - name: 'Avestan', - astral: '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]' - }, - { - name: 'Balinese', - bmp: '\u1B00-\u1B4B\u1B50-\u1B7C' - }, - { - name: 'Bamum', - bmp: '\uA6A0-\uA6F7', - astral: '\uD81A[\uDC00-\uDE38]' - }, - { - name: 'Bassa_Vah', - astral: '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]' - }, - { - name: 'Batak', - bmp: '\u1BC0-\u1BF3\u1BFC-\u1BFF' - }, - { - name: 'Bengali', - bmp: '\u0980-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09FB' - }, - { - name: 'Bhaiksuki', - astral: '\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC45\uDC50-\uDC6C]' - }, - { - name: 'Bopomofo', - bmp: '\u02EA\u02EB\u3105-\u312D\u31A0-\u31BA' - }, - { - name: 'Brahmi', - astral: '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]' - }, - { - name: 'Braille', - bmp: '\u2800-\u28FF' - }, - { - name: 'Buginese', - bmp: '\u1A00-\u1A1B\u1A1E\u1A1F' - }, - { - name: 'Buhid', - bmp: '\u1740-\u1753' - }, - { - name: 'Canadian_Aboriginal', - bmp: '\u1400-\u167F\u18B0-\u18F5' - }, - { - name: 'Carian', - astral: '\uD800[\uDEA0-\uDED0]' - }, - { - name: 'Caucasian_Albanian', - astral: '\uD801[\uDD30-\uDD63\uDD6F]' - }, - { - name: 'Chakma', - astral: '\uD804[\uDD00-\uDD34\uDD36-\uDD43]' - }, - { - name: 'Cham', - bmp: '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F' - }, - { - name: 'Cherokee', - bmp: '\u13A0-\u13F5\u13F8-\u13FD\uAB70-\uABBF' - }, - { - name: 'Common', - bmp: '\0-\x40\\x5B-\x60\\x7B-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061C\u061F\u0640\u06DD\u08E2\u0964\u0965\u0E3F\u0FD5-\u0FD8\u10FB\u16EB-\u16ED\u1735\u1736\u1802\u1803\u1805\u1CD3\u1CE1\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u2000-\u200B\u200E-\u2064\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BE\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189-\u218B\u2190-\u23FE\u2400-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2E00-\u2E44\u2FF0-\u2FFB\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303C-\u303F\u309B\u309C\u30A0\u30FB\u30FC\u3190-\u319F\u31C0-\u31E3\u3220-\u325F\u327F-\u32CF\u3358-\u33FF\u4DC0-\u4DFF\uA700-\uA721\uA788-\uA78A\uA830-\uA839\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD', - astral: '\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDF00-\uDF56\uDF60-\uDF71]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDFCB\uDFCE-\uDFFF]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]|\uDB40[\uDC01\uDC20-\uDC7F]' - }, - { - name: 'Coptic', - bmp: '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF' - }, - { - name: 'Cuneiform', - astral: '\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74\uDC80-\uDD43]' - }, - { - name: 'Cypriot', - astral: '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]' - }, - { - name: 'Cyrillic', - bmp: '\u0400-\u0484\u0487-\u052F\u1C80-\u1C88\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F' - }, - { - name: 'Deseret', - astral: '\uD801[\uDC00-\uDC4F]' - }, - { - name: 'Devanagari', - bmp: '\u0900-\u0950\u0953-\u0963\u0966-\u097F\uA8E0-\uA8FD' - }, - { - name: 'Duployan', - astral: '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]' - }, - { - name: 'Egyptian_Hieroglyphs', - astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]' - }, - { - name: 'Elbasan', - astral: '\uD801[\uDD00-\uDD27]' - }, - { - name: 'Ethiopic', - bmp: '\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u137C\u1380-\u1399\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E' - }, - { - name: 'Georgian', - bmp: '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u2D00-\u2D25\u2D27\u2D2D' - }, - { - name: 'Glagolitic', - bmp: '\u2C00-\u2C2E\u2C30-\u2C5E', - astral: '\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]' - }, - { - name: 'Gothic', - astral: '\uD800[\uDF30-\uDF4A]' - }, - { - name: 'Grantha', - astral: '\uD804[\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]' - }, - { - name: 'Greek', - bmp: '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65', - astral: '\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45]' - }, - { - name: 'Gujarati', - bmp: '\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AF1\u0AF9' - }, - { - name: 'Gurmukhi', - bmp: '\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75' - }, - { - name: 'Han', - bmp: '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FD5\uF900-\uFA6D\uFA70-\uFAD9', - astral: '[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Hangul', - bmp: '\u1100-\u11FF\u302E\u302F\u3131-\u318E\u3200-\u321E\u3260-\u327E\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' - }, - { - name: 'Hanunoo', - bmp: '\u1720-\u1734' - }, - { - name: 'Hatran', - astral: '\uD802[\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDCFF]' - }, - { - name: 'Hebrew', - bmp: '\u0591-\u05C7\u05D0-\u05EA\u05F0-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F' - }, - { - name: 'Hiragana', - bmp: '\u3041-\u3096\u309D-\u309F', - astral: '\uD82C\uDC01|\uD83C\uDE00' - }, - { - name: 'Imperial_Aramaic', - astral: '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]' - }, - { - name: 'Inherited', - bmp: '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951\u0952\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D', - astral: '\uD800[\uDDFD\uDEE0]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'Inscriptional_Pahlavi', - astral: '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]' - }, - { - name: 'Inscriptional_Parthian', - astral: '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]' - }, - { - name: 'Javanese', - bmp: '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF' - }, - { - name: 'Kaithi', - astral: '\uD804[\uDC80-\uDCC1]' - }, - { - name: 'Kannada', - bmp: '\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2' - }, - { - name: 'Katakana', - bmp: '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D', - astral: '\uD82C\uDC00' - }, - { - name: 'Kayah_Li', - bmp: '\uA900-\uA92D\uA92F' - }, - { - name: 'Kharoshthi', - astral: '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F-\uDE47\uDE50-\uDE58]' - }, - { - name: 'Khmer', - bmp: '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF' - }, - { - name: 'Khojki', - astral: '\uD804[\uDE00-\uDE11\uDE13-\uDE3E]' - }, - { - name: 'Khudawadi', - astral: '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]' - }, - { - name: 'Lao', - bmp: '\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF' - }, - { - name: 'Latin', - bmp: 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A' - }, - { - name: 'Lepcha', - bmp: '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F' - }, - { - name: 'Limbu', - bmp: '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F' - }, - { - name: 'Linear_A', - astral: '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]' - }, - { - name: 'Linear_B', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]' - }, - { - name: 'Lisu', - bmp: '\uA4D0-\uA4FF' - }, - { - name: 'Lycian', - astral: '\uD800[\uDE80-\uDE9C]' - }, - { - name: 'Lydian', - astral: '\uD802[\uDD20-\uDD39\uDD3F]' - }, - { - name: 'Mahajani', - astral: '\uD804[\uDD50-\uDD76]' - }, - { - name: 'Malayalam', - bmp: '\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4F\u0D54-\u0D63\u0D66-\u0D7F' - }, - { - name: 'Mandaic', - bmp: '\u0840-\u085B\u085E' - }, - { - name: 'Manichaean', - astral: '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]' - }, - { - name: 'Marchen', - astral: '\uD807[\uDC70-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]' - }, - { - name: 'Meetei_Mayek', - bmp: '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9' - }, - { - name: 'Mende_Kikakui', - astral: '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]' - }, - { - name: 'Meroitic_Cursive', - astral: '\uD802[\uDDA0-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDDFF]' - }, - { - name: 'Meroitic_Hieroglyphs', - astral: '\uD802[\uDD80-\uDD9F]' - }, - { - name: 'Miao', - astral: '\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]' - }, - { - name: 'Modi', - astral: '\uD805[\uDE00-\uDE44\uDE50-\uDE59]' - }, - { - name: 'Mongolian', - bmp: '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1877\u1880-\u18AA', - astral: '\uD805[\uDE60-\uDE6C]' - }, - { - name: 'Mro', - astral: '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]' - }, - { - name: 'Multani', - astral: '\uD804[\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA9]' - }, - { - name: 'Myanmar', - bmp: '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F' - }, - { - name: 'Nabataean', - astral: '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]' - }, - { - name: 'New_Tai_Lue', - bmp: '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF' - }, - { - name: 'Newa', - astral: '\uD805[\uDC00-\uDC59\uDC5B\uDC5D]' - }, - { - name: 'Nko', - bmp: '\u07C0-\u07FA' - }, - { - name: 'Ogham', - bmp: '\u1680-\u169C' - }, - { - name: 'Ol_Chiki', - bmp: '\u1C50-\u1C7F' - }, - { - name: 'Old_Hungarian', - astral: '\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDCFF]' - }, - { - name: 'Old_Italic', - astral: '\uD800[\uDF00-\uDF23]' - }, - { - name: 'Old_North_Arabian', - astral: '\uD802[\uDE80-\uDE9F]' - }, - { - name: 'Old_Permic', - astral: '\uD800[\uDF50-\uDF7A]' - }, - { - name: 'Old_Persian', - astral: '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]' - }, - { - name: 'Old_South_Arabian', - astral: '\uD802[\uDE60-\uDE7F]' - }, - { - name: 'Old_Turkic', - astral: '\uD803[\uDC00-\uDC48]' - }, - { - name: 'Oriya', - bmp: '\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B77' - }, - { - name: 'Osage', - astral: '\uD801[\uDCB0-\uDCD3\uDCD8-\uDCFB]' - }, - { - name: 'Osmanya', - astral: '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]' - }, - { - name: 'Pahawh_Hmong', - astral: '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]' - }, - { - name: 'Palmyrene', - astral: '\uD802[\uDC60-\uDC7F]' - }, - { - name: 'Pau_Cin_Hau', - astral: '\uD806[\uDEC0-\uDEF8]' - }, - { - name: 'Phags_Pa', - bmp: '\uA840-\uA877' - }, - { - name: 'Phoenician', - astral: '\uD802[\uDD00-\uDD1B\uDD1F]' - }, - { - name: 'Psalter_Pahlavi', - astral: '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]' - }, - { - name: 'Rejang', - bmp: '\uA930-\uA953\uA95F' - }, - { - name: 'Runic', - bmp: '\u16A0-\u16EA\u16EE-\u16F8' - }, - { - name: 'Samaritan', - bmp: '\u0800-\u082D\u0830-\u083E' - }, - { - name: 'Saurashtra', - bmp: '\uA880-\uA8C5\uA8CE-\uA8D9' - }, - { - name: 'Sharada', - astral: '\uD804[\uDD80-\uDDCD\uDDD0-\uDDDF]' - }, - { - name: 'Shavian', - astral: '\uD801[\uDC50-\uDC7F]' - }, - { - name: 'Siddham', - astral: '\uD805[\uDD80-\uDDB5\uDDB8-\uDDDD]' - }, - { - name: 'SignWriting', - astral: '\uD836[\uDC00-\uDE8B\uDE9B-\uDE9F\uDEA1-\uDEAF]' - }, - { - name: 'Sinhala', - bmp: '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4', - astral: '\uD804[\uDDE1-\uDDF4]' - }, - { - name: 'Sora_Sompeng', - astral: '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]' - }, - { - name: 'Sundanese', - bmp: '\u1B80-\u1BBF\u1CC0-\u1CC7' - }, - { - name: 'Syloti_Nagri', - bmp: '\uA800-\uA82B' - }, - { - name: 'Syriac', - bmp: '\u0700-\u070D\u070F-\u074A\u074D-\u074F' - }, - { - name: 'Tagalog', - bmp: '\u1700-\u170C\u170E-\u1714' - }, - { - name: 'Tagbanwa', - bmp: '\u1760-\u176C\u176E-\u1770\u1772\u1773' - }, - { - name: 'Tai_Le', - bmp: '\u1950-\u196D\u1970-\u1974' - }, - { - name: 'Tai_Tham', - bmp: '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD' - }, - { - name: 'Tai_Viet', - bmp: '\uAA80-\uAAC2\uAADB-\uAADF' - }, - { - name: 'Takri', - astral: '\uD805[\uDE80-\uDEB7\uDEC0-\uDEC9]' - }, - { - name: 'Tamil', - bmp: '\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BFA' - }, - { - name: 'Tangut', - astral: '\uD81B\uDFE0|[\uD81C-\uD820][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]' - }, - { - name: 'Telugu', - bmp: '\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F' - }, - { - name: 'Thaana', - bmp: '\u0780-\u07B1' - }, - { - name: 'Thai', - bmp: '\u0E01-\u0E3A\u0E40-\u0E5B' - }, - { - name: 'Tibetan', - bmp: '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA' - }, - { - name: 'Tifinagh', - bmp: '\u2D30-\u2D67\u2D6F\u2D70\u2D7F' - }, - { - name: 'Tirhuta', - astral: '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]' - }, - { - name: 'Ugaritic', - astral: '\uD800[\uDF80-\uDF9D\uDF9F]' - }, - { - name: 'Vai', - bmp: '\uA500-\uA62B' - }, - { - name: 'Warang_Citi', - astral: '\uD806[\uDCA0-\uDCF2\uDCFF]' - }, - { - name: 'Yi', - bmp: '\uA000-\uA48C\uA490-\uA4C6' - } - ]); - - }; - - }, {}], - 8: [function(require, module, exports) { - var XRegExp = require('./xregexp'); - - require('./addons/build')(XRegExp); - require('./addons/matchrecursive')(XRegExp); - require('./addons/unicode-base')(XRegExp); - require('./addons/unicode-blocks')(XRegExp); - require('./addons/unicode-categories')(XRegExp); - require('./addons/unicode-properties')(XRegExp); - require('./addons/unicode-scripts')(XRegExp); - - module.exports = XRegExp; - - }, { - "./addons/build": 1, - "./addons/matchrecursive": 2, - "./addons/unicode-base": 3, - "./addons/unicode-blocks": 4, - "./addons/unicode-categories": 5, - "./addons/unicode-properties": 6, - "./addons/unicode-scripts": 7, - "./xregexp": 9 - }], - 9: [function(require, module, exports) { - /*! - * XRegExp 3.2.0 - * - * Steven Levithan (c) 2007-2017 MIT License - */ - - 'use strict'; - - /** - * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and - * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to - * make your client-side grepping simpler and more powerful, while freeing you from related - * cross-browser inconsistencies. - */ - - // ==--------------------------== - // Private stuff - // ==--------------------------== - - // Property name used for extended regex instance data - var REGEX_DATA = 'xregexp'; - // Optional features that can be installed and uninstalled - var features = { - astral: false, - natives: false - }; - // Native methods to use and restore ('native' is an ES3 reserved keyword) - var nativ = { - exec: RegExp.prototype.exec, - test: RegExp.prototype.test, - match: String.prototype.match, - replace: String.prototype.replace, - split: String.prototype.split - }; - // Storage for fixed/extended native methods - var fixed = {}; - // Storage for regexes cached by `XRegExp.cache` - var regexCache = {}; - // Storage for pattern details cached by the `XRegExp` constructor - var patternCache = {}; - // Storage for regex syntax tokens added internally or by `XRegExp.addToken` - var tokens = []; - // Token scopes - var defaultScope = 'default'; - var classScope = 'class'; - // Regexes that match native regex syntax, including octals - var nativeTokens = { - // Any native multicharacter token in default scope, or any single character - 'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, - // Any native multicharacter token in character class scope, or any single character - 'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ - }; - // Any backreference or dollar-prefixed character in replacement strings - var replacementToken = /\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g; - // Check for correct `exec` handling of nonparticipating capturing groups - var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined; - // Check for ES6 `flags` prop support - var hasFlagsProp = /x/.flags !== undefined; - // Shortcut to `Object.prototype.toString` - var toString = {}.toString; - - function hasNativeFlag(flag) { - // Can't check based on the presence of properties/getters since browsers might support such - // properties even when they don't support the corresponding flag in regex construction (tested - // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u` - // throws an error) - var isSupported = true; - try { - // Can't use regex literals for testing even in a `try` because regex literals with - // unsupported flags cause a compilation error in IE - new RegExp('', flag); - } catch (exception) { - isSupported = false; - } - return isSupported; - } - // Check for ES6 `u` flag support - var hasNativeU = hasNativeFlag('u'); - // Check for ES6 `y` flag support - var hasNativeY = hasNativeFlag('y'); - // Tracker for known flags, including addon flags - var registeredFlags = { - g: true, - i: true, - m: true, - u: hasNativeU, - y: hasNativeY - }; - - /** - * Attaches extended data and `XRegExp.prototype` properties to a regex object. - * - * @private - * @param {RegExp} regex Regex to augment. - * @param {Array} captureNames Array with capture names, or `null`. - * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A. - * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A. - * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal - * operations, and never exposed to users. For internal-only regexes, we can improve perf by - * skipping some operations like attaching `XRegExp.prototype` properties. - * @returns {RegExp} Augmented regex. - */ - function augment(regex, captureNames, xSource, xFlags, isInternalOnly) { - var p; - - regex[REGEX_DATA] = { - captureNames: captureNames - }; - - if (isInternalOnly) { - return regex; - } - - // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value - if (regex.__proto__) { - regex.__proto__ = XRegExp.prototype; - } else { - for (p in XRegExp.prototype) { - // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this - // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype` - // extensions exist on `regex.prototype` anyway - regex[p] = XRegExp.prototype[p]; - } - } - - regex[REGEX_DATA].source = xSource; - // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order - regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags; - - return regex; - } - - /** - * Removes any duplicate characters from the provided string. - * - * @private - * @param {String} str String to remove duplicate characters from. - * @returns {String} String with any duplicate characters removed. - */ - function clipDuplicates(str) { - return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, ''); - } - - /** - * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype` - * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing - * flags g and y while copying the regex. - * - * @private - * @param {RegExp} regex Regex to copy. - * @param {Object} [options] Options object with optional properties: - * - `addG` {Boolean} Add flag g while copying the regex. - * - `addY` {Boolean} Add flag y while copying the regex. - * - `removeG` {Boolean} Remove flag g while copying the regex. - * - `removeY` {Boolean} Remove flag y while copying the regex. - * - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal - * operations, and never exposed to users. For internal-only regexes, we can improve perf by - * skipping some operations like attaching `XRegExp.prototype` properties. - * - `source` {String} Overrides `.source`, for special cases. - * @returns {RegExp} Copy of the provided regex, possibly with modified flags. - */ - function copyRegex(regex, options) { - if (!XRegExp.isRegExp(regex)) { - throw new TypeError('Type RegExp expected'); - } - - var xData = regex[REGEX_DATA] || {}; - var flags = getNativeFlags(regex); - var flagsToAdd = ''; - var flagsToRemove = ''; - var xregexpSource = null; - var xregexpFlags = null; - - options = options || {}; - - if (options.removeG) { - flagsToRemove += 'g'; - } - if (options.removeY) { - flagsToRemove += 'y'; - } - if (flagsToRemove) { - flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), ''); - } - - if (options.addG) { - flagsToAdd += 'g'; - } - if (options.addY) { - flagsToAdd += 'y'; - } - if (flagsToAdd) { - flags = clipDuplicates(flags + flagsToAdd); - } - - if (!options.isInternalOnly) { - if (xData.source !== undefined) { - xregexpSource = xData.source; - } - // null or undefined; don't want to add to `flags` if the previous value was null, since - // that indicates we're not tracking original precompilation flags - if (xData.flags != null) { - // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never - // removed for non-internal regexes, so don't need to handle it - xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags; - } - } - - // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid - // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and - // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the - // translation to native regex syntax - regex = augment( - new RegExp(options.source || regex.source, flags), - hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, - xregexpSource, - xregexpFlags, - options.isInternalOnly - ); - - return regex; - } - - /** - * Converts hexadecimal to decimal. - * - * @private - * @param {String} hex - * @returns {Number} - */ - function dec(hex) { - return parseInt(hex, 16); - } - - /** - * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an - * inline comment or whitespace with flag x. This is used directly as a token handler function - * passed to `XRegExp.addToken`. - * - * @private - * @param {String} match Match arg of `XRegExp.addToken` handler - * @param {String} scope Scope arg of `XRegExp.addToken` handler - * @param {String} flags Flags arg of `XRegExp.addToken` handler - * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match. - */ - function getContextualTokenSeparator(match, scope, flags) { - if ( - // No need to separate tokens if at the beginning or end of a group - match.input.charAt(match.index - 1) === '(' || - match.input.charAt(match.index + match[0].length) === ')' || - // Avoid separating tokens when the following token is a quantifier - isPatternNext(match.input, match.index + match[0].length, flags, '[?*+]|{\\d+(?:,\\d*)?}') - ) { - return ''; - } - // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`. - // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax - // error `(? :` into `(?:`. - return '(?:)'; - } - - /** - * Returns native `RegExp` flags used by a regex object. - * - * @private - * @param {RegExp} regex Regex to check. - * @returns {String} Native flags in use. - */ - function getNativeFlags(regex) { - return hasFlagsProp ? - regex.flags : - // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation - // with an empty string) allows this to continue working predictably when - // `XRegExp.proptotype.toString` is overridden - nativ.exec.call(/\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1]; - } - - /** - * Determines whether a regex has extended instance data used to track capture names. - * - * @private - * @param {RegExp} regex Regex to check. - * @returns {Boolean} Whether the regex uses named capture. - */ - function hasNamedCapture(regex) { - return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); - } - - /** - * Converts decimal to hexadecimal. - * - * @private - * @param {Number|String} dec - * @returns {String} - */ - function hex(dec) { - return parseInt(dec, 10).toString(16); - } - - /** - * Returns the first index at which a given value can be found in an array. - * - * @private - * @param {Array} array Array to search. - * @param {*} value Value to locate in the array. - * @returns {Number} Zero-based index at which the item is found, or -1. - */ - function indexOf(array, value) { - var len = array.length; - var i; - - for (i = 0; i < len; ++i) { - if (array[i] === value) { - return i; - } - } - - return -1; - } - - /** - * Checks whether the next nonignorable token after the specified position matches the - * `needlePattern` - * - * @private - * @param {String} pattern Pattern to search within. - * @param {Number} pos Index in `pattern` to search at. - * @param {String} flags Flags used by the pattern. - * @param {String} needlePattern Pattern to match the next token against. - * @returns {Boolean} Whether the next nonignorable token matches `needlePattern` - */ - function isPatternNext(pattern, pos, flags, needlePattern) { - var inlineCommentPattern = '\\(\\?#[^)]*\\)'; - var lineCommentPattern = '#[^#\\n]*'; - var patternsToIgnore = flags.indexOf('x') > -1 ? - // Ignore any leading whitespace, line comments, and inline comments - ['\\s', lineCommentPattern, inlineCommentPattern] : - // Ignore any leading inline comments - [inlineCommentPattern]; - return nativ.test.call( - new RegExp('^(?:' + patternsToIgnore.join('|') + ')*(?:' + needlePattern + ')'), - pattern.slice(pos) - ); - } - - /** - * Determines whether a value is of the specified type, by resolving its internal [[Class]]. - * - * @private - * @param {*} value Object to check. - * @param {String} type Type to check for, in TitleCase. - * @returns {Boolean} Whether the object matches the type. - */ - function isType(value, type) { - return toString.call(value) === '[object ' + type + ']'; - } - - /** - * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values. - * - * @private - * @param {String} str - * @returns {String} - */ - function pad4(str) { - while (str.length < 4) { - str = '0' + str; - } - return str; - } - - /** - * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads - * the flag preparation logic from the `XRegExp` constructor. - * - * @private - * @param {String} pattern Regex pattern, possibly with a leading mode modifier. - * @param {String} flags Any combination of flags. - * @returns {Object} Object with properties `pattern` and `flags`. - */ - function prepareFlags(pattern, flags) { - var i; - - // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags - if (clipDuplicates(flags) !== flags) { - throw new SyntaxError('Invalid duplicate regex flag ' + flags); - } - - // Strip and apply a leading mode modifier with any combination of flags except g or y - pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function($0, $1) { - if (nativ.test.call(/[gy]/, $1)) { - throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0); - } - // Allow duplicate flags within the mode modifier - flags = clipDuplicates(flags + $1); - return ''; - }); - - // Throw on unknown native or nonnative flags - for (i = 0; i < flags.length; ++i) { - if (!registeredFlags[flags.charAt(i)]) { - throw new SyntaxError('Unknown regex flag ' + flags.charAt(i)); - } - } - - return { - pattern: pattern, - flags: flags - }; - } - - /** - * Prepares an options object from the given value. - * - * @private - * @param {String|Object} value Value to convert to an options object. - * @returns {Object} Options object. - */ - function prepareOptions(value) { - var options = {}; - - if (isType(value, 'String')) { - XRegExp.forEach(value, /[^\s,]+/, function(match) { - options[match] = true; - }); - - return options; - } - - return value; - } - - /** - * Registers a flag so it doesn't throw an 'unknown flag' error. - * - * @private - * @param {String} flag Single-character flag to register. - */ - function registerFlag(flag) { - if (!/^[\w$]$/.test(flag)) { - throw new Error('Flag must be a single character A-Za-z0-9_$'); - } - - registeredFlags[flag] = true; - } - - /** - * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified - * position, until a match is found. - * - * @private - * @param {String} pattern Original pattern from which an XRegExp object is being built. - * @param {String} flags Flags being used to construct the regex. - * @param {Number} pos Position to search for tokens within `pattern`. - * @param {Number} scope Regex scope to apply: 'default' or 'class'. - * @param {Object} context Context object to use for token handler functions. - * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`. - */ - function runTokens(pattern, flags, pos, scope, context) { - var i = tokens.length; - var leadChar = pattern.charAt(pos); - var result = null; - var match; - var t; - - // Run in reverse insertion order - while (i--) { - t = tokens[i]; - if ( - (t.leadChar && t.leadChar !== leadChar) || - (t.scope !== scope && t.scope !== 'all') || - (t.flag && flags.indexOf(t.flag) === -1) - ) { - continue; - } - - match = XRegExp.exec(pattern, t.regex, pos, 'sticky'); - if (match) { - result = { - matchLength: match[0].length, - output: t.handler.call(context, match, scope, flags), - reparse: t.reparse - }; - // Finished with token tests - break; - } - } - - return result; - } - - /** - * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to - * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if - * the Unicode Base addon is not available, since flag A is registered by that addon. - * - * @private - * @param {Boolean} on `true` to enable; `false` to disable. - */ - function setAstral(on) { - features.astral = on; - } - - /** - * Enables or disables native method overrides. - * - * @private - * @param {Boolean} on `true` to enable; `false` to disable. - */ - function setNatives(on) { - RegExp.prototype.exec = (on ? fixed : nativ).exec; - RegExp.prototype.test = (on ? fixed : nativ).test; - String.prototype.match = (on ? fixed : nativ).match; - String.prototype.replace = (on ? fixed : nativ).replace; - String.prototype.split = (on ? fixed : nativ).split; - - features.natives = on; - } - - /** - * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow - * the ES5 abstract operation `ToObject`. - * - * @private - * @param {*} value Object to check and return. - * @returns {*} The provided object. - */ - function toObject(value) { - // null or undefined - if (value == null) { - throw new TypeError('Cannot convert null or undefined to object'); - } - - return value; - } - - // ==--------------------------== - // Constructor - // ==--------------------------== - - /** - * Creates an extended regular expression object for matching text with a pattern. Differs from a - * native regular expression in that additional syntax and flags are supported. The returned object - * is in fact a native `RegExp` and works with all native methods. - * - * @class XRegExp - * @constructor - * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy. - * @param {String} [flags] Any combination of flags. - * Native flags: - * - `g` - global - * - `i` - ignore case - * - `m` - multiline anchors - * - `u` - unicode (ES6) - * - `y` - sticky (Firefox 3+, ES6) - * Additional XRegExp flags: - * - `n` - explicit capture - * - `s` - dot matches all (aka singleline) - * - `x` - free-spacing and line comments (aka extended) - * - `A` - astral (requires the Unicode Base addon) - * Flags cannot be provided when constructing one `RegExp` from another. - * @returns {RegExp} Extended regular expression object. - * @example - * - * // With named capture and flag x - * XRegExp('(? [0-9]{4} ) -? # year \n\ - * (? [0-9]{2} ) -? # month \n\ - * (? [0-9]{2} ) # day ', 'x'); - * - * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp) - * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and - * // have fresh `lastIndex` properties (set to zero). - * XRegExp(/regex/); - */ - function XRegExp(pattern, flags) { - if (XRegExp.isRegExp(pattern)) { - if (flags !== undefined) { - throw new TypeError('Cannot supply flags when copying a RegExp'); - } - return copyRegex(pattern); - } - - // Copy the argument behavior of `RegExp` - pattern = pattern === undefined ? '' : String(pattern); - flags = flags === undefined ? '' : String(flags); - - if (XRegExp.isInstalled('astral') && flags.indexOf('A') === -1) { - // This causes an error to be thrown if the Unicode Base addon is not available - flags += 'A'; - } - - if (!patternCache[pattern]) { - patternCache[pattern] = {}; - } - - if (!patternCache[pattern][flags]) { - var context = { - hasNamedCapture: false, - captureNames: [] - }; - var scope = defaultScope; - var output = ''; - var pos = 0; - var result; - - // Check for flag-related errors, and strip/apply flags in a leading mode modifier - var applied = prepareFlags(pattern, flags); - var appliedPattern = applied.pattern; - var appliedFlags = applied.flags; - - // Use XRegExp's tokens to translate the pattern to a native regex pattern. - // `appliedPattern.length` may change on each iteration if tokens use `reparse` - while (pos < appliedPattern.length) { - do { - // Check for custom tokens at the current position - result = runTokens(appliedPattern, appliedFlags, pos, scope, context); - // If the matched token used the `reparse` option, splice its output into the - // pattern before running tokens again at the same position - if (result && result.reparse) { - appliedPattern = appliedPattern.slice(0, pos) + - result.output + - appliedPattern.slice(pos + result.matchLength); - } - } while (result && result.reparse); - - if (result) { - output += result.output; - pos += (result.matchLength || 1); - } else { - // Get the native token at the current position - var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0]; - output += token; - pos += token.length; - if (token === '[' && scope === defaultScope) { - scope = classScope; - } else if (token === ']' && scope === classScope) { - scope = defaultScope; - } - } - } - - patternCache[pattern][flags] = { - // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty - // groups are sometimes inserted during regex transpilation in order to keep tokens - // separated. However, more than one empty group in a row is never needed. - pattern: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'), - // Strip all but native flags - flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''), - // `context.captureNames` has an item for each capturing group, even if unnamed - captures: context.hasNamedCapture ? context.captureNames : null - }; - } - - var generated = patternCache[pattern][flags]; - return augment( - new RegExp(generated.pattern, generated.flags), - generated.captures, - pattern, - flags - ); - } - - // Add `RegExp.prototype` to the prototype chain - XRegExp.prototype = new RegExp(); - - // ==--------------------------== - // Public properties - // ==--------------------------== - - /** - * The XRegExp version number as a string containing three dot-separated parts. For example, - * '2.0.0-beta-3'. - * - * @static - * @memberOf XRegExp - * @type String - */ - XRegExp.version = '3.2.0'; - - // ==--------------------------== - // Public methods - // ==--------------------------== - - // Intentionally undocumented; used in tests and addons - XRegExp._clipDuplicates = clipDuplicates; - XRegExp._hasNativeFlag = hasNativeFlag; - XRegExp._dec = dec; - XRegExp._hex = hex; - XRegExp._pad4 = pad4; - - /** - * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to - * create XRegExp addons. If more than one token can match the same string, the last added wins. - * - * @memberOf XRegExp - * @param {RegExp} regex Regex object that matches the new token. - * @param {Function} handler Function that returns a new pattern string (using native regex syntax) - * to replace the matched token within all future XRegExp regexes. Has access to persistent - * properties of the regex being built, through `this`. Invoked with three arguments: - * - The match array, with named backreference properties. - * - The regex scope where the match was found: 'default' or 'class'. - * - The flags used by the regex, including any flags in a leading mode modifier. - * The handler function becomes part of the XRegExp construction process, so be careful not to - * construct XRegExps within the function or you will trigger infinite recursion. - * @param {Object} [options] Options object with optional properties: - * - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'. - * - `flag` {String} Single-character flag that triggers the token. This also registers the - * flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used. - * - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are - * not required to trigger the token. This registers the flags, to prevent XRegExp from - * throwing an 'unknown flag' error when any of the flags are used. - * - `reparse` {Boolean} Whether the `handler` function's output should not be treated as - * final, and instead be reparseable by other tokens (including the current token). Allows - * token chaining or deferring. - * - `leadChar` {String} Single character that occurs at the beginning of any successful match - * of the token (not always applicable). This doesn't change the behavior of the token unless - * you provide an erroneous value. However, providing it can increase the token's performance - * since the token can be skipped at any positions where this character doesn't appear. - * @example - * - * // Basic usage: Add \a for the ALERT control code - * XRegExp.addToken( - * /\\a/, - * function() {return '\\x07';}, - * {scope: 'all'} - * ); - * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true - * - * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers. - * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of - * // character classes only) - * XRegExp.addToken( - * /([?*+]|{\d+(?:,\d*)?})(\??)/, - * function(match) {return match[1] + (match[2] ? '' : '?');}, - * {flag: 'U'} - * ); - * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a' - * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa' - */ - XRegExp.addToken = function(regex, handler, options) { - options = options || {}; - var optionalFlags = options.optionalFlags; - var i; - - if (options.flag) { - registerFlag(options.flag); - } - - if (optionalFlags) { - optionalFlags = nativ.split.call(optionalFlags, ''); - for (i = 0; i < optionalFlags.length; ++i) { - registerFlag(optionalFlags[i]); - } - } - - // Add to the private list of syntax tokens - tokens.push({ - regex: copyRegex(regex, { - addG: true, - addY: hasNativeY, - isInternalOnly: true - }), - handler: handler, - scope: options.scope || defaultScope, - flag: options.flag, - reparse: options.reparse, - leadChar: options.leadChar - }); - - // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags - // might now produce different results - XRegExp.cache.flush('patterns'); - }; - - /** - * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with - * the same pattern and flag combination, the cached copy of the regex is returned. - * - * @memberOf XRegExp - * @param {String} pattern Regex pattern string. - * @param {String} [flags] Any combination of XRegExp flags. - * @returns {RegExp} Cached XRegExp object. - * @example - * - * while (match = XRegExp.cache('.', 'gs').exec(str)) { - * // The regex is compiled once only - * } - */ - XRegExp.cache = function(pattern, flags) { - if (!regexCache[pattern]) { - regexCache[pattern] = {}; - } - return regexCache[pattern][flags] || ( - regexCache[pattern][flags] = XRegExp(pattern, flags) - ); - }; - - // Intentionally undocumented; used in tests - XRegExp.cache.flush = function(cacheName) { - if (cacheName === 'patterns') { - // Flush the pattern cache used by the `XRegExp` constructor - patternCache = {}; - } else { - // Flush the regex cache populated by `XRegExp.cache` - regexCache = {}; - } - }; - - /** - * Escapes any regular expression metacharacters, for use when matching literal strings. The result - * can safely be used at any point within a regex that uses any flags. - * - * @memberOf XRegExp - * @param {String} str String to escape. - * @returns {String} String with regex metacharacters escaped. - * @example - * - * XRegExp.escape('Escaped? <.>'); - * // -> 'Escaped\?\ <\.>' - */ - XRegExp.escape = function(str) { - return nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); - }; - - /** - * Executes a regex search in a specified string. Returns a match array or `null`. If the provided - * regex uses named capture, named backreference properties are included on the match array. - * Optional `pos` and `sticky` arguments specify the search start position, and whether the match - * must start at the specified position only. The `lastIndex` property of the provided regex is not - * used, but is updated for compatibility. Also fixes browser bugs compared to the native - * `RegExp.prototype.exec` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Number} [pos=0] Zero-based index at which to start the search. - * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position - * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {Array} Match array with named backreference properties, or `null`. - * @example - * - * // Basic use, with named backreference - * var match = XRegExp.exec('U+2620', XRegExp('U\\+(?[0-9A-F]{4})')); - * match.hex; // -> '2620' - * - * // With pos and sticky, in a loop - * var pos = 2, result = [], match; - * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) { - * result.push(match[1]); - * pos = match.index + match[0].length; - * } - * // result -> ['2', '3', '4'] - */ - XRegExp.exec = function(str, regex, pos, sticky) { - var cacheKey = 'g'; - var addY = false; - var fakeY = false; - var match; - var r2; - - addY = hasNativeY && !!(sticky || (regex.sticky && sticky !== false)); - if (addY) { - cacheKey += 'y'; - } else if (sticky) { - // Simulate sticky matching by appending an empty capture to the original regex. The - // resulting regex will succeed no matter what at the current index (set with `lastIndex`), - // and will not search the rest of the subject string. We'll know that the original regex - // has failed if that last capture is `''` rather than `undefined` (i.e., if that last - // capture participated in the match). - fakeY = true; - cacheKey += 'FakeY'; - } - - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; - - // Shares cached copies with `XRegExp.match`/`replace` - r2 = regex[REGEX_DATA][cacheKey] || ( - regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: true, - addY: addY, - source: fakeY ? regex.source + '|()' : undefined, - removeY: sticky === false, - isInternalOnly: true - }) - ); - - pos = pos || 0; - r2.lastIndex = pos; - - // Fixed `exec` required for `lastIndex` fix, named backreferences, etc. - match = fixed.exec.call(r2, str); - - // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means - // the original regexp failed (see above). - if (fakeY && match && match.pop() === '') { - match = null; - } - - if (regex.global) { - regex.lastIndex = match ? r2.lastIndex : 0; - } - - return match; - }; - - /** - * Executes a provided function once per regex match. Searches always start at the beginning of the - * string and continue until the end, regardless of the state of the regex's `global` property and - * initial `lastIndex`. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Function} callback Function to execute for each match. Invoked with four arguments: - * - The match array, with named backreference properties. - * - The zero-based match index. - * - The string being traversed. - * - The regex object being used to traverse the string. - * @example - * - * // Extracts every other digit from a string - * var evens = []; - * XRegExp.forEach('1a2345', /\d/, function(match, i) { - * if (i % 2) evens.push(+match[0]); - * }); - * // evens -> [2, 4] - */ - XRegExp.forEach = function(str, regex, callback) { - var pos = 0; - var i = -1; - var match; - - while ((match = XRegExp.exec(str, regex, pos))) { - // Because `regex` is provided to `callback`, the function could use the deprecated/ - // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec` - // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop, - // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of - // regexes, mutating the regex will not have any effect on the iteration or matched strings, - // which is a nice side effect that brings extra safety. - callback(match, ++i, str, regex); - - pos = match.index + (match[0].length || 1); - } - }; - - /** - * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with - * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native - * regexes are not recompiled using XRegExp syntax. - * - * @memberOf XRegExp - * @param {RegExp} regex Regex to globalize. - * @returns {RegExp} Copy of the provided regex with flag `g` added. - * @example - * - * var globalCopy = XRegExp.globalize(/regex/); - * globalCopy.global; // -> true - */ - XRegExp.globalize = function(regex) { - return copyRegex(regex, { - addG: true - }); - }; - - /** - * Installs optional features according to the specified options. Can be undone using - * `XRegExp.uninstall`. - * - * @memberOf XRegExp - * @param {Object|String} options Options object or string. - * @example - * - * // With an options object - * XRegExp.install({ - * // Enables support for astral code points in Unicode addons (implicitly sets flag A) - * astral: true, - * - * // DEPRECATED: Overrides native regex methods with fixed/extended versions - * natives: true - * }); - * - * // With an options string - * XRegExp.install('astral natives'); - */ - XRegExp.install = function(options) { - options = prepareOptions(options); - - if (!features.astral && options.astral) { - setAstral(true); - } - - if (!features.natives && options.natives) { - setNatives(true); - } - }; - - /** - * Checks whether an individual optional feature is installed. - * - * @memberOf XRegExp - * @param {String} feature Name of the feature to check. One of: - * - `astral` - * - `natives` - * @returns {Boolean} Whether the feature is installed. - * @example - * - * XRegExp.isInstalled('astral'); - */ - XRegExp.isInstalled = function(feature) { - return !!(features[feature]); - }; - - /** - * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes - * created in another frame, when `instanceof` and `constructor` checks would fail. - * - * @memberOf XRegExp - * @param {*} value Object to check. - * @returns {Boolean} Whether the object is a `RegExp` object. - * @example - * - * XRegExp.isRegExp('string'); // -> false - * XRegExp.isRegExp(/regex/i); // -> true - * XRegExp.isRegExp(RegExp('^', 'm')); // -> true - * XRegExp.isRegExp(XRegExp('(?s).')); // -> true - */ - XRegExp.isRegExp = function(value) { - return toString.call(value) === '[object RegExp]'; - //return isType(value, 'RegExp'); - }; - - /** - * Returns the first matched string, or in global mode, an array containing all matched strings. - * This is essentially a more convenient re-implementation of `String.prototype.match` that gives - * the result types you actually want (string instead of `exec`-style array in match-first mode, - * and an empty array instead of `null` when no matches are found in match-all mode). It also lets - * you override flag g and ignore `lastIndex`, and fixes browser bugs. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to - * return an array of all matched strings. If not explicitly specified and `regex` uses flag g, - * `scope` is 'all'. - * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all - * mode: Array of all matched strings, or an empty array. - * @example - * - * // Match first - * XRegExp.match('abc', /\w/); // -> 'a' - * XRegExp.match('abc', /\w/g, 'one'); // -> 'a' - * XRegExp.match('abc', /x/g, 'one'); // -> null - * - * // Match all - * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c'] - * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c'] - * XRegExp.match('abc', /x/, 'all'); // -> [] - */ - XRegExp.match = function(str, regex, scope) { - var global = (regex.global && scope !== 'one') || scope === 'all'; - var cacheKey = ((global ? 'g' : '') + (regex.sticky ? 'y' : '')) || 'noGY'; - var result; - var r2; - - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; - - // Shares cached copies with `XRegExp.exec`/`replace` - r2 = regex[REGEX_DATA][cacheKey] || ( - regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - }) - ); - - result = nativ.match.call(toObject(str), r2); - - if (regex.global) { - regex.lastIndex = ( - (scope === 'one' && result) ? - // Can't use `r2.lastIndex` since `r2` is nonglobal in this case - (result.index + result[0].length) : 0 - ); - } - - return global ? (result || []) : (result && result[0]); - }; - - /** - * Retrieves the matches from searching a string using a chain of regexes that successively search - * within previous matches. The provided `chain` array can contain regexes and or objects with - * `regex` and `backref` properties. When a backreference is specified, the named or numbered - * backreference is passed forward to the next regex or returned. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {Array} chain Regexes that each search for matches within preceding results. - * @returns {Array} Matches by the last regex in the chain, or an empty array. - * @example - * - * // Basic usage; matches numbers within tags - * XRegExp.matchChain('1 2 3 4 a 56', [ - * XRegExp('(?is).*?'), - * /\d+/ - * ]); - * // -> ['2', '4', '56'] - * - * // Passing forward and returning specific backreferences - * html = 'XRegExp\ - * Google'; - * XRegExp.matchChain(html, [ - * {regex: //i, backref: 1}, - * {regex: XRegExp('(?i)^https?://(?[^/?#]+)'), backref: 'domain'} - * ]); - * // -> ['xregexp.com', 'www.google.com'] - */ - XRegExp.matchChain = function(str, chain) { - return (function recurseChain(values, level) { - var item = chain[level].regex ? chain[level] : { - regex: chain[level] - }; - var matches = []; - - function addMatch(match) { - if (item.backref) { - // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the - // `undefined`s for backreferences to nonparticipating capturing groups. In such - // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw - // the exception, so also check if the backreference is a number that is within the - // bounds of the array. - if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) { - throw new ReferenceError('Backreference to undefined group: ' + item.backref); - } - - matches.push(match[item.backref] || ''); - } else { - matches.push(match[0]); - } - } - - for (var i = 0; i < values.length; ++i) { - XRegExp.forEach(values[i], item.regex, addMatch); - } - - return ((level === chain.length - 1) || !matches.length) ? - matches : - recurseChain(matches, level + 1); - }([str], 0)); - }; - - /** - * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string - * or regex, and the replacement can be a string or a function to be called for each match. To - * perform a global search and replace, use the optional `scope` argument or include flag g if using - * a regex. Replacement strings can use `${n}` for named and numbered backreferences. Replacement - * functions can use named backreferences via `arguments[0].name`. Also fixes browser bugs compared - * to the native `String.prototype.replace` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp|String} search Search pattern to be replaced. - * @param {String|Function} replacement Replacement string or a function invoked to create it. - * Replacement strings can include special replacement syntax: - * - $$ - Inserts a literal $ character. - * - $&, $0 - Inserts the matched substring. - * - $` - Inserts the string that precedes the matched substring (left context). - * - $' - Inserts the string that follows the matched substring (right context). - * - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts - * backreference n/nn. - * - ${n} - Where n is a name or any number of digits that reference an existent capturing - * group, inserts backreference n. - * Replacement functions are invoked with three or more arguments: - * - The matched substring (corresponds to $& above). Named backreferences are accessible as - * properties of this first argument. - * - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above). - * - The zero-based index of the match within the total search string. - * - The total string being searched. - * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not - * explicitly specified and using a regex with flag g, `scope` is 'all'. - * @returns {String} New string with one or all matches replaced. - * @example - * - * // Regex search, using named backreferences in replacement string - * var name = XRegExp('(?\\w+) (?\\w+)'); - * XRegExp.replace('John Smith', name, '${last}, ${first}'); - * // -> 'Smith, John' - * - * // Regex search, using named backreferences in replacement function - * XRegExp.replace('John Smith', name, function(match) { - * return match.last + ', ' + match.first; - * }); - * // -> 'Smith, John' - * - * // String search, with replace-all - * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all'); - * // -> 'XRegExp builds XRegExps' - */ - XRegExp.replace = function(str, search, replacement, scope) { - var isRegex = XRegExp.isRegExp(search); - var global = (search.global && scope !== 'one') || scope === 'all'; - var cacheKey = ((global ? 'g' : '') + (search.sticky ? 'y' : '')) || 'noGY'; - var s2 = search; - var result; - - if (isRegex) { - search[REGEX_DATA] = search[REGEX_DATA] || {}; - - // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s - // `lastIndex` isn't updated *during* replacement iterations - s2 = search[REGEX_DATA][cacheKey] || ( - search[REGEX_DATA][cacheKey] = copyRegex(search, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - }) - ); - } else if (global) { - s2 = new RegExp(XRegExp.escape(String(search)), 'g'); - } - - // Fixed `replace` required for named backreferences, etc. - result = fixed.replace.call(toObject(str), s2, replacement); - - if (isRegex && search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } - - return result; - }; - - /** - * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an - * array of replacement details. Later replacements operate on the output of earlier replacements. - * Replacement details are accepted as an array with a regex or string to search for, the - * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp - * replacement text syntax, which supports named backreference properties via `${name}`. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {Array} replacements Array of replacement detail arrays. - * @returns {String} New string with all replacements. - * @example - * - * str = XRegExp.replaceEach(str, [ - * [XRegExp('(?a)'), 'z${name}'], - * [/b/gi, 'y'], - * [/c/g, 'x', 'one'], // scope 'one' overrides /g - * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g - * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings - * [/f/g, function($0) { - * return $0.toUpperCase(); - * }] - * ]); - */ - XRegExp.replaceEach = function(str, replacements) { - var i; - var r; - - for (i = 0; i < replacements.length; ++i) { - r = replacements[i]; - str = XRegExp.replace(str, r[0], r[1], r[2]); - } - - return str; - }; - - /** - * Splits a string into an array of strings using a regex or string separator. Matches of the - * separator are not included in the result array. However, if `separator` is a regex that contains - * capturing groups, backreferences are spliced into the result each time `separator` is matched. - * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably - * cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to split. - * @param {RegExp|String} separator Regex or string to use for separating the string. - * @param {Number} [limit] Maximum number of items to include in the result array. - * @returns {Array} Array of substrings. - * @example - * - * // Basic use - * XRegExp.split('a b c', ' '); - * // -> ['a', 'b', 'c'] - * - * // With limit - * XRegExp.split('a b c', ' ', 2); - * // -> ['a', 'b'] - * - * // Backreferences in result array - * XRegExp.split('..word1..', /([a-z]+)(\d+)/i); - * // -> ['..', 'word', '1', '..'] - */ - XRegExp.split = function(str, separator, limit) { - return fixed.split.call(toObject(str), separator, limit); - }; - - /** - * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and - * `sticky` arguments specify the search start position, and whether the match must start at the - * specified position only. The `lastIndex` property of the provided regex is not used, but is - * updated for compatibility. Also fixes browser bugs compared to the native - * `RegExp.prototype.test` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Number} [pos=0] Zero-based index at which to start the search. - * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position - * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {Boolean} Whether the regex matched the provided value. - * @example - * - * // Basic use - * XRegExp.test('abc', /c/); // -> true - * - * // With pos and sticky - * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false - * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true - */ - XRegExp.test = function(str, regex, pos, sticky) { - // Do this the easy way :-) - return !!XRegExp.exec(str, regex, pos, sticky); - }; - - /** - * Uninstalls optional features according to the specified options. All optional features start out - * uninstalled, so this is used to undo the actions of `XRegExp.install`. - * - * @memberOf XRegExp - * @param {Object|String} options Options object or string. - * @example - * - * // With an options object - * XRegExp.uninstall({ - * // Disables support for astral code points in Unicode addons - * astral: true, - * - * // DEPRECATED: Restores native regex methods - * natives: true - * }); - * - * // With an options string - * XRegExp.uninstall('astral natives'); - */ - XRegExp.uninstall = function(options) { - options = prepareOptions(options); - - if (features.astral && options.astral) { - setAstral(false); - } - - if (features.natives && options.natives) { - setNatives(false); - } - }; - - /** - * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as - * regex objects or strings. Metacharacters are escaped in patterns provided as strings. - * Backreferences in provided regex objects are automatically renumbered to work correctly within - * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the - * `flags` argument. - * - * @memberOf XRegExp - * @param {Array} patterns Regexes and strings to combine. - * @param {String} [flags] Any combination of XRegExp flags. - * @param {Object} [options] Options object with optional properties: - * - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'. - * @returns {RegExp} Union of the provided regexes and strings. - * @example - * - * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i'); - * // -> /a\+b\*c|(dogs)\1|(cats)\2/i - * - * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'}); - * // -> /manbearpig/i - */ - XRegExp.union = function(patterns, flags, options) { - options = options || {}; - var conjunction = options.conjunction || 'or'; - var numCaptures = 0; - var numPriorCaptures; - var captureNames; - - function rewrite(match, paren, backref) { - var name = captureNames[numCaptures - numPriorCaptures]; - - // Capturing group - if (paren) { - ++numCaptures; - // If the current capture has a name, preserve the name - if (name) { - return '(?<' + name + '>'; - } - // Backreference - } else if (backref) { - // Rewrite the backreference - return '\\' + (+backref + numPriorCaptures); - } - - return match; - } - - if (!(isType(patterns, 'Array') && patterns.length)) { - throw new TypeError('Must provide a nonempty array of patterns to merge'); - } - - var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; - var output = []; - var pattern; - for (var i = 0; i < patterns.length; ++i) { - pattern = patterns[i]; - - if (XRegExp.isRegExp(pattern)) { - numPriorCaptures = numCaptures; - captureNames = (pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames) || []; - - // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are - // independently valid; helps keep this simple. Named captures are put back - output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite)); - } else { - output.push(XRegExp.escape(pattern)); - } - } - - var separator = conjunction === 'none' ? '' : '|'; - return XRegExp(output.join(separator), flags); - }; - - // ==--------------------------== - // Fixed/extended native methods - // ==--------------------------== - - /** - * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `RegExp.prototype.exec`. Calling `XRegExp.install('natives')` uses this to - * override the native method. Use via `XRegExp.exec` without overriding natives. - * - * @memberOf RegExp - * @param {String} str String to search. - * @returns {Array} Match array with named backreference properties, or `null`. - */ - fixed.exec = function(str) { - var origLastIndex = this.lastIndex; - var match = nativ.exec.apply(this, arguments); - var name; - var r2; - var i; - - if (match) { - // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing - // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9 - // in standards mode follows the spec. - if (!correctExecNpcg && match.length > 1 && indexOf(match, '') > -1) { - r2 = copyRegex(this, { - removeG: true, - isInternalOnly: true - }); - // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed - // matching due to characters outside the match - nativ.replace.call(String(str).slice(match.index), r2, function() { - var len = arguments.length; - var i; - // Skip index 0 and the last 2 - for (i = 1; i < len - 2; ++i) { - if (arguments[i] === undefined) { - match[i] = undefined; - } - } - }); - } - - // Attach named capture properties - if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { - // Skip index 0 - for (i = 1; i < match.length; ++i) { - name = this[REGEX_DATA].captureNames[i - 1]; - if (name) { - match[name] = match[i]; - } - } - } - - // Fix browsers that increment `lastIndex` after zero-length matches - if (this.global && !match[0].length && (this.lastIndex > match.index)) { - this.lastIndex = match.index; - } - } - - if (!this.global) { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - this.lastIndex = origLastIndex; - } - - return match; - }; - - /** - * Fixes browser bugs in the native `RegExp.prototype.test`. Calling `XRegExp.install('natives')` - * uses this to override the native method. - * - * @memberOf RegExp - * @param {String} str String to search. - * @returns {Boolean} Whether the regex matched the provided value. - */ - fixed.test = function(str) { - // Do this the easy way :-) - return !!fixed.exec.call(this, str); - }; - - /** - * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `String.prototype.match`. Calling `XRegExp.install('natives')` uses this to - * override the native method. - * - * @memberOf String - * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`. - * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g, - * the result of calling `regex.exec(this)`. - */ - fixed.match = function(regex) { - var result; - - if (!XRegExp.isRegExp(regex)) { - // Use the native `RegExp` rather than `XRegExp` - regex = new RegExp(regex); - } else if (regex.global) { - result = nativ.match.apply(this, arguments); - // Fixes IE bug - regex.lastIndex = 0; - - return result; - } - - return fixed.exec.call(regex, toObject(this)); - }; - - /** - * Adds support for `${n}` tokens for named and numbered backreferences in replacement text, and - * provides named backreferences to replacement functions as `arguments[0].name`. Also fixes browser - * bugs in replacement text syntax when performing a replacement using a nonregex search value, and - * the value of a replacement regex's `lastIndex` property during replacement iterations and upon - * completion. Calling `XRegExp.install('natives')` uses this to override the native method. Note - * that this doesn't support SpiderMonkey's proprietary third (`flags`) argument. Use via - * `XRegExp.replace` without overriding natives. - * - * @memberOf String - * @param {RegExp|String} search Search pattern to be replaced. - * @param {String|Function} replacement Replacement string or a function invoked to create it. - * @returns {String} New string with one or all matches replaced. - */ - fixed.replace = function(search, replacement) { - var isRegex = XRegExp.isRegExp(search); - var origLastIndex; - var captureNames; - var result; - - if (isRegex) { - if (search[REGEX_DATA]) { - captureNames = search[REGEX_DATA].captureNames; - } - // Only needed if `search` is nonglobal - origLastIndex = search.lastIndex; - } else { - search += ''; // Type-convert - } - - // Don't use `typeof`; some older browsers return 'function' for regex objects - if (isType(replacement, 'Function')) { - // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement - // functions isn't type-converted to a string - result = nativ.replace.call(String(this), search, function() { - var args = arguments; - var i; - if (captureNames) { - // Change the `arguments[0]` string primitive to a `String` object that can store - // properties. This really does need to use `String` as a constructor - args[0] = new String(args[0]); - // Store named backreferences on the first argument - for (i = 0; i < captureNames.length; ++i) { - if (captureNames[i]) { - args[0][captureNames[i]] = args[i + 1]; - } - } - } - // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari - // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1) - if (isRegex && search.global) { - search.lastIndex = args[args.length - 2] + args[0].length; - } - // ES6 specs the context for replacement functions as `undefined` - return replacement.apply(undefined, args); - }); - } else { - // Ensure that the last value of `args` will be a string when given nonstring `this`, - // while still throwing on null or undefined context - result = nativ.replace.call(this == null ? this : String(this), search, function() { - // Keep this function's `arguments` available through closure - var args = arguments; - return nativ.replace.call(String(replacement), replacementToken, function($0, $1, $2) { - var n; - // Named or numbered backreference with curly braces - if ($1) { - // XRegExp behavior for `${n}`: - // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the - // entire match. Any number of leading zeros may be used. - // 2. Backreference to named capture `n`, if it exists and is not an integer - // overridden by numbered capture. In practice, this does not overlap with - // numbered capture since XRegExp does not allow named capture to use a bare - // integer as the name. - // 3. If the name or number does not refer to an existing capturing group, it's - // an error. - n = +$1; // Type-convert; drop leading zeros - if (n <= args.length - 3) { - return args[n] || ''; - } - // Groups with the same name is an error, else would need `lastIndexOf` - n = captureNames ? indexOf(captureNames, $1) : -1; - if (n < 0) { - throw new SyntaxError('Backreference to undefined group ' + $0); - } - return args[n + 1] || ''; - } - // Else, special variable or numbered backreference without curly braces - if ($2 === '$') { // $$ - return '$'; - } - if ($2 === '&' || +$2 === 0) { // $&, $0 (not followed by 1-9), $00 - return args[0]; - } - if ($2 === '`') { // $` (left context) - return args[args.length - 1].slice(0, args[args.length - 2]); - } - if ($2 === "'") { // $' (right context) - return args[args.length - 1].slice(args[args.length - 2] + args[0].length); - } - // Else, numbered backreference without curly braces - $2 = +$2; // Type-convert; drop leading zero - // XRegExp behavior for `$n` and `$nn`: - // - Backrefs end after 1 or 2 digits. Use `${..}` for more digits. - // - `$1` is an error if no capturing groups. - // - `$10` is an error if less than 10 capturing groups. Use `${1}0` instead. - // - `$01` is `$1` if at least one capturing group, else it's an error. - // - `$0` (not followed by 1-9) and `$00` are the entire match. - // Native behavior, for comparison: - // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+. - // - `$1` is a literal `$1` if no capturing groups. - // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups. - // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`. - // - `$0` is a literal `$0`. - if (!isNaN($2)) { - if ($2 > args.length - 3) { - throw new SyntaxError('Backreference to undefined group ' + $0); - } - return args[$2] || ''; - } - // `$` followed by an unsupported char is an error, unlike native JS - throw new SyntaxError('Invalid token ' + $0); - }); - }); - } - - if (isRegex) { - if (search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } else { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - search.lastIndex = origLastIndex; - } - } - - return result; - }; - - /** - * Fixes browser bugs in the native `String.prototype.split`. Calling `XRegExp.install('natives')` - * uses this to override the native method. Use via `XRegExp.split` without overriding natives. - * - * @memberOf String - * @param {RegExp|String} separator Regex or string to use for separating the string. - * @param {Number} [limit] Maximum number of items to include in the result array. - * @returns {Array} Array of substrings. - */ - fixed.split = function(separator, limit) { - if (!XRegExp.isRegExp(separator)) { - // Browsers handle nonregex split correctly, so use the faster native method - return nativ.split.apply(this, arguments); - } - - var str = String(this); - var output = []; - var origLastIndex = separator.lastIndex; - var lastLastIndex = 0; - var lastLength; - - // Values for `limit`, per the spec: - // If undefined: pow(2,32) - 1 - // If 0, Infinity, or NaN: 0 - // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32); - // If negative number: pow(2,32) - floor(abs(limit)) - // If other: Type-convert, then use the above rules - // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless - // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+ - limit = (limit === undefined ? -1 : limit) >>> 0; - - XRegExp.forEach(str, separator, function(match) { - // This condition is not the same as `if (match[0].length)` - if ((match.index + match[0].length) > lastLastIndex) { - output.push(str.slice(lastLastIndex, match.index)); - if (match.length > 1 && match.index < str.length) { - Array.prototype.push.apply(output, match.slice(1)); - } - lastLength = match[0].length; - lastLastIndex = match.index + lastLength; - } - }); - - if (lastLastIndex === str.length) { - if (!nativ.test.call(separator, '') || lastLength) { - output.push(''); - } - } else { - output.push(str.slice(lastLastIndex)); - } - - separator.lastIndex = origLastIndex; - return output.length > limit ? output.slice(0, limit) : output; - }; - - // ==--------------------------== - // Built-in syntax/flag tokens - // ==--------------------------== - - /* - * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be - * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser - * consistency and to reserve their syntax, but lets them be superseded by addons. - */ - XRegExp.addToken( - /\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, - function(match, scope) { - // \B is allowed in default scope only - if (match[1] === 'B' && scope === defaultScope) { - return match[0]; - } - throw new SyntaxError('Invalid escape ' + match[0]); - }, { - scope: 'all', - leadChar: '\\' - } - ); - - /* - * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit - * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag - * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to - * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior - * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or - * if you use the same in a character class. - */ - XRegExp.addToken( - /\\u{([\dA-Fa-f]+)}/, - function(match, scope, flags) { - var code = dec(match[1]); - if (code > 0x10FFFF) { - throw new SyntaxError('Invalid Unicode code point ' + match[0]); - } - if (code <= 0xFFFF) { - // Converting to \uNNNN avoids needing to escape the literal character and keep it - // separate from preceding tokens - return '\\u' + pad4(hex(code)); - } - // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling - if (hasNativeU && flags.indexOf('u') > -1) { - return match[0]; - } - throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); - }, { - scope: 'all', - leadChar: '\\' - } - ); - - /* - * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency. - * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because - * character class endings can't be determined. - */ - XRegExp.addToken( - /\[(\^?)\]/, - function(match) { - // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. - // (?!) should work like \b\B, but is unreliable in some versions of Firefox - return match[1] ? '[\\s\\S]' : '\\b\\B'; - }, { - leadChar: '[' - } - ); - - /* - * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in - * free-spacing mode (flag x). - */ - XRegExp.addToken( - /\(\?#[^)]*\)/, - getContextualTokenSeparator, { - leadChar: '(' - } - ); - - /* - * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only. - */ - XRegExp.addToken( - /\s+|#[^\n]*\n?/, - getContextualTokenSeparator, { - flag: 'x' - } - ); - - /* - * Dot, in dotall mode (aka singleline mode, flag s) only. - */ - XRegExp.addToken( - /\./, - function() { - return '[\\s\\S]'; - }, { - flag: 's', - leadChar: '.' - } - ); - - /* - * Named backreference: `\k`. Backreference names can use the characters A-Z, a-z, 0-9, _, - * and $ only. Also allows numbered backreferences as `\k`. - */ - XRegExp.addToken( - /\\k<([\w$]+)>/, - function(match) { - // Groups with the same name is an error, else would need `lastIndexOf` - var index = isNaN(match[1]) ? (indexOf(this.captureNames, match[1]) + 1) : +match[1]; - var endIndex = match.index + match[0].length; - if (!index || index > this.captureNames.length) { - throw new SyntaxError('Backreference to undefined group ' + match[0]); - } - // Keep backreferences separate from subsequent literal numbers. This avoids e.g. - // inadvertedly changing `(?)\k1` to `()\11`. - return '\\' + index + ( - endIndex === match.input.length || isNaN(match.input.charAt(endIndex)) ? - '' : '(?:)' - ); - }, { - leadChar: '\\' - } - ); - - /* - * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0` - * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches - * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax. - */ - XRegExp.addToken( - /\\(\d+)/, - function(match, scope) { - if ( - !( - scope === defaultScope && - /^[1-9]/.test(match[1]) && - +match[1] <= this.captureNames.length - ) && - match[1] !== '0' - ) { - throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + - match[0]); - } - return match[0]; - }, { - scope: 'all', - leadChar: '\\' - } - ); - - /* - * Named capturing group; match the opening delimiter only: `(?`. Capture names can use the - * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style - * `(?P` as an alternate syntax to avoid issues in some older versions of Opera which natively - * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to - * Python-style named capture as octals. - */ - XRegExp.addToken( - /\(\?P?<([\w$]+)>/, - function(match) { - // Disallow bare integers as names because named backreferences are added to match arrays - // and therefore numeric properties may lead to incorrect lookups - if (!isNaN(match[1])) { - throw new SyntaxError('Cannot use integer as capture name ' + match[0]); - } - if (match[1] === 'length' || match[1] === '__proto__') { - throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]); - } - if (indexOf(this.captureNames, match[1]) > -1) { - throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]); - } - this.captureNames.push(match[1]); - this.hasNamedCapture = true; - return '('; - }, { - leadChar: '(' - } - ); - - /* - * Capturing group; match the opening parenthesis only. Required for support of named capturing - * groups. Also adds explicit capture mode (flag n). - */ - XRegExp.addToken( - /\((?!\?)/, - function(match, scope, flags) { - if (flags.indexOf('n') > -1) { - return '(?:'; - } - this.captureNames.push(null); - return '('; - }, { - optionalFlags: 'n', - leadChar: '(' - } - ); - - module.exports = XRegExp; - - }, {}] - }, {}, [8])(8) -}); \ No newline at end of file diff --git a/external-scripts/xregexp-unicode-zotero.js b/external-scripts/xregexp-unicode-zotero.js deleted file mode 100644 index a9400450..00000000 --- a/external-scripts/xregexp-unicode-zotero.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Adds support for various character categories used by Zotero. - * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored. - * @requires XRegExp, Unicode Base - */ - -(function() { - var added = false; - var addZoteroUnicodeData = function(XRegExp) { - if (added) return; - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Zotero'); - } - - XRegExp.addUnicodeData([{ - name: 'WSpace', - alias: 'White_Space', - bmp: '\x09-\x0D\x20\x85\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' - }, - { - name: 'Hex', - alias: 'Hex_Digit', - bmp: '0-9A-Fa-f\uFF10-\uFF19\uFF21-\uFF26\uFF41-\uFF46' - }, - { - name: 'Dash', - bmp: '\x2D\u058A\u05BE\u1806\u2010-\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u301C\u3030\u30A0\uFE31-\uFE32\uFE58\uFE63\uFF0D' - }, - { - name: 'Hyphen', - bmp: '\x2D\xAD\u058A\u1806\u2010-\u2011\u2E17\u30FB\uFE63\uFF0D\uFF65' - }, - { - name: 'QMark', - alias: 'Quotation_Mark', - bmp: '\x22\x27\xAB\xBB\u2018\u2019\u201A\u201B-\u201C\u201D\u201E\u201F\u2039\u203A\u300C\u300D\u300E\u300F\u301D\u301E-\u301F\uFE41\uFE42\uFE43\uFE44\uFF02\uFF07\uFF62\uFF63' - }, - { - name: 'Term', - alias: 'Terminal_Punctuation', - bmp: '\x21\x2C\x2E\x3A-\x3B\x3F\u037E\u0387\u0589\u05C3\u060C\u061B\u061F\u06D4\u0700-\u070A\u070C\u07F8-\u07F9\u0964-\u0965\u0E5A-\u0E5B\u0F08\u0F0D-\u0F12\u104A-\u104B\u1361-\u1368\u166D-\u166E\u16EB-\u16ED\u17D4-\u17D6\u17DA\u1802-\u1805\u1808-\u1809\u1944-\u1945\u1B5A-\u1B5B\u1B5D-\u1B5F\u1C3B-\u1C3F\u1C7E-\u1C7F\u203C-\u203D\u2047-\u2049\u2E2E\u3001-\u3002\uA60D-\uA60F\uA876-\uA877\uA8CE-\uA8CF\uA92F\uAA5D-\uAA5F\uFE50-\uFE52\uFE54-\uFE57\uFF01\uFF0C\uFF0E\uFF1A-\uFF1B\uFF1F\uFF61\uFF64\u1039F\u103D0\u1091F\u12470-\u12473' - } - ]); - added = true; - }; - - if (typeof XRegExp != 'undefined') { - addZoteroUnicodeData(XRegExp) - } else if (typeof Zotero != 'undefined' && Zotero.Utilities && Zotero.Utilities.XRegExp) { - addZoteroUnicodeData(Zotero.Utilities.XRegExp) - } - if (typeof module != 'undefined') { - module.exports = addZoteroUnicodeData; - } - -})(); \ No newline at end of file diff --git a/external-scripts/zotero.js b/external-scripts/zotero.js deleted file mode 100644 index 028da94b..00000000 --- a/external-scripts/zotero.js +++ /dev/null @@ -1,544 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -var Zotero = window.Zotero = new function() { - this.version = "5.0"; - this.locale = navigator.languages[0]; - this.isConnector = true; - this.isFx = false; // Old flag for 4.0 connector, probably not used anymore - /* this.isBookmarklet = SET IN BUILD SCRIPT */ - ; - /* this.allowRepoTranslatorTester = SET IN BUILD SCRIPT */ - ; - - this.initialized = false; - this.initDeferred = {}; - this.initDeferred.promise = new Promise(function(resolve, reject) { - this.initDeferred.resolve = resolve; - this.initDeferred.reject = reject; - }.bind(this)); - - // Safari global page detection - if (typeof globalThis != "undefined" && typeof browser == "undefined") { - this.isSafari = true; - this.isMac = true; - } else { - // Browser check adopted from: - // http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - // Internet Explorer 6-11 - this.isIE = /*@cc_on!@*/ false || !!document.documentMode;; - if (this.isBookmarklet) { - // Firefox 1.0+ - this.isFirefox = typeof InstallTrigger !== 'undefined'; - // Edge 20+ - this.isEdge = !this.isIE && !!window.StyleMedia; - // Chrome and Chromium - this.isChrome = window.navigator.userAgent.indexOf("Chrome") !== -1 || window.navigator.userAgent.indexOf("Chromium") !== -1; - // At least Safari 10+ - this.isSafari = window.navigator.userAgent.includes("Safari") && !this.isChrome; - this.isBrowserExt = this.isFirefox || this.isEdge || this.isChrome; - - this.isMac = (window.navigator.platform.substr(0, 3) == "Mac"); - this.isWin = (window.navigator.platform.substr(0, 3) == "Win"); - this.isLinux = (window.navigator.platform.substr(0, 5) == "Linux"); - } else { - /* this.isFirefox = SET IN BUILD SCRIPT */ - ; - /* this.isSafari = SET IN BUILD SCRIPT */ - ; - // CHANGED: We are a browser extension, no question - this.isBrowserExt = true; - - this.isChrome = this.isEdge = false; - if (this.isBrowserExt && !this.isFirefox) { - if (window.navigator.userAgent.includes("Edg/")) { - this.isEdge = true; - } else { - // If browser ext is not fx or edge then treat it as Chrome - // since it's probably installed with compatible browsers such as Opera from the - // Chrome extension store - this.isChrome = true; - } - } - } - - this.isMac = (window.navigator.platform.substr(0, 3) == "Mac"); - this.isWin = (window.navigator.platform.substr(0, 3) == "Win"); - this.isLinux = (window.navigator.platform.substr(0, 5) == "Linux"); - } - - if (this.isFirefox) { - this.browser = "g"; - this.clientName = 'Firefox'; - } else if (this.isSafari) { - this.browser = "s"; - this.clientName = 'Safari'; - } else if (this.isIE) { - this.browser = "i"; - this.clientName = 'Internet Explorer'; // ? - } else if (this.isEdge) { - this.browser = "c"; - this.clientName = 'Edge'; - } else if (this.isChrome) { - this.browser = "c"; - this.clientName = 'Chrome'; - } else { - // Assume this is something with no more capabilities than IE - this.browser = "i"; - this.clientName = window.navigator.appName; - } - this.appName = `${ZOTERO_CONFIG.CLIENT_NAME} Connector for ${this.clientName}`; - - if (!this.isBookmarklet) { - if (this.isBrowserExt) { - // CHANGED: Version hard coded (not sure why) - this.version = "5.0.0"; - } - } - - // window.Promise and Promise differ (somehow) in Firefox and when certain - // async promise resolution conditions arise upon calling Zotero.Promise.all().then(result => ) - // somehow the result array doesn't properly have result[1] bound, even though - // Array.from(result)[1] is there. Magic of code. - // this.Promise = window.Promise; - this.Promise = Promise; - - this.migrate = async function() { - let lastVersion = Zotero.Prefs.get('lastVersion') || Zotero.version; - var [major, minor, patch] = lastVersion.split('.'); - Zotero.Prefs.set('lastVersion', Zotero.version); - // If coming from a version before 5.0.24, reset the - // auto-associate setting for all existing proxies, since it wasn't being set properly for - // proxies imported from the client - if (major == 5 && minor == 0 && patch < 24 && Zotero.Prefs.get('proxies.clientChecked')) { - for (let proxy of Zotero.Proxies.proxies) { - proxy.autoAssociate = true; - } - Zotero.Proxies.storeProxies(); - } - if (major == 5 && minor == 0 && patch < 32 && Zotero.Proxies.proxies.length > 1) { - let pairs = []; - // merge pairs of proxies with http and https protocols - for (let i = 0; i < Zotero.Proxies.proxies.length; i++) { - if (Zotero.Proxies.length == i + 1) break; - let proxy1 = Zotero.Proxies.proxies[i]; - let scheme = proxy1.scheme.replace('https', '').replace('http', ''); - for (let j = i + 1; j < Zotero.Proxies.proxies.length; j++) { - let proxy2 = Zotero.Proxies.proxies[j]; - if (scheme == proxy2.scheme.replace('https', '').replace('http', '')) { - pairs.push([proxy1, proxy2]); - break; - } - } - } - for (let [proxy1, proxy2] of pairs) { - let json = proxy1.toJSON(); - delete json.id; - let proxy = new Zotero.Proxy(json); - proxy.dotsToHyphens = true; - proxy.hosts = proxy1.hosts.concat(proxy2.hosts); - proxy.scheme = proxy.scheme.replace('http://', '').replace('https://', ''); - Zotero.Proxies.remove(proxy1); - Zotero.Proxies.remove(proxy2); - Zotero.Proxies.save(proxy); - } - // remove protocols of single protocolless - for (let proxy of Zotero.Proxies.proxies) { - if (proxy.scheme.includes('://')) { - proxy.scheme = proxy.scheme.substr(proxy.scheme.indexOf('://') + 3); - proxy.compileRegexp(); - Zotero.Proxies.save(proxy); - } - } - } - // Botched dotsToHyphen pref migration to protocolless schemes in 5.0.32 - if (major == 5 && minor == 0 && patch < 35) { - for (let proxy of Zotero.Proxies.proxies) { - if (proxy.scheme.indexOf('%h') == 0) { - proxy.dotsToHyphens = true; - } - } - Zotero.Proxies.storeProxies(); - } - // Skip first-use dialog for existing users when enabled for non-Firefox browsers - if (major == 5 && minor == 0 && patch < 87 && !this.isFirefox) { - Zotero.Prefs.set('firstUse', false); - } - }; - - /** - * Initializes Zotero services for the global page in Chrome or Safari - */ - this.initGlobal = async function() { - Zotero.isBackground = true; - - if (Zotero.isBrowserExt) { - browser.runtime.getPlatformInfo().then(function(info) { - switch (info.os) { - case 'mac': - case 'win': - this.platform = info.os; - break; - - default: - this.platform = 'unix'; - } - }.bind(this)); - } else if (Zotero.isSafari) { - this.platform = 'mac'; - } else { - // IE and the likes? Who knows - this.platform = 'win'; - } - - // Add browser version info - if (this.isFirefox) { - browser.runtime.getBrowserInfo().then(info => { - this.browserVersion = info.version; - this.browserMajorVersion = parseInt(info.version.match(/^[0-9]+/)[0]); - }); - } - - Zotero.Messaging.init(); - if (Zotero.isSafari) { - this.version = await Zotero.Connector_Browser.getExtensionVersion(); - window.safari = { - extension: { - baseURI: await Zotero.Messaging.sendMessage('Swift.getBaseURI') - } - }; - } - Zotero.Connector_Types.init(); - await Zotero.Prefs.init(); - - Zotero.Debug.init(); - if (Zotero.isBrowserExt) { - Zotero.WebRequestIntercept.init(); - } - if (!Zotero.isBookmarklet) { - await Zotero.i18n.init(); - Zotero.Repo.init(); - Zotero.Proxies.init(); - } - if (Zotero.isBrowserExt) { - await Zotero.GoogleDocsPluginManager.init(); - } - let xhr = await Zotero.HTTP.request('GET', Zotero.getExtensionURL('utilities/resource/dateFormats.json'), { - responseType: 'json' - }); - Zotero.Date.init(xhr.response); - Zotero.initDeferred.resolve(); - Zotero.initialized = true; - - await Zotero.migrate(); - }; - - /** - * Initializes Zotero services for injected pages and the inject side of the bookmarklet - */ - this.initInject = async function() { - Zotero.isInject = true; - Zotero.Messaging.init(); - if (Zotero.isSafari) { - await Zotero.i18n.init(); - } - if (!Zotero.isBookmarklet) { - //Zotero.ConnectorIntegration.init(); - } - Zotero.Connector_Types.init(); - Zotero.Schema.init(); - let xhr = await Zotero.HTTP.request('GET', Zotero.getExtensionURL('utilities/resource/dateFormats.json'), { - responseType: 'json' - }); - Zotero.Date.init(xhr.response); - Zotero.Prefs.loadNamespace(['translators.', 'downloadAssociatedFiles', 'automaticSnapshots', - 'reportTranslationFailure', 'capitalizeTitles' - ]); - await Zotero.Prefs.loadNamespace('debug'); - - Zotero.Debug.init(); - Zotero.initDeferred.resolve(); - Zotero.initialized = true; - }; - - - /** - * Get versions, platform, etc. - */ - this.getSystemInfo = async function() { - var info; - if (Zotero.isSafari && Zotero.isBackground) { - info = { - connector: "true", - version: this.version, - platform: "Safari App Extension", - }; - } else { - info = { - connector: "true", - version: this.version, - platform: navigator.platform, - locale: navigator.language, - userAgent: navigator.userAgent - }; - } - - info.appName = Zotero.appName; - info.zoteroAvailable = !!(await Zotero.Connector.checkIsOnline()); - - var str = ''; - for (var key in info) { - str += key + ' => ' + info[key] + ', '; - } - if (Zotero.isBackground && Zotero.isChrome) { - let granted = await browser.permissions.contains({ - permissions: ['management'] - }); - if (granted) { - str += 'extensions => '; - let extensions = await browser.management.getAll(); - for (let extension of extensions) { - if (!extension.enabled || extension.name == Zotero.appName) continue; - str += `${extension.name} (${extension.version}, ${extension.type}), `; - } - } - } - str = str.substr(0, str.length - 2); - return str; - }; - - /** - * Writes a line to the debug console - */ - this.debug = function(message, level) { - Zotero.Debug.log(message, level); - }; - - this.logError = function(err) { - if (!window.console) return; - - // Firefox uses this - var fileName = (err.fileName ? err.fileName : null); - var lineNumber = (err.lineNumber ? err.lineNumber : null); - - // Safari uses this - if (!fileName && err.sourceURL) fileName = err.sourceURL; - if (!lineNumber && err.line) lineNumber = err.line; - - // Chrome only gives a stack - if (!fileName && !lineNumber && err.stack) { - const stackRe = /^\s+at (?:[^(\n]* \()?([^\n]*):([0-9]+):([0-9]+)\)?$/m; - var m = stackRe.exec(err.stack); - if (m) { - fileName = m[1]; - lineNumber = m[2]; - } - } - - if (!fileName && !lineNumber && Zotero.isIE && typeof err === "object") { - // IE can give us a line number if we re-throw the exception, but we wrap this in a - // setTimeout call so that we won't throw in the middle of a function - window.setTimeout(function() { - window.onerror = function(errmsg, fileName, lineNumber) { - try { - Zotero.Errors.log("message" in err ? err.message : err.toString(), fileName, lineNumber); - } catch (e) {}; - return true; - }; - throw err; - window.onerror = undefined; - }, 0); - return; - } - - if (fileName && lineNumber) { - console.error(err + " at " + fileName + ":" + lineNumber); - } else { - console.error(err); - } - - if (err.stack) { - if (!Zotero.isChrome) { - Zotero.Errors.log(err.message + '\n' + err.stack); - } else { - Zotero.Errors.log(err.stack); - } - } else { - Zotero.Errors.log(err.message ? err.message : err.toString(), fileName, lineNumber); - } - }; - - this.getString = function() { - return Zotero.i18n.getString(...arguments); - }; - - this.getExtensionURL = function(path) { - let url; - if (Zotero.isBookmarklet) { - url = ZOTERO_CONFIG.BOOKMARKLET_URL + path; - } else if (Zotero.isSafari) { - url = `${safari.extension.baseURI}safari/` + path; - } else { - url = browser.runtime.getURL(path); - } - return url; - } -} - -Zotero.Prefs = new function() { - const DEFAULTS = { - "debug.log": false, - "debug.stackTrace": false, - "debug.store": false, - "debug.store.limit": 750000, - "debug.level": 5, - "debug.time": false, - "lastVersion": "", - "downloadAssociatedFiles": true, - "automaticSnapshots": true, // only affects saves to zotero.org. saves to client governed by pref in the client - "connector.repo.lastCheck.localTime": 0, - "connector.repo.lastCheck.repoTime": 0, - "connector.url": 'http://127.0.0.1:23119/', - "capitalizeTitles": false, - "interceptKnownFileTypes": true, - "allowedCSLExtensionHosts": ["raw.githubusercontent.com"], - "allowedInterceptHosts": [], - "firstUse": true, - "firstSaveToServer": true, - "reportTranslationFailure": true, - "translatorMetadata": [], - - "proxies.transparent": true, - "proxies.autoRecognize": true, - "proxies.showRedirectNotification": true, - "proxies.disableByDomain": false, - "proxies.disableByDomainString": '.edu', - "proxies.proxies": [], - "proxies.clientChecked": false, - - "integration.googleDocs.enabled": true, - // TODO: Add a remote repo URL (with trailing slash) once it is set up - "integration.googleDocs.codeRepositoryURL": "", - "integration.googleDocs.repoCheckInterval": 24 * 60 * 60 * 1000, // 24hrs - - "shortcuts.cite": { - ctrlKey: true, - altKey: true, - key: 'c' - } - }; - - if (Zotero.isMac) { - DEFAULTS['shortcuts.cite'] = { - metaKey: true, - ctrlKey: true, - key: 'c' - } - } - - this.syncStorage = {}; - - /** - * Should override per browser and load data into this.syncStorage - */ - this.init = function() { - throw new Error("Prefs initialization not overriden"); - }; - - this.get = function(pref) { - try { - if (!(pref in this.syncStorage)) throw new Error(`Prefs.get: ${pref} not preloaded`); - return this.syncStorage[pref]; - } catch (e) { - if (DEFAULTS.hasOwnProperty(pref)) return DEFAULTS[pref]; - if (Zotero.isBackground) { - throw new Error("Zotero.Prefs: Invalid preference " + pref); - } else { - throw e; - } - } - }; - - this.getAll = function() { - let prefs = Object.assign({}, DEFAULTS, this.syncStorage); - delete prefs['translatorMetadata']; - return Zotero.Promise.resolve(prefs); - }; - - this.getAsync = function(pref) { - return new Zotero.Promise(function(resolve, reject) { - try { - if (typeof pref === "object") { - var prefData = {}; - for (var i = 0; i < pref.length; i++) { - prefData[pref[i]] = Zotero.Prefs.get(pref[i]); - } - resolve(prefData); - } else { - resolve(Zotero.Prefs.get(pref)); - } - } catch (e) { - reject(e); - } - }); - }; - - /** - * Pre-load a namespace of prefs that can then be accessed synchronously. - * Only needed in injected code - * - * @param namespace {String|String[]} - */ - this.loadNamespace = function(namespaces) { - if (Zotero.isBackground) throw new Error('trying to load namespace in background. all prefs are available via the sync API'); - if (!Array.isArray(namespaces)) namespaces = [namespaces]; - return this.getAll().then(function(prefs) { - let keys = Object.keys(prefs); - for (let namespace of namespaces) { - keys.filter((key) => key.indexOf(namespace) === 0) - .forEach((key) => this.syncStorage[key] = prefs[key]); - } - }.bind(this)); - }; - - /** - * Should override per browser - * @param pref - * @param value - */ - this.set = function(pref, value) { - Zotero.debug("Setting " + pref + " to " + JSON.stringify(value).substr(0, 100)); - this.syncStorage[pref] = value; - }; - - /** - * Should override per browser - * @param pref - */ - this.clear = function(pref) { - if (Array.isArray(pref)) return pref.forEach((p) => this.clear(p)); - delete this.syncStorage[pref]; - } -} \ No newline at end of file diff --git a/external-scripts/zoteroTypeSchemaData.js b/external-scripts/zoteroTypeSchemaData.js deleted file mode 100644 index eab7f721..00000000 --- a/external-scripts/zoteroTypeSchemaData.js +++ /dev/null @@ -1,335 +0,0 @@ -var ZOTERO_TYPE_SCHEMA = { - "itemTypes": { - "1": ["note", "Note", [false], - [], {}, "treeitem-note.png" - ], - "2": ["book", "Book", [1, 2, 3, 5, 4], - [110, 90, 3, 30, 4, 45, 6, 7, 8, 14, 118, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-book.png" - ], - "3": ["bookSection", "Book Section", [1, 29, 2, 3, 5, 4], - [110, 90, 115, 3, 30, 4, 45, 6, 7, 8, 14, 10, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "115": 12 - }, "treeitem-bookSection.png" - ], - "4": ["journalArticle", "Journal Article", [1, 2, 3, 27, 4], - [110, 90, 12, 4, 5, 10, 14, 3, 28, 29, 25, 87, 26, 13, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-journalArticle.png" - ], - "5": ["magazineArticle", "Magazine Article", [1, 2, 27, 4], - [110, 90, 12, 4, 5, 14, 10, 87, 13, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-magazineArticle.png" - ], - "6": ["newspaperArticle", "Newspaper Article", [1, 2, 27, 4], - [110, 90, 12, 7, 6, 14, 15, 10, 87, 116, 13, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem-newspaperArticle.png" - ], - "7": ["thesis", "Thesis", [1, 2], - [110, 90, 69, 89, 7, 14, 118, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "69": 108, - "89": 8 - }, "treeitem-thesis.png" - ], - "8": ["letter", "Letter", [1, 2, 16], - [110, 90, 65, 14, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "65": 108 - }, "treeitem-letter.png" - ], - "9": ["manuscript", "Manuscript", [1, 2, 4], - [110, 90, 66, 7, 14, 118, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "66": 108 - }, "treeitem-manuscript.png" - ], - "10": ["interview", "Interview", [6, 2, 7, 4], - [110, 90, 14, 64, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "64": 109 - }, "treeitem-interview.png" - ], - "11": ["film", "Film", [8, 2, 10, 9], - [110, 90, 21, 14, 122, 63, 77, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "21": 8, - "63": 109, - "122": 108 - }, "treeitem-film.png" - ], - "12": ["artwork", "Artwork", [22, 2], - [110, 90, 59, 61, 14, 87, 116, 123, 19, 62, 18, 1, 27, 2, 22], { - "59": 109 - }, "treeitem-artwork.png" - ], - "13": ["webpage", "Web Page", [1, 2, 4], - [110, 90, 91, 70, 14, 116, 1, 27, 87, 2, 22], { - "70": 108, - "91": 12 - }, "treeitem-webpage.png" - ], - "14": ["attachment", "Attachment", [false], - [110, 27, 1], {}, "treeitem.png" - ], - "15": ["report", "Report", [1, 2, 5, 4], - [110, 90, 92, 32, 28, 7, 31, 14, 10, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "31": 8, - "32": 108, - "92": 60 - }, "treeitem-report.png" - ], - "16": ["bill", "Bill", [12, 2, 28], - [110, 90, 93, 36, 94, 15, 95, 41, 40, 42, 14, 87, 1, 27, 116, 2, 22], { - "93": 60, - "94": 4, - "95": 10 - }, "treeitem-bill.png" - ], - "17": ["case", "Case", [1, 2, 13], - [111, 90, 44, 96, 117, 43, 97, 98, 42, 87, 116, 1, 27, 2, 22], { - "96": 14, - "97": 4, - "98": 10, - "111": 110, - "117": 60 - }, "treeitem-case.png" - ], - "18": ["hearing", "Hearing", [2], - [110, 90, 46, 7, 8, 45, 99, 10, 41, 40, 42, 14, 87, 116, 1, 27, 2, 22], { - "99": 60 - }, "treeitem-hearing.png" - ], - "19": ["patent", "Patent", [14, 15, 2], - [110, 90, 7, 102, 48, 120, 50, 121, 10, 103, 51, 52, 53, 54, 87, 116, 1, 27, 2, 22], { - "50": 60, - "52": 14 - }, "treeitem-patent.png" - ], - "20": ["statute", "Statute", [1, 2], - [112, 90, 36, 55, 101, 100, 10, 15, 40, 42, 87, 116, 1, 27, 2, 22], { - "100": 14, - "101": 60, - "112": 110 - }, "treeitem-statute.png" - ], - "21": ["email", "E-mail", [1, 2, 16], - [113, 90, 14, 116, 1, 27, 87, 2, 22], { - "113": 110 - }, "treeitem-email.png" - ], - "22": ["map", "Map", [20, 2, 5], - [110, 90, 67, 68, 28, 6, 7, 8, 14, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "67": 108 - }, "treeitem-map.png" - ], - "23": ["blogPost", "Blog Post", [1, 23, 2], - [110, 90, 107, 70, 14, 1, 27, 87, 116, 2, 22], { - "70": 108, - "107": 12 - }, "treeitem-blogPost.png" - ], - "24": ["instantMessage", "Instant Message", [1, 2, 16], - [110, 90, 14, 87, 116, 1, 27, 2, 22], {}, "treeitem-instantMessage.png" - ], - "25": ["forumPost", "Forum Post", [1, 2], - [110, 90, 104, 79, 14, 87, 116, 1, 27, 2, 22], { - "79": 108, - "104": 12 - }, "treeitem-forumPost.png" - ], - "26": ["audioRecording", "Audio Recording", [17, 18, 2, 19], - [110, 90, 71, 28, 4, 45, 7, 72, 14, 77, 87, 11, 116, 123, 19, 62, 18, 1, 27, 2, 22], { - "71": 109, - "72": 8 - }, "treeitem-audioRecording.png" - ], - "27": ["presentation", "Presentation", [24, 2], - [110, 90, 74, 14, 7, 75, 1, 27, 87, 116, 2, 22], { - "74": 108 - }, "treeitem-presentation.png" - ], - "28": ["videoRecording", "Video Recording", [8, 11, 2, 10, 9], - [110, 90, 63, 28, 4, 45, 7, 76, 14, 77, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "63": 109, - "76": 8 - }, "treeitem-videoRecording.png" - ], - "29": ["tvBroadcast", "TV Broadcast", [8, 11, 2, 25, 10, 9], - [110, 90, 119, 105, 63, 7, 78, 14, 77, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "63": 109, - "78": 8, - "105": 60, - "119": 12 - }, "treeitem-tvBroadcast.png" - ], - "30": ["radioBroadcast", "Radio Broadcast", [8, 11, 2, 25, 10, 9], - [110, 90, 119, 105, 71, 7, 78, 14, 77, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "71": 109, - "78": 8, - "105": 60, - "119": 12 - }, "treeitem-radioBroadcast.png" - ], - "31": ["podcast", "Podcast", [26, 2, 25], - [110, 90, 28, 105, 80, 77, 1, 27, 87, 116, 2, 22], { - "80": 109, - "105": 60 - }, "treeitem-podcast.png" - ], - "32": ["computerProgram", "Computer Program", [21, 2], - [110, 90, 28, 81, 14, 82, 7, 83, 88, 11, 116, 1, 2, 123, 19, 62, 18, 27, 22], { - "83": 8 - }, "treeitem-computerProgram.png" - ], - "33": ["conferencePaper", "Conference Paper", [1, 2, 3, 5, 4], - [110, 90, 14, 114, 84, 7, 8, 4, 10, 3, 87, 26, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "114": 12 - }, "treeitem-conferencePaper.png" - ], - "34": ["document", "Document", [1, 2, 3, 27, 4], - [110, 90, 8, 14, 87, 116, 1, 27, 123, 19, 62, 18, 2, 22], {}, "treeitem.png" - ], - "35": ["encyclopediaArticle", "Encyclopedia Article", [1, 2, 3, 5, 4], - [110, 90, 85, 3, 30, 4, 45, 6, 7, 8, 14, 10, 11, 116, 1, 27, 87, 123, 19, 62, 18, 2, 22], { - "85": 12 - }, "treeitem-encyclopediaArticle.png" - ], - "36": ["dictionaryEntry", "Dictionary Entry", [1, 2, 3, 5, 4], - [110, 90, 86, 3, 30, 4, 45, 6, 7, 8, 14, 10, 87, 11, 116, 1, 27, 123, 19, 62, 18, 2, 22], { - "86": 12 - }, "treeitem-dictionaryEntry.png" - ] - }, - "creatorTypes": { - "1": ["author", "Author"], - "2": ["contributor", "Contributor"], - "3": ["editor", "Editor"], - "4": ["translator", "Translator"], - "5": ["seriesEditor", "Series Editor"], - "6": ["interviewee", "Interview With"], - "7": ["interviewer", "Interviewer"], - "8": ["director", "Director"], - "9": ["scriptwriter", "Scriptwriter"], - "10": ["producer", "Producer"], - "11": ["castMember", "Cast Member"], - "12": ["sponsor", "Sponsor"], - "13": ["counsel", "Counsel"], - "14": ["inventor", "Inventor"], - "15": ["attorneyAgent", "Attorney/Agent"], - "16": ["recipient", "Recipient"], - "17": ["performer", "Performer"], - "18": ["composer", "Composer"], - "19": ["wordsBy", "Words By"], - "20": ["cartographer", "Cartographer"], - "21": ["programmer", "Programmer"], - "22": ["artist", "Artist"], - "23": ["commenter", "Commenter"], - "24": ["presenter", "Presenter"], - "25": ["guest", "Guest"], - "26": ["podcaster", "Podcaster"], - "27": ["reviewedAuthor", "Reviewed Author"], - "28": ["cosponsor", "Cosponsor"], - "29": ["bookAuthor", "Book Author"] - }, - "fields": { - "1": ["url", "url", true], - "2": ["rights", "rights", true], - "3": ["series", "series", true], - "4": ["volume", "volume", true], - "5": ["issue", "issue", true], - "6": ["edition", "edition", true], - "7": ["place", "place", true], - "8": ["publisher", "publisher", true], - "10": ["pages", "pages", true], - "11": ["ISBN", "ISBN", true], - "12": ["publicationTitle", "publicationTitle", true], - "13": ["ISSN", "ISSN", true], - "14": ["date", "date", true], - "15": ["section", "section", true], - "18": ["callNumber", "callNumber", true], - "19": ["archiveLocation", "archiveLocation", true], - "21": ["distributor", "distributor", false], - "22": ["extra", "extra", true], - "25": ["journalAbbreviation", "journalAbbreviation", true], - "26": ["DOI", "DOI", true], - "27": ["accessDate", "accessDate", true], - "28": ["seriesTitle", "seriesTitle", true], - "29": ["seriesText", "seriesText", true], - "30": ["seriesNumber", "seriesNumber", true], - "31": ["institution", "institution", false], - "32": ["reportType", "reportType", false], - "36": ["code", "code", true], - "40": ["session", "session", true], - "41": ["legislativeBody", "legislativeBody", true], - "42": ["history", "history", true], - "43": ["reporter", "reporter", true], - "44": ["court", "court", true], - "45": ["numberOfVolumes", "numberOfVolumes", true], - "46": ["committee", "committee", true], - "48": ["assignee", "assignee", true], - "50": ["patentNumber", "patentNumber", false], - "51": ["priorityNumbers", "priorityNumbers", true], - "52": ["issueDate", "issueDate", false], - "53": ["references", "references", true], - "54": ["legalStatus", "legalStatus", true], - "55": ["codeNumber", "codeNumber", true], - "59": ["artworkMedium", "artworkMedium", false], - "60": ["number", "number", true], - "61": ["artworkSize", "artworkSize", true], - "62": ["libraryCatalog", "libraryCatalog", true], - "63": ["videoRecordingFormat", "videoRecordingFormat", false], - "64": ["interviewMedium", "interviewMedium", false], - "65": ["letterType", "letterType", false], - "66": ["manuscriptType", "manuscriptType", false], - "67": ["mapType", "mapType", false], - "68": ["scale", "scale", true], - "69": ["thesisType", "thesisType", false], - "70": ["websiteType", "websiteType", false], - "71": ["audioRecordingFormat", "audioRecordingFormat", false], - "72": ["label", "label", false], - "74": ["presentationType", "presentationType", false], - "75": ["meetingName", "meetingName", true], - "76": ["studio", "studio", false], - "77": ["runningTime", "runningTime", true], - "78": ["network", "network", false], - "79": ["postType", "postType", false], - "80": ["audioFileType", "audioFileType", false], - "81": ["versionNumber", "versionNumber", true], - "82": ["system", "system", true], - "83": ["company", "company", false], - "84": ["conferenceName", "conferenceName", true], - "85": ["encyclopediaTitle", "encyclopediaTitle", false], - "86": ["dictionaryTitle", "dictionaryTitle", false], - "87": ["language", "language", true], - "88": ["programmingLanguage", "programmingLanguage", true], - "89": ["university", "university", false], - "90": ["abstractNote", "abstractNote", true], - "91": ["websiteTitle", "websiteTitle", false], - "92": ["reportNumber", "reportNumber", false], - "93": ["billNumber", "billNumber", false], - "94": ["codeVolume", "codeVolume", false], - "95": ["codePages", "codePages", false], - "96": ["dateDecided", "dateDecided", false], - "97": ["reporterVolume", "reporterVolume", false], - "98": ["firstPage", "firstPage", false], - "99": ["documentNumber", "documentNumber", false], - "100": ["dateEnacted", "dateEnacted", false], - "101": ["publicLawNumber", "publicLawNumber", false], - "102": ["country", "country", true], - "103": ["applicationNumber", "applicationNumber", true], - "104": ["forumTitle", "forumTitle", false], - "105": ["episodeNumber", "episodeNumber", false], - "107": ["blogTitle", "blogTitle", false], - "108": ["type", "type", true], - "109": ["medium", "medium", true], - "110": ["title", "title", true], - "111": ["caseName", "caseName", false], - "112": ["nameOfAct", "nameOfAct", false], - "113": ["subject", "subject", false], - "114": ["proceedingsTitle", "proceedingsTitle", false], - "115": ["bookTitle", "bookTitle", false], - "116": ["shortTitle", "shortTitle", true], - "117": ["docketNumber", "docketNumber", false], - "118": ["numPages", "numPages", true], - "119": ["programTitle", "programTitle", false], - "120": ["issuingAuthority", "issuingAuthority", true], - "121": ["filingDate", "filingDate", true], - "122": ["genre", "genre", false], - "123": ["archive", "archive", true] - } -} - -if (typeof process === 'object' && process + '' === '[object process]') { - module.exports = ZOTERO_TYPE_SCHEMA; -} \ No newline at end of file diff --git a/external-scripts/zotero_config.js b/external-scripts/zotero_config.js deleted file mode 100644 index e1270c76..00000000 --- a/external-scripts/zotero_config.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -const ZOTERO_CONFIG = { - CLIENT_NAME: 'Zotero', - DOMAIN_NAME: 'zotero.org', - REPOSITORY_URL: 'https://repo.zotero.org/repo/', - REPOSITORY_CHECK_INTERVAL: 86400, // 24 hours - REPOSITORY_RETRY_INTERVAL: 3600, // 1 hour - REPOSITORY_CHANNEL: 'trunk', - BASE_URI: 'https://zotero.org/', - WWW_BASE_URL: 'https://www.zotero.org/', - CLIENT_DOWNLOAD_URL: 'https://www.zotero.org/download', - API_URL: 'https://api.zotero.org/', - GOOGLE_DOCS_API_URL: "https://script.googleapis.com/v1/scripts/1yB-M2ynZPu5fDKJW96sCvNTenn9VRRgJi1e-b_Kq6TJjMs_F2rdxXK30:run", - OAUTH: { - ZOTERO: { - REQUEST_URL: 'https://www.zotero.org/oauth/request', - ACCESS_URL: 'https://www.zotero.org/oauth/access', - AUTHORIZE_URL: 'https://www.zotero.org/oauth/authorize', - CALLBACK_URL: 'https://www.zotero.org/connector_auth_complete', - CLIENT_KEY: '05a4e25d3d9af8922eb9', - CLIENT_SECRET: '8dda1d6aa188bdd3126e' - }, - GOOGLE_DOCS: { - AUTHORIZE_URL: 'https://accounts.google.com/o/oauth2/v2/auth', - ACCESS_URL: 'https://www.googleapis.com/oauth2/v3/tokeninfo', - CALLBACK_URL: 'https://www.zotero.org/connector_auth_complete', - CLIENT_KEY: '222339878061-13uqre19u268oo9pdapuaifklbu8d6js.apps.googleusercontent.com', - } - }, - GOOGLE_DOCS_DEV_MODE: false -}; \ No newline at end of file diff --git a/external-scripts/zsc/zsc.js b/external-scripts/zsc/zsc.js deleted file mode 100644 index 3b8a327e..00000000 --- a/external-scripts/zsc/zsc.js +++ /dev/null @@ -1,451 +0,0 @@ -/** - * This is an adapted version of the original file from https://github.com/MaxKuehn/zotero-scholar-citations/blob/develop/chrome/content/zsc.js - * in order to use it for the JabRef-Browser-Extension. - * - * Changes, required for the JabRef-Browser-Extension, are basically marked with the comment "JRBE", which is the - * short form for [J]ab[R]ef-[B]rowser-[E]xtension. - */ - -let zsc = { - _captchaString: '', - _citedPrefixString: 'Cited by ', - _citeCountStrLength: 7, - _extraPrefix: 'ZSCC', - _extraEntrySep: ' \n', - _noData: 'NoCitationData', - _searchblackList: new RegExp('[-+~*":]', 'g'), - _baseUrl: 'https://scholar.google.com/', - - _preferDoiForLookupIfExisting: false, // JRBE: added; possible values: true, false (default: false; true: could be be more accurate, assuming that the DOI is correct) - _doiFieldName: 'DOI' // JRBE: added; Zotero sends 'DOI' and JabRef as well -}; - -zsc._extraRegex = new RegExp( - '^(?:(?:' + zsc._extraPrefix + ': )?)' + - '((?:(?:\\d{' + - zsc._citeCountStrLength + - '}|' + - zsc._noData + - ')|(?:\\d{5}|No Citation Data))?)' + - '\\[?s?(\\d|)\\]?' + - '([^]*)$' -); - -let isDebug = function() { - return typeof Zotero != 'undefined' && - typeof Zotero.Debug != 'undefined' && - Zotero.Debug.enabled; -}; - -zsc.init = function() { - let stringBundle = document.getElementById('zoteroscholarcitations-bundle'); - if (stringBundle != null) { - //this._captchaString = stringBundle.getString('captchaString'); // JRBE: commented out - this._captchaString = "Please show Google Scholar, that you are not a robot, by loading " + // JRBE: added - "https://scholar.google.com, searching for any string and solving the shown captcha."; // JRBE: added - this._citedPrefixString = stringBundle.getString('citedPrefixString'); - } - - // Register the callback in Zotero as an item observer - //let notifierID = Zotero.Notifier.registerObserver( // JRBE: commented out - // this.notifierCallback, ['item']); // JRBE: commented out - - // Unregister callback when the window closes (important to avoid a memory leak) - window.addEventListener('unload', function(e) { - //Zotero.Notifier.unregisterObserver(notifierID); // JRBE: commented out - }, false); -}; - -// so citation counts will be queried for >all< items that are added to zotero!? o.O -zsc.notifierCallback = { - notify: function(event, type, ids, extraData) { - if (event == 'add') { - zsc.processItems(Zotero.Items.get(ids)); - } - } -}; - -zsc.hasRequiredFields = function(item) { - return item.getField('title') && - item.getCreators().length > 0; -} - -zsc.updateCollectionMenuEntry = function() { - if (!ZoteroPane.canEditLibrary()) { - alert('You lack the permission to make edit to this library.'); - return; - } - - let group = ZoteroPane.getSelectedGroup(); - if (group) { - this.updateGroup(ZoteroPane.getSelectedGroup()); - return; - }; - - let collection = ZoteroPane.getSelectedCollection(); - if (collection) { - this.updateCollection(collection); - return; - } - - alert('Updating citations for this type of Entry is not supported.'); - return; -}; - -zsc.updateItemMenuEntries = function() { - if (!ZoteroPane.canEditLibrary()) { - alert('You lack the permission to make edit to this library.'); - return; - } - this.processItems(ZoteroPane.getSelectedItems()); -}; - -zsc.updateGroup = function(group) { - alert('Updating a Group is not yet implemented.') - return; - //this.processUpdateQueue(items); -}; - -zsc.updateCollection = function(collection) { - this.processItems(collection.getChildItems()); - let childColls = collection.getChildCollections(); - for (idx = 0; idx < childColls.length; ++idx) { - this.updateCollection(childColls[idx]); - } -}; - -/** - * JRBE: additional helper function - * - * does not check whether it is a valid DOI, only checks if it exists - * - * @param item - * @returns {boolean} - */ -zsc.hasDoi = function(item) { - return item.getField(zsc._doiFieldName) && - item.getField(zsc._doiFieldName).trim().length > 0; -}; - -/** - * JRBE: additional helper function - * - * Uses the preferred source, if possible, otherwise the alternative. - * - * @param item - * @returns {boolean} - */ -zsc.useDoiForLookup = function(item) { - if (zsc._preferDoiForLookupIfExisting) { - if (zsc.hasDoi(item)) { - return true; - } - } else { - if (!zsc.hasRequiredFields(item) && zsc.hasDoi(item)) { - return true; - } - } - return false; -}; - -/** - * JRBE: heavily adapted and extended function - * - * @param items - */ -zsc.processItems = function(items) { - for (let i = 0; i < items.length; i++) { // JRBE: adapted - let item = items[i]; // JRBE: adapted - item.setField("citationCount", ""); // JRBE: added; empty initialization - if (zsc.useDoiForLookup(item)) { // JRBE: added - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'DOI "' + item.getField(zsc._doiFieldName) + '" exists and will be used'); - } else if (!zsc.hasRequiredFields(item)) { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'skipping item "' + item.getField('title') + '"' + - ', since it doesn\'t have sufficient information for reliably fetching the citation count ' + - '(DOI or title and author(s) are needed)'); // JRBE: changed - if (!item.isExternalRequest()) { // JRBE: added - browser.runtime.sendMessage({ - "onCitationCount": '' + zsc._noData - }); - browser.runtime.sendMessage({ - "itemIncomplete": true - }); - } - item.setField("citationCount", zsc._noData); // JRBE: added; no data (title or creators missing) - item.setStatus(false, false, false, false); // JRBE: added; no success, item not complete, no captcha, not too many requests - zsc.updateItem(item, -1); // JRBE: added - continue; - } - this.retrieveCitationData(item, function(item, citeCount) { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'Updating item "' + item.getField('title') + '"'); - console.log("[scholar-citations] citation count: " + citeCount); // JRBE: added - if (citeCount > -1) { // JRBE: added - let paddedCitationCount = zsc.padLeftWithZeroes("" + citeCount); - if (!item.isExternalRequest()) { - browser.runtime.sendMessage({ - "onCitationCount": '' + paddedCitationCount - }); - } - item.setField("citationCount", paddedCitationCount); - } else { // JRBE: added - if (!item.isExternalRequest()) { - browser.runtime.sendMessage({ - "onCitationCount": '' + zsc._noData - }); - } - item.setField("citationCount", zsc._noData); // no data (no citation data) - } - zsc.updateItem(item, citeCount); - }); - } -}; - -zsc.updateItem = function(item, citeCount) { - let curExtra = item.getField('extra'); - let matches = curExtra.match(zsc._extraRegex); - let newExtra = ''; - - if (citeCount >= 0) { - newExtra += zsc.buildCiteCountString(citeCount); - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'updating extra field with new cite count'); - } else { - if (matches[1] === '') { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'updating extra field that contains no zsc content'); - newExtra += zsc.buildCiteCountString(citeCount); - } else if (matches[1] === zsc._noData || matches[1] === 'No Citation Data') { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'updating extra field that contains "no data"'); - newExtra += zsc.buildCiteCountString(citeCount); - } else { - let oldCiteCount = parseInt(matches[1]); - newExtra += zsc.buildCiteCountString(oldCiteCount); - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'updating extra field that contains cite count'); - } - - if (!matches[2]) { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'marking extra field as stale'); - newExtra += zsc.buildStalenessString(0); - } else { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'increasing staleness counter in extra field'); - newExtra += zsc.buildStalenessString((parseInt(matches[2]) + 1) % 10); - } - } - - if (/^\s\n/.test(matches[3]) || matches[3] === '') { - // do nothing, since the separator is already correct or not needed at all - } else if (/^\n/.test(matches[3])) { - newExtra += ' '; - } else { - newExtra += zsc._extraEntrySep; - } - newExtra += matches[3]; - - item.setField('extra', newExtra); - - try { - item.saveTx(); - } catch (e) { - if (isDebug()) Zotero.debug("[scholar-citations] " + - "could not update extra content: " + e); - } -}; - -/** - * JRBE: additional helper function - * - * @param item - * @returns {string} - */ -zsc.generateItemDoiUrl = function(item) { - let url = this._baseUrl + - 'scholar?hl=en&q=' + - item.getField(zsc._doiFieldName).trim() + - '&num=1'; - return encodeURI(url); -}; - -// JRBE: heavily adapted and extended function -// -// TODO: complex version, i.e. batching + retrying + blocking for solved captchas -// this prob. involves some nasty callback hell shit -// TODO: retries with random author permutations decreasing in author number :^) -zsc.retrieveCitationData = function(item, cb) { - let url; - if (zsc.useDoiForLookup(item)) { // JRBE: added - url = this.generateItemDoiUrl(item); - } else { - url = this.generateItemUrl(item); - } - if (isDebug()) Zotero.debug("[scholar-citations] GET " + url); - let citeCount; - let xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); // TODO: JRBE: adapted; original: async: true; possible improvement: make asynchronous calls possible - xhr.onreadystatechange = function() { - if (this.readyState === 4 && this.status === 200) { - if (this.responseText.indexOf('www.google.com/recaptcha/api.js') === -1) { - if (isDebug()) Zotero.debug("[scholar-citations] " + - "received non-captcha scholar results"); - item.setStatus(true, true, false, false); // JRBE: added; success, item complete, no captcha, not too many requests - cb(item, zsc.getCiteCount(this.responseText)); - } else { - if (isDebug()) Zotero.debug("[scholar-citations] " + - "received a captcha instead of a scholar result"); - item.setStatus(false, true, true, false); // JRBE: added; no success, item complete, captcha, not too many requests - alert(zsc._captchaString); - if (!item.isExternalRequest()) { // JRBE: added - browser.runtime.sendMessage({ - "onGoogleScholarCaptcha": url - }); - } - if (typeof Zotero.openInViewer !== 'undefined') { - Zotero.openInViewer(url); - } else if (typeof ZoteroStandalone !== 'undefined') { - ZoteroStandalone.openInViewer(url); - } else if (typeof Zotero.launchURL !== 'undefined') { - Zotero.launchURL(url); - } else { - //window.gBrowser.loadOneTab(url, {inBackground: false}); // JRBE: commented out - } - } - } else if (this.readyState === 4 && this.status === 429) { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'could not retrieve the google scholar data. Server returned: [' + - xhr.status + ': ' + xhr.statusText + ']. ' + - 'GS want\'s you to wait for ' + this.getResponseHeader("Retry-After") + - ' seconds before sending further requests.'); - if (!item.isExternalRequest()) { // JRBE: added - browser.runtime.sendMessage({ - "tooManyRequests": true - }); - } - - if (this.responseText.indexOf('www.google.com/recaptcha/api.js') === -1) { // JRBE: added - item.setStatus(false, true, false, true); // no success, item complete, no captcha, too many requests - } else { // JRBE: added - if (isDebug()) Zotero.debug("[scholar-citations] " + - "received a captcha instead of a scholar result"); - item.setStatus(false, true, true, true); // no success, item complete, captcha, too many requests - alert(zsc._captchaString); - if (!item.isExternalRequest()) { - browser.runtime.sendMessage({ - "onGoogleScholarCaptcha": url - }); - } - } - } else if (this.readyState === 4) { - if (isDebug()) Zotero.debug('[scholar-citations] ' + - 'could not retrieve the google scholar data. Server returned: [' + - xhr.status + ': ' + xhr.statusText + ']'); - if (this.responseText.indexOf('www.google.com/recaptcha/api.js') === -1) { // JRBE: added - item.setStatus(false, true, false, false); // no success, item complete, no captcha, not too many requests - } else { // JRBE: added - if (isDebug()) Zotero.debug("[scholar-citations] " + - "received a captcha instead of a scholar result"); - item.setStatus(false, true, true, false); // no success, item complete, captcha, not too many requests - alert(zsc._captchaString); - if (!item.isExternalRequest()) { - browser.runtime.sendMessage({ - "onGoogleScholarCaptcha": url - }); - } - } - } else { - // request progress, I guess - } - }; - xhr.send(); -}; - -zsc.generateItemUrl = function(item) { - let url = this._baseUrl + - 'scholar?hl=en&as_q=' + - zsc.cleanTitle(item.getField('title')).split(/\s/).join('+') + - '&as_epq=&as_occt=title&num=1'; - - let creators = item.getCreators(); - if (creators && creators.length > 0) { - url += '&as_sauthors='; - url += creators[0].lastName; - for (let idx = 1; idx < creators.length; idx++) { - url += '+' + creators[idx].lastName; - } - } - - let year = item.getField('year'); - if (year) { - url += '&as_ylo=' + year + '&as_yhi=' + year; - } - - return encodeURI(url); -}; - -zsc.cleanTitle = function(title) { - return title.replace(zsc._searchblackList, ' '); -}; - -zsc.padLeftWithZeroes = function(numStr) { - let output = ''; - let cnt = this._citeCountStrLength - numStr.length; - for (let i = 0; i < cnt; i++) { - output += '0'; - } - output += numStr; - return output; -}; - -zsc.buildCiteCountString = function(citeCount) { - if (citeCount < 0) - return this._extraPrefix + ': ' + this._noData; - else - return this._extraPrefix + ': ' + this.padLeftWithZeroes(citeCount.toString()); -}; - -zsc.buildStalenessString = function(stalenessCount) { - return '[s' + stalenessCount + ']'; -}; - -zsc.getCiteCount = function(responseText) { - let citePrefix = '>' + this._citedPrefixString; - let citePrefixLen = citePrefix.length; - let citeCountStart = responseText.indexOf(citePrefix); - - if (citeCountStart === -1) { - if (responseText.indexOf('class="gs_rt"') === -1) - return -1; - else - return 0; - } else { - let citeCountEnd = responseText.indexOf('<', citeCountStart); - let citeStr = responseText.substring(citeCountStart, citeCountEnd); - let citeCount = citeStr.substring(citePrefixLen); - return parseInt(citeCount.trim()); - } -}; - -if (typeof window !== 'undefined') { - window.addEventListener('load', function(e) { - zsc.init(); - }, false); - - // API export for Zotero UI - // Can't imagine those to not exist tbh - if (!window.Zotero) window.Zotero = {}; - if (!window.Zotero.ScholarCitations) window.Zotero.ScholarCitations = {}; - // note sure about any of this - window.Zotero.ScholarCitations.updateCollectionMenuEntry = function() { - zsc.updateCollectionMenuEntry(); - }; - window.Zotero.ScholarCitations.updateItemMenuEntries = function() { - zsc.updateItemMenuEntries(); - }; -} - -if (typeof module !== 'undefined') module.exports = zsc; \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 77bed198..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,150 +0,0 @@ -'use strict'; - -let gulp = require('gulp'); -const through = require('through2'); -const plumber = require('gulp-plumber'); -const path = require('path'); -let rename = require("gulp-rename"); -let beautify = require('gulp-jsbeautify'); -const babel = require('babel-core'); -const del = require('del'); - -function processJSX(file) { - try { - file.contents = Buffer.from(babel.transform(file.contents, { - plugins: ['transform-react-jsx'] - }).code); - } catch (e) { - console.log(e.message); - } -} - - -function processFile() { - return through.obj(function(file, enc, cb) { - //console.log(path.relative(file.cwd, file.path)); - var basename = path.basename(file.path); - var ext = path.extname(file.path); - - if (ext === '.jsx') { - processJSX(file); - } - - this.push(file); - cb(); - }); -} - -gulp.task('clean-external-scripts', function() { - del('./utilities/resource/**', {force: true}); - return del('./external-scripts/**', {force: true}); -}) - -gulp.task('copy-external-scripts', function() { - // Zotero expects this to be in this particular location - gulp.src('./zotero-connectors/src/utilities/resource/dateFormats.json') - .pipe(gulp.dest('utilities/resource/')); - - let sources = [ - // These are mostly coming from injectInclude in zotero-connectors/gulpfile.js if not otherwise noted - // './zotero-connectors/src/common/node_modules.js', // not needed - './zotero-connectors/src/common/zotero_config.js', - './zotero-connectors/src/common/zotero.js', - './zotero-connectors/src/common/http.js', - './zotero-connectors/src/common/proxy.js', - // './zotero-connectors/src/common/connector.js', // backgroundInclude, we override this in our own connector.js file - './zotero-connectors/src/common/repo.js', // backgroundInclude - './zotero-connectors/src/common/utilities.js', - './zotero-connectors/src/common/translate_item.js', - './zotero-connectors/src/common/translators.js', // backgroundInclude - './zotero-connectors/src/common/inject/http.js', - './zotero-connectors/src/common/inject/inject.jsx', // injectIncludeLast - './zotero-connectors/src/common/inject/translate_inject.js', - './zotero-connectors/src/common/cachedTypes.js', - './zotero-connectors/src/common/errors_webkit.js', // backgroundInclude - './zotero-connectors/src/common/schema.js', // not needed? - './zotero-connectors/src/common/messages.js', - './zotero-connectors/src/common/messaging.js', - './zotero-connectors/src/browserExt/background.js', // process-custom-scripts - './zotero-connectors/src/browserExt/messaging_inject.js', - './zotero-connectors/src/browserExt/prefs.js', - './zotero-connectors/src/zotero/resource/schema/connectorTypeSchemaData.js', - './zotero-connectors/src/utilities/openurl.js', - './zotero-connectors/src/utilities/date.js', - './zotero-connectors/src/utilities/xregexp-all.js', - './zotero-connectors/src/utilities/xregexp-unicode-zotero.js', - './zotero-connectors/src/utilities/resource/zoteroTypeSchemaData.js', - './zotero-connectors/src/utilities/utilities.js', - './zotero-connectors/src/utilities/utilities_item.js', - './zotero-connectors/src/utilities/schema.js', - './zotero-connectors/src/translate/src/promise.js', - './zotero-connectors/src/translate/src/debug.js', - './zotero-connectors/src/translate/src/rdf/init.js', - './zotero-connectors/src/translate/src/rdf/uri.js', - './zotero-connectors/src/translate/src/rdf/term.js', - './zotero-connectors/src/translate/src/rdf/identity.js', - './zotero-connectors/src/translate/src/rdf/rdfparser.js', - './zotero-connectors/src/translate/src/translation/translate.js', - './zotero-connectors/src/translate/src/translator.js', - './zotero-connectors/src/translate/src/utilities_translate.js', - './zotero-connectors/src/translate/src/tlds.js', - - './zotero-scholar-citations/chrome/content/zsc.js' - ]; - - return gulp.src(sources, { - base: process.cwd() - }) - .pipe(plumber()) - .pipe(rename(function(path) { - // Rename common/utilities.js -> utilities-common.js - if (path.basename === 'utilities' && path.dirname.endsWith('common')) { - path.basename = 'utilities-common'; - } - - // Rename utilities/schema.js -> utilities-schema.js - if (path.basename === 'schema' && path.dirname.endsWith('utilities')) { - path.basename = 'utilities-schema'; - } - - // Rename inject/http.js -> http_inject.js - if (path.basename === 'http' && path.dirname.endsWith('inject')) { - path.basename = 'http_inject'; - } - - // Flatten directory structure - if (path.dirname.endsWith("rdf")) { - path.dirname = "rdf"; - } else if (path.dirname.startsWith("zotero-scholar-citations")) { - path.dirname = "zsc"; - } else { - path.dirname = ""; - } - })) - .pipe(gulp.dest("./external-scripts")); -}); - -gulp.task('process-external-scripts', function() { - let sources = [ - './external-scripts/**/*' - ]; - - return gulp.src(sources, { - base: process.cwd() - }) - .pipe(plumber()) - .pipe(processFile()) - .pipe(beautify({ - indent_with_tabs: true, - brace_style: "collapse" - })) - .pipe(rename(function(path) { - // Rename jsx to js - if (path.extname === ".jsx") { - path.extname = ".js"; - } - })) - .pipe(gulp.dest((data) => data.base)); -}); - -gulp.task('update-external-scripts', gulp.series('clean-external-scripts', 'copy-external-scripts', 'process-external-scripts')); diff --git a/manifest.json b/manifest.json index da3e8768..14e58cf2 100644 --- a/manifest.json +++ b/manifest.json @@ -1,142 +1,113 @@ { - "browser_specific_settings": { - "gecko": { - "id": "@jabfox" - } - }, - - "author": "JabRef", - - "background": { - "scripts": [ - "browser-polyfill.min.js", - "external-scripts/zotero_config.js", - "external-scripts/zotero.js", - "external-scripts/promise.js", - "external-scripts/date.js", - "external-scripts/openurl.js", - "external-scripts/prefs.js", - "external-scripts/errors_webkit.js", - "external-scripts/http.js", - "external-scripts/proxy.js", - "connector.js", - "external-scripts/debug.js", - "external-scripts/xregexp-all.js", - "external-scripts/xregexp-unicode-zotero.js", - "external-scripts/zoteroTypeSchemaData.js", - "external-scripts/cachedTypes.js", - "external-scripts/repo.js", - "external-scripts/translate.js", - "external-scripts/translate_inject.js", - "external-scripts/tlds.js", - "external-scripts/translator.js", - "external-scripts/translators.js", - "external-scripts/connectorTypeSchemaData.js", - "external-scripts/utilities.js", - "external-scripts/utilities_item.js", - "external-scripts/utilities_translate.js", - "external-scripts/messages.js", - "external-scripts/messaging.js", - "external-scripts/background.js", - "zsc_misc_pre.js", - "external-scripts/zsc/zsc.js", - "wsClient.js", - "background.js" - ] - }, - - "page_action": { - "default_icon": { - "48": "data/JabRef-icon-48.png" - }, - "default_title": "Import references into JabRef", - "default_popup": "data/progressPanel.html" - }, - - "commands": { - "_execute_page_action": { - "suggested_key": { - "default": "Alt+Shift+J" - } - } - }, - - "content_security_policy": "script-src 'self' https://cdn.tailwindcss.com; object-src 'self'", - - "description": "The JabRef browser extension imports new bibliographic information directly from the browser into JabRef.", - - "developer": { - "name": "JabRef", - "url": "http://www.jabref.org/" - }, - - "homepage_url": "http://www.jabref.org/", - - "icons": { - "48": "data/JabRef-icon-48.png", - "96": "data/JabRef-icon-96.png" - }, - - "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAimiMLZZCsf+p92UUzQRWYljtoUk0a9AuN+D3TJTFcm1BEDXKIDVmWG20S4yLQyYs8kWao3eTSdYykgsZLPtay1pFKtoM4csGB6sEOO+h25Nv/AU7pN5yH5PqcTIGkuH6AsQQQTPS1Y+vDfz+548oVXzK033l6ernhKRj4dngueZyQX89U38zkorq0/PPWfE8ppPzXiWo1Pn5C5scgzaHSfavIkbBpWuiJw6moSoYw4UxzmU6FmzjM/c8Ags/QPU/8M3BeC1eigStifBDkuIIDQtMtiTXEgCqHjIacB3uB7SJKL+0wsoREqoz3cX7uNLnB+DKu+s0OZKVah8gkliBLQIDAQAB", - - "manifest_version": 2, - - "name": "JabRef Browser Extension", - - "options_ui": { - "page": "data/options.html", - "browser_style": true, - "chrome_style": true - }, - - "permissions": [ - "", - "activeTab", - "tabs", - "storage", - "nativeMessaging" - ], - - "content_scripts": [{ - "matches": ["http://*/*", "https://*/*"], - "run_at": "document_start", - "js": [ - "browser-polyfill.min.js", - "external-scripts/zotero_config.js", - "external-scripts/zotero.js", - "external-scripts/promise.js", - "external-scripts/http.js", - "external-scripts/proxy.js", - "external-scripts/date.js", - "external-scripts/debug.js", - "external-scripts/utilities-schema.js", - "external-scripts/openurl.js", - "external-scripts/xregexp-all.js", - "external-scripts/xregexp-unicode-zotero.js", - "external-scripts/zoteroTypeSchemaData.js", - "external-scripts/cachedTypes.js", - "external-scripts/schema.js", - "external-scripts/rdf/init.js", - "external-scripts/rdf/uri.js", - "external-scripts/rdf/term.js", - "external-scripts/rdf/identity.js", - "external-scripts/rdf/rdfparser.js", - "external-scripts/translate.js", - "external-scripts/translator.js", - "external-scripts/translate_item.js", - "external-scripts/connectorTypeSchemaData.js", - "external-scripts/utilities.js", - "external-scripts/utilities_item.js", - "external-scripts/utilities_translate.js", - "external-scripts/utilities-common.js", - "external-scripts/http_inject.js", - "external-scripts/translate_inject.js", - "external-scripts/messages.js", - "external-scripts/messaging_inject.js", - "external-scripts/inject.js", - "bibtexConverter.js" - ] - }], - - "version": "2.5" + "browser_specific_settings": { + "gecko": { + "id": "browserextension@jabref.org", + "data_collection_permissions": { + "required": ["none"] + } + } + }, + + "author": "JabRef", + + "background": { + "service_worker": "background.js", + "scripts": ["background.js"], + "type": "module" + }, + + "page_action": { + "default_icon": { + "16": "data/JabRef-icon-16.png", + "48": "data/JabRef-icon-48.png", + "128": "data/JabRef-icon-128.png" + }, + "default_title": "Import references into JabRef", + "default_popup": "data/progressPanel.html" + }, + + "commands": { + "_execute_page_action": { + "suggested_key": { + "default": "Alt+Shift+J" + } + } + }, + + "description": "The JabRef browser extension imports new bibliographic information directly from the browser into JabRef.", + + "developer": { + "name": "JabRef", + "url": "http://www.jabref.org/" + }, + + "homepage_url": "http://www.jabref.org/", + + "icons": { + "16": "data/JabRef-icon-16.png", + "48": "data/JabRef-icon-48.png", + "96": "data/JabRef-icon-96.png", + "128": "data/JabRef-icon-128.png" + }, + + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAimiMLZZCsf+p92UUzQRWYljtoUk0a9AuN+D3TJTFcm1BEDXKIDVmWG20S4yLQyYs8kWao3eTSdYykgsZLPtay1pFKtoM4csGB6sEOO+h25Nv/AU7pN5yH5PqcTIGkuH6AsQQQTPS1Y+vDfz+548oVXzK033l6ernhKRj4dngueZyQX89U38zkorq0/PPWfE8ppPzXiWo1Pn5C5scgzaHSfavIkbBpWuiJw6moSoYw4UxzmU6FmzjM/c8Ags/QPU/8M3BeC1eigStifBDkuIIDQtMtiTXEgCqHjIacB3uB7SJKL+0wsoREqoz3cX7uNLnB+DKu+s0OZKVah8gkliBLQIDAQAB", + + "manifest_version": 3, + + "name": "JabRef Browser Extension", + + "options_ui": { + "page": "data/options.html" + }, + + "permissions": [ + "", + "scripting", + "activeTab", + "tabs", + "storage", + "nativeMessaging", + "offscreen", + "webRequest", + "declarativeNetRequest" + ], + + "web_accessible_resources": [ + { + "matches": [""], + "resources": [ + "sources/translateEngine.js", + "sources/setupZotero.js", + "sources/setupZoteroPlain.js", + "sources/zotero-translate/src/promise.js", + "sources/zotero-translate/src/translate.js", + "sources/zotero-translate/src/translateWeb.js", + "sources/zotero-translate/src/translation/translate.js", + "sources/sandboxManager.js", + "sources/zotero-utilities/openurl.js", + "sources/zotero-utilities/date.js", + "sources/zotero-utilities/resource/dateFormats.json", + "sources/zotero-utilities/xregexp-all.js", + "sources/zotero-utilities/xregexp-unicode-zotero.js", + "sources/zotero-utilities/utilities.js", + "sources/zotero-utilities/utilities_item.js", + "sources/zotero-utilities/schema.js", + "sources/zotero-utilities/resource/zoteroTypeSchemaData.js", + "sources/zotero-utilities/cachedTypes.js", + "sources/zotero-translate/src/utilities_translate.js", + "sources/sandbox.js", + "sources/zotero-translate/src/translator.js", + "sources/zotero-translate/src/translation/translate_item.js", + "sources/zotero-translate/src/http.js", + "sources/http.js", + "sources/webRequestIntercept.js", + "sources/translateWeb.js", + "translators/zotero/*.js", + "translators/manifest.json" + ] + } + ], + + "version": "2.5", + "host_permissions": [""] } diff --git a/offscreen.html b/offscreen.html new file mode 100644 index 00000000..6a121a8e --- /dev/null +++ b/offscreen.html @@ -0,0 +1,14 @@ + + + + + + Offscreen Translator Runner + + + + + diff --git a/offscreen.js b/offscreen.js new file mode 100644 index 00000000..620265f1 --- /dev/null +++ b/offscreen.js @@ -0,0 +1,45 @@ +import { runTranslatorOnHtml } from "./sources/translateEngine.js"; + +console.debug("[offscreen] started"); + +// Provide a minimal compatibility shim: if `browser` is missing, alias it to `chrome`. +if (typeof browser === "undefined" && typeof chrome !== "undefined") { + globalThis.browser = chrome; +} + +browser.runtime.onMessage.addListener(async (msg, sender, sendResponse) => { + if (!msg || msg.type !== "runTranslators") return; + const { url, translators } = msg; + try { + const resp = await fetch(url, { credentials: "omit" }); + const html = await resp.text(); + + let lastError = null; + for (const translator of translators) { + try { + const result = await runTranslatorOnHtml(translator, html, url); + if (result !== null && typeof result !== "undefined") { + await browser.runtime.sendMessage({ type: "offscreenResult", url, items: result }); + sendResponse({ ok: true }); + return true; + } + } catch (e) { + lastError = e; + console.warn("[offscreen] translator failed, trying next:", translator, e); + continue; + } + } + + if (lastError) { + await browser.runtime.sendMessage({ type: "offscreenResult", url, error: String(lastError) }); + sendResponse({ ok: false, error: String(lastError) }); + } else { + await browser.runtime.sendMessage({ type: "offscreenResult", url, items: null }); + sendResponse({ ok: true, result: null }); + } + } catch (e) { + await browser.runtime.sendMessage({ type: "offscreenResult", url, error: String(e) }); + sendResponse({ ok: false, error: String(e) }); + } + return true; +}); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b4a0d5da..00000000 --- a/package-lock.json +++ /dev/null @@ -1,28542 +0,0 @@ -{ - "name": "jabrefbrowserextension", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "jabrefbrowserextension", - "license": "AGPL-3.0-or-later", - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-preset-env": "^1.7.0", - "bluebird": "^3.7.2", - "browserify": "^17.0.0", - "bufferutil": "^4.0.7", - "canvas": "^2.11.0", - "chai": "^4.3.7", - "chalk": "^5.2.0", - "chromedriver": "^109.0.0", - "geckodriver": "^3.2.0", - "gulp": "^4.0.2", - "gulp-jsbeautify": "^0.1.1", - "gulp-plumber": "^1.2.1", - "gulp-rename": "^2.0.0", - "jsdom": "^21.1.0", - "mocha": "^10.2.0", - "ncp": "^2.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "selenium-webdriver": "^4.8.0", - "sinon": "^15.0.1", - "through2": "^4.0.2", - "utf-8-validate": "^6.0.2", - "web-ext": "^7.5.0", - "webextension-polyfill": "^0.10.0", - "yargs": "^17.6.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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 - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/@devicefarmer/adbkit": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit/-/adbkit-3.2.3.tgz", - "integrity": "sha512-wK9rVrabs4QU0oK8Jnwi+HRBEm+s1x/o63kgthUe0y7K1bfcYmgLuQf41/adsj/5enddlSxzkJavl2EwOu+r1g==", - "dev": true, - "dependencies": { - "@devicefarmer/adbkit-logcat": "^2.1.2", - "@devicefarmer/adbkit-monkey": "~1.2.0", - "bluebird": "~3.7", - "commander": "^9.1.0", - "debug": "~4.3.1", - "node-forge": "^1.3.1", - "split": "~1.0.1" - }, - "bin": { - "adbkit": "bin/adbkit" - }, - "engines": { - "node": ">= 0.10.4" - } - }, - "node_modules/@devicefarmer/adbkit-logcat": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit-logcat/-/adbkit-logcat-2.1.2.tgz", - "integrity": "sha512-G4grpEa5s9s9wCRs8YB9LjFSnz0Os3g3RYIwZSxH3JFfV3aejL5xlu4hHMH4JY+d4oCCwImcEZJcFPY9BEP21w==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@devicefarmer/adbkit-monkey": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit-monkey/-/adbkit-monkey-1.2.1.tgz", - "integrity": "sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==", - "dev": true, - "engines": { - "node": ">= 0.10.4" - } - }, - "node_modules/@devicefarmer/adbkit/node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@devicefarmer/adbkit/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@devicefarmer/adbkit/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==", - "dev": true - }, - "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.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" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/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==", - "dev": true - }, - "node_modules/@eslint/eslintrc/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/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/config-array/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==", - "dev": true - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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/@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@mdn/browser-compat-data": { - "version": "5.2.29", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.29.tgz", - "integrity": "sha512-bEBrkTWbDAs/PB4IdRg4CtU750oBRytXHK/wC2oIDkgKZqnt76nACSooQQuHF11mK5k43f/IgFUMO5t5quRPVA==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", - "dev": true, - "dependencies": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@testim/chrome-version": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz", - "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==", - "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==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.14.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz", - "integrity": "sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A==", - "dev": true - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "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-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/addons-linter": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.27.0.tgz", - "integrity": "sha512-gDgl0FcmhZ5cs3St0qAaO9J1BoektwnY+p4dVgcvPu8WaBqH9MG2fk0gL/evCpoHSXeSw15GA87n8Y7zy7raVQ==", - "dev": true, - "dependencies": { - "@mdn/browser-compat-data": "5.2.29", - "addons-moz-compare": "1.3.0", - "addons-scanner-utils": "8.3.0", - "ajv": "8.12.0", - "chalk": "4.1.2", - "cheerio": "1.0.0-rc.12", - "columnify": "1.6.0", - "common-tags": "1.8.2", - "deepmerge": "4.2.2", - "eslint": "8.32.0", - "eslint-plugin-no-unsanitized": "4.0.2", - "eslint-visitor-keys": "3.3.0", - "espree": "9.4.1", - "esprima": "4.0.1", - "fast-json-patch": "3.1.1", - "fluent-syntax": "0.14.0", - "glob": "8.1.0", - "image-size": "1.0.2", - "is-mergeable-object": "1.1.1", - "jed": "1.1.1", - "json-merge-patch": "1.0.2", - "os-locale": "5.0.0", - "pino": "8.8.0", - "postcss": "8.4.21", - "relaxed-json": "1.0.3", - "semver": "7.3.8", - "sha.js": "2.4.11", - "source-map-support": "0.5.21", - "tosource": "1.0.0", - "upath": "2.0.1", - "yargs": "17.6.2", - "yauzl": "2.10.0" - }, - "bin": { - "addons-linter": "bin/addons-linter" - }, - "engines": { - "node": ">=12.21.0" - } - }, - "node_modules/addons-linter/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/addons-linter/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/addons-linter/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/addons-linter/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/addons-linter/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/addons-linter/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/addons-linter/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/addons-linter/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/addons-linter/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/addons-moz-compare": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/addons-moz-compare/-/addons-moz-compare-1.3.0.tgz", - "integrity": "sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==", - "dev": true - }, - "node_modules/addons-scanner-utils": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-8.3.0.tgz", - "integrity": "sha512-XP+2kxhZxlxiVFXVJ7lyJEuxpUS8ryrolUDqnUEnvOZ/3p8qt9hWCYSliXhI2W+Swf/hZ3F4CLAG6tBnqdxDYA==", - "dev": true, - "dependencies": { - "@types/yauzl": "2.10.0", - "common-tags": "1.8.2", - "first-chunk-stream": "3.0.0", - "strip-bom-stream": "4.0.0", - "upath": "2.0.1", - "yauzl": "2.10.0" - }, - "peerDependencies": { - "body-parser": "1.20.1", - "express": "4.18.2", - "node-fetch": "2.6.7", - "safe-compare": "1.1.4" - }, - "peerDependenciesMeta": { - "body-parser": { - "optional": true - }, - "express": { - "optional": true - }, - "node-fetch": { - "optional": true - }, - "safe-compare": { - "optional": true - } - } - }, - "node_modules/adm-zip": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz", - "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w==", - "dev": true, - "engines": { - "node": ">=6.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==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/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==", - "dev": true - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "dependencies": { - "ansi-wrap": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "node_modules/append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "dependencies": { - "buffer-equal": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-differ": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", - "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "node_modules/array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "dependencies": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-initial/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "dependencies": { - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-last/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "dependencies": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "dependencies": { - "async-done": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "dev": true, - "dependencies": { - "array-filter": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/axios": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", - "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/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==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - }, - "bin": { - "babel": "bin/babel.js", - "babel-doctor": "bin/babel-doctor.js", - "babel-external-helpers": "bin/babel-external-helpers.js", - "babel-node": "bin/babel-node.js" - }, - "optionalDependencies": { - "chokidar": "^1.6.1" - } - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/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=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "dependencies": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "dependencies": { - "regenerator-transform": "^0.10.0" - } - }, - "node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "node_modules/babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "dependencies": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", - "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "dependencies": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" - } - }, - "node_modules/browser-pack/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserify/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "dev": true, - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.3.tgz", - "integrity": "sha512-6BehRBOs7iurNjAYN9iPazTwFDaMQavJO8W1MEm3s2pH8q/tkPTtLDRUZaweWK87WFGf2Y5wLAlaCJlR5kOz3w==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.0", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001177", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001177.tgz", - "integrity": "sha512-6Ld7t3ifCL02jTj3MxPMM5wAYjbo4h/TAQGFTgv1inihP1tWnWp8mxxT4ut4JBEHLbpFXEXJJQ119JCJTBkYDw==", - "dev": true - }, - "node_modules/canvas": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.0.tgz", - "integrity": "sha512-bdTjFexjKJEwtIo0oRx8eD4G2yWoUOXP9lj279jmQ2zMnTQhT8C3512OKz3s+ZOaQlLbE7TuVvRDYDB3Llyy5g==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "optionalDependencies": { - "fsevents": "^1.0.0" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.1.tgz", - "integrity": "sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromedriver": { - "version": "109.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-109.0.0.tgz", - "integrity": "sha512-jdmBq11IUwfThLFiygGTZ89qbROSQI4bICQjvOVQy2Bqr1LwC+MFkhwyZp3YG99eehQbZuTlQmmfCZBfpewTNA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@testim/chrome-version": "^1.1.3", - "axios": "^1.2.1", - "compare-versions": "^5.0.1", - "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^1.1.0", - "tcp-port-used": "^1.0.1" - }, - "bin": { - "chromedriver": "bin/chromedriver" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "dependencies": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/columnify/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/columnify/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "node_modules/combine-source-map/node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/compare-versions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.1.tgz", - "integrity": "sha512-v8Au3l0b+Nwkp4G142JcgJFh1/TUhdxut7wzD1Nq1dyp5oa3tXaqb03EXOAB6jS4gMlalkjAUPZBMiAfKUixHQ==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/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==", - "dev": true - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "dependencies": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/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=", - "dev": true - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "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/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "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==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decimal.js": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", - "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", - "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/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=", - "dev": true - }, - "node_modules/deepcopy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz", - "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.8" - } - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "dependencies": { - "kind-of": "^5.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "node_modules/deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "bin": { - "deps-sort": "bin/cmd.js" - } - }, - "node_modules/deps-sort/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "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/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "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==", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dev": true, - "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "bin": { - "editorconfig": "bin/editorconfig" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.3.641", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.641.tgz", - "integrity": "sha512-b0DLhsHSHESC1I+Nx6n4w4Lr61chMd3m/av1rZQhS2IXTzaS5BMM5N+ldWdMIlni9CITMRM09m8He4+YV/92TA==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-promisify": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz", - "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "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/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "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=", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/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==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.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=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", - "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "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.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "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" - }, - "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-plugin-no-unsanitized": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.2.tgz", - "integrity": "sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==", - "dev": true, - "peerDependencies": { - "eslint": "^6 || ^7 || ^8" - } - }, - "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/eslint/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/eslint/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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/eslint/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/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/eslint/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint/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/eslint/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/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/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==", - "dev": true - }, - "node_modules/eslint/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "dependencies": { - "is-posix-bracket": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "optional": true, - "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "dependencies": { - "kind-of": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/extract-zip/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==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "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-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", - "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": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", - "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", - "dev": true - }, - "node_modules/fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "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/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/findup-sync/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/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/findup-sync/node_modules/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==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/firefox-profile": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", - "integrity": "sha512-3kI17Xl9dL9AeRkpV1yahsJ+UbekkPtlQswKrIsTY1NLgxtEOR4R19rjGGz5+7/rP8Jt6fvxHk+Bai9R6Eai3w==", - "dev": true, - "dependencies": { - "adm-zip": "~0.5.x", - "fs-extra": "~9.0.1", - "ini": "~2.0.0", - "minimist": "^1.2.5", - "xml2js": "~0.4.23" - }, - "bin": { - "firefox-profile": "lib/cli.js" - } - }, - "node_modules/firefox-profile/node_modules/fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/firefox-profile/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/first-chunk-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-3.0.0.tgz", - "integrity": "sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "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/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/fluent-syntax": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.14.0.tgz", - "integrity": "sha512-+k8uXWfRpSrE33764RbpjIKMzIX6R9EnSjFBgaA1s0Mboc3KnW9sYe0c6vjIoZQY1C4Gst1VFvAOP6YGJjTJuA==", - "deprecated": "Renamed to @fluent/syntax 0.14.0", - "dev": true, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fs-mkdirp-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/fx-runner": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fx-runner/-/fx-runner-1.3.0.tgz", - "integrity": "sha512-5b37H4GCyhF+Nf8xk9mylXoDq4wb7pbGAXxlCXp/631UTeeZomWSYcEGXumY4wk8g2QAqjPMGdWW+RbNt8PUcA==", - "dev": true, - "dependencies": { - "commander": "2.9.0", - "shell-quote": "1.7.3", - "spawn-sync": "1.0.15", - "when": "3.7.7", - "which": "1.2.4", - "winreg": "0.0.12" - }, - "bin": { - "fx-runner": "bin/fx-runner" - } - }, - "node_modules/fx-runner/node_modules/commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", - "dev": true, - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/fx-runner/node_modules/is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==", - "dev": true, - "dependencies": { - "is-relative": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fx-runner/node_modules/is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fx-runner/node_modules/isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==", - "dev": true - }, - "node_modules/fx-runner/node_modules/which": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz", - "integrity": "sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==", - "dev": true, - "dependencies": { - "is-absolute": "^0.1.7", - "isexe": "^1.1.1" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/geckodriver": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-3.2.0.tgz", - "integrity": "sha512-p+qR2RKlI/TQoCEYrSuTaYCLqsJNni96WmEukTyXmOmLn+3FLdgPAEwMZ0sG2Cwi9hozUzGAWyT6zLuhF6cpiQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "adm-zip": "0.5.9", - "bluebird": "3.7.2", - "got": "11.8.5", - "https-proxy-agent": "5.0.1", - "tar": "6.1.11" - }, - "bin": { - "geckodriver": "bin/geckodriver" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/geckodriver/node_modules/adm-zip": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", - "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "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==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "dependencies": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^2.0.0" - } - }, - "node_modules/glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "dependencies": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glob-stream/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-stream/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/glob-stream/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glob-watcher/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/glob-watcher/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/glob-watcher/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/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/glob-watcher/node_modules/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==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/micromatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/micromatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "dependencies": { - "sparkles": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/got/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/got/node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/got/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/got/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got/node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/got/node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "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==", - "dev": true - }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true - }, - "node_modules/gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "dependencies": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", - "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", - "dev": true, - "dependencies": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.4.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.2.0", - "yargs": "^7.1.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-cli/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/gulp-cli/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "node_modules/gulp-cli/node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-cli/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-cli/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/gulp-cli/node_modules/yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" - } - }, - "node_modules/gulp-cli/node_modules/yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - }, - "node_modules/gulp-jsbeautify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/gulp-jsbeautify/-/gulp-jsbeautify-0.1.1.tgz", - "integrity": "sha1-BIdu+yC2KhdNC5dlGQ9JXfq0Wfk=", - "dev": true, - "dependencies": { - "event-stream": "^3.1.5", - "js-beautify": "^1.5.1" - } - }, - "node_modules/gulp-plumber": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", - "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "fancy-log": "^1.3.2", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - }, - "engines": { - "node": ">=0.10", - "npm": ">=1.2.10" - } - }, - "node_modules/gulp-plumber/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-plumber/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-plumber/node_modules/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=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/gulp-plumber/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/gulp-plumber/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/gulp-rename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", - "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "dependencies": { - "glogg": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/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/har-validator/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/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/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==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/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==", - "dev": true - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dev": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "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/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "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=", - "dev": true, - "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==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "dependencies": { - "source-map": "~0.5.3" - } - }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/insert-module-globals/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/invert-kv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", - "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" - } - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-primitive": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-mergeable-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.1.tgz", - "integrity": "sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==", - "dev": true - }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true, - "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==", - "dev": true - }, - "node_modules/is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.4.tgz", - "integrity": "sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/is2": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz", - "integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" - }, - "engines": { - "node": ">=v0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "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/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/jed": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", - "integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==", - "dev": true - }, - "node_modules/jose": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.11.2.tgz", - "integrity": "sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-beautify": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.4.tgz", - "integrity": "sha512-M5yEWwonlEO3kPcCZ3K3KBSpFRZAEO3FAWC6wtbIGeyg7dusStxvF0WG+HRLBoMZqREXSRSxkkqClDE865x1sg==", - "dev": true, - "dependencies": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "^1.0.4", - "nopt": "^5.0.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-beautify/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "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/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/jsdom": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz", - "integrity": "sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "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.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsdom/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==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsdom/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-merge-patch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-merge-patch/-/json-merge-patch-1.0.2.tgz", - "integrity": "sha512-M6Vp2GN9L7cfuMXiWOmHj9bEFbeC250iVtcKQbqVgEsDVYnIsrNsbU+h/Y/PkbBQCtEa4Bez+Ebv0zfbC8ObLg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "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/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dev": true, - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsonwebtoken/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsonwebtoken/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dev": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dev": true, - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "node_modules/last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "dependencies": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lcid": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", - "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", - "dev": true, - "dependencies": { - "invert-kv": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "dependencies": { - "flush-write-stream": "^1.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "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/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "dependencies": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz", - "integrity": "sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==", - "dev": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "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/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.1.tgz", - "integrity": "sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/make-iterator/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true - }, - "node_modules/matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "dependencies": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/matchdep/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/matchdep/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/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/matchdep/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true, - "optional": true - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mem": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", - "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^2.1.0", - "p-is-promise": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mocha/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/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==", - "dev": true - }, - "node_modules/mocha/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/mocha/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mocha/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/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/mocha/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/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/module-deps/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/multimatch": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-6.0.0.tgz", - "integrity": "sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.5", - "array-differ": "^4.0.0", - "array-union": "^3.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "dev": true, - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "optional": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "dev": true, - "optional": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node_modules/nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-notifier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", - "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", - "dev": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", - "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "dependencies": { - "once": "^1.3.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "optional": true, - "dependencies": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.omit/node_modules/for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", - "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/optionator/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==", - "dev": true - }, - "node_modules/ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-locale": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", - "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", - "dev": true, - "dependencies": { - "execa": "^4.0.0", - "lcid": "^3.0.0", - "mem": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/package-json/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/got": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", - "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.1", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/package-json/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/package-json/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/package-json/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "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/parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "dependencies": { - "path-platform": "~0.11.15" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "dependencies": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dev": true, - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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=", - "dev": true, - "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/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "node_modules/path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pino": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.8.0.tgz", - "integrity": "sha512-cF8iGYeu2ODg2gIwgAHcPrtR63ILJz3f7gkogaHC/TXVVXxZgInmNYiIpDYEwgEkxZti2Se6P2W2DxlBIZe6eQ==", - "dev": true, - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.0.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", - "thread-stream": "^2.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", - "dev": true, - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "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.2.1" - } - }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz", - "integrity": "sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==", - "dev": true - }, - "node_modules/plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "dependencies": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "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/preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.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==", - "dev": true - }, - "node_modules/process-warning": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz", - "integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==", - "dev": true - }, - "node_modules/promise-toolbox": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/promise-toolbox/-/promise-toolbox-0.21.0.tgz", - "integrity": "sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==", - "dev": true, - "dependencies": { - "make-error": "^1.3.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "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/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", - "dev": true - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randomatic/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "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/readable-stream/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==", - "dev": true - }, - "node_modules/readable-stream/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==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/readdirp/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "node_modules/regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-equal-shallow": "^0.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^1.0.4" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relaxed-json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/relaxed-json/-/relaxed-json-1.0.3.tgz", - "integrity": "sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "commander": "^2.6.0" - }, - "bin": { - "rjson": "bin/rjson.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/relaxed-json/node_modules/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==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/relaxed-json/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/relaxed-json/node_modules/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==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/relaxed-json/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/relaxed-json/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/relaxed-json/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/relaxed-json/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "dependencies": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-bom-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "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.3", - "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.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "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=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "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/resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "dependencies": { - "value-or-function": "^3.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "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/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "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==", - "dev": true, - "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/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "dev": true, - "optional": true - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", - "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/selenium-webdriver": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.0.tgz", - "integrity": "sha512-s/HL8WNwy1ggHR244+tAhjhyKMJnZLt1HKJ6Gn7nQgVjB/ybDF+46Uui0qI2J7AjPNJzlUmTncdC/jg/kKkn0A==", - "dev": true, - "dependencies": { - "jszip": "^3.10.0", - "tmp": "^0.2.1", - "ws": ">=8.11.0" - }, - "engines": { - "node": ">= 14.20.0" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-diff/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "dependencies": { - "sver-compat": "^1.5.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, - "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/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "node_modules/sign-addon": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.2.0.tgz", - "integrity": "sha512-t5CZ4MSKAd3uJBUfjgWfSyKYC1pQS6BMUbgI5OytzMkTOQ9NkdkFE8bB0AJLQIGqDrNS2b1+/ghAP56iuCUE+g==", - "dev": true, - "dependencies": { - "common-tags": "1.8.2", - "core-js": "3.27.1", - "deepcopy": "2.1.0", - "es6-error": "4.1.1", - "es6-promisify": "7.0.0", - "jsonwebtoken": "9.0.0", - "mz": "2.7.0", - "request": "2.88.2", - "source-map-support": "0.5.21", - "stream-to-promise": "3.0.0" - } - }, - "node_modules/sign-addon/node_modules/core-js": { - "version": "3.27.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", - "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/sign-addon/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sign-addon/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "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/simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sinon": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", - "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "10.0.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sonic-boom": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", - "integrity": "sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==", - "dev": true, - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "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" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "node_modules/stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/stream-http/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-to-array": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", - "dev": true, - "dependencies": { - "any-promise": "^1.1.0" - } - }, - "node_modules/stream-to-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-3.0.0.tgz", - "integrity": "sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA==", - "dev": true, - "dependencies": { - "any-promise": "~1.3.0", - "end-of-stream": "~1.4.1", - "stream-to-array": "~2.3.0" - }, - "engines": { - "node": ">= 10" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-5.0.0.tgz", - "integrity": "sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-bom-buf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz", - "integrity": "sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-4.0.0.tgz", - "integrity": "sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==", - "dev": true, - "dependencies": { - "first-chunk-stream": "^3.0.0", - "strip-bom-buf": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "dependencies": { - "minimist": "^1.1.0" - } - }, - "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/sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "dependencies": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "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==", - "dev": true - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "dependencies": { - "acorn-node": "^1.2.0" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/tcp-port-used": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", - "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", - "dev": true, - "dependencies": { - "debug": "4.3.1", - "is2": "^2.0.6" - } - }, - "node_modules/tcp-port-used/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/tcp-port-used/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==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/thread-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", - "integrity": "sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==", - "dev": true, - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "dependencies": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "node_modules/through2-filter/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "dependencies": { - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/to-through/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tosource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz", - "integrity": "sha512-N6g8eQ1eerw6Y1pBhdgkubWIiPFwXa2POSUrlL8jth5CyyEWNWzoGKRkO3CaO7Jx27hlJP54muB3btIAbx4MPg==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tr46/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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "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-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true, - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" - } - }, - "node_modules/undertaker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", - "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "fast-levenshtein": "^1.0.0", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "dependencies": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "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/uri-js/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true, - "bin": { - "user-home": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/utf-8-validate": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.2.tgz", - "integrity": "sha512-yd7PQEOW+EgecUzSD7XUXTyq/vREGXk7t7fzGfOvwOAr0Z64h5rfGrmkNk8+ddVmf/FrkjPPhVyYBa7fuSPVTg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "dependencies": { - "user-home": "^1.1.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "dependencies": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "dependencies": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-ext": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.5.0.tgz", - "integrity": "sha512-Ymflj7Aq/LOD+zGoyvwRbAPx/yMJeig2OEb/rRXYrWl6NWRI5E0c2iWGqlBcnL45iKrOzz70H438dVeJk0w2ug==", - "dev": true, - "dependencies": { - "@babel/runtime": "7.20.13", - "@devicefarmer/adbkit": "3.2.3", - "addons-linter": "5.27.0", - "bunyan": "1.8.15", - "camelcase": "7.0.1", - "chrome-launcher": "0.15.1", - "debounce": "1.2.1", - "decamelize": "6.0.0", - "es6-error": "4.1.1", - "firefox-profile": "4.2.2", - "fs-extra": "11.1.0", - "fx-runner": "1.3.0", - "import-fresh": "3.3.0", - "jose": "4.11.2", - "mkdirp": "1.0.4", - "multimatch": "6.0.0", - "mz": "2.7.0", - "node-fetch": "3.3.0", - "node-notifier": "10.0.1", - "open": "8.4.0", - "parse-json": "6.0.2", - "promise-toolbox": "0.21.0", - "sign-addon": "5.2.0", - "source-map-support": "0.5.21", - "strip-bom": "5.0.0", - "strip-json-comments": "5.0.0", - "tmp": "0.2.1", - "update-notifier": "6.0.2", - "watchpack": "2.4.0", - "ws": "8.12.0", - "yargs": "17.6.2", - "zip-dir": "2.0.0" - }, - "bin": { - "web-ext": "bin/web-ext.js" - }, - "engines": { - "node": ">=14.0.0", - "npm": ">=6.9.0" - } - }, - "node_modules/web-ext/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web-ext/node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web-ext/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/web-ext/node_modules/node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/web-ext/node_modules/parse-json": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-6.0.2.tgz", - "integrity": "sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^2.3.1", - "lines-and-columns": "^2.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web-ext/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/web-ext/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/web-ext/node_modules/strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webextension-polyfill": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", - "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/when": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==", - "dev": true - }, - "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/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/winreg": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/winreg/-/winreg-0.0.12.tgz", - "integrity": "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "dev": true, - "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/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "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.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zip-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz", - "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==", - "dev": true, - "dependencies": { - "async": "^3.2.0", - "jszip": "^3.2.2" - } - }, - "node_modules/zip-dir/node_modules/async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - } - } - }, - "@devicefarmer/adbkit": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit/-/adbkit-3.2.3.tgz", - "integrity": "sha512-wK9rVrabs4QU0oK8Jnwi+HRBEm+s1x/o63kgthUe0y7K1bfcYmgLuQf41/adsj/5enddlSxzkJavl2EwOu+r1g==", - "dev": true, - "requires": { - "@devicefarmer/adbkit-logcat": "^2.1.2", - "@devicefarmer/adbkit-monkey": "~1.2.0", - "bluebird": "~3.7", - "commander": "^9.1.0", - "debug": "~4.3.1", - "node-forge": "^1.3.1", - "split": "~1.0.1" - }, - "dependencies": { - "commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } - } - }, - "@devicefarmer/adbkit-logcat": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit-logcat/-/adbkit-logcat-2.1.2.tgz", - "integrity": "sha512-G4grpEa5s9s9wCRs8YB9LjFSnz0Os3g3RYIwZSxH3JFfV3aejL5xlu4hHMH4JY+d4oCCwImcEZJcFPY9BEP21w==", - "dev": true - }, - "@devicefarmer/adbkit-monkey": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit-monkey/-/adbkit-monkey-1.2.1.tgz", - "integrity": "sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.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" - }, - "dependencies": { - "ajv": { - "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": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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 - }, - "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 - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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 - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@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 - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@mdn/browser-compat-data": { - "version": "5.2.29", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.29.tgz", - "integrity": "sha512-bEBrkTWbDAs/PB4IdRg4CtU750oBRytXHK/wC2oIDkgKZqnt76nACSooQQuHF11mK5k43f/IgFUMO5t5quRPVA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "requires": { - "graceful-fs": "4.2.10" - } - }, - "@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", - "dev": true, - "requires": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true - }, - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0" - } - }, - "@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@testim/chrome-version": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz", - "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==", - "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==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/node": { - "version": "14.14.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz", - "integrity": "sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A==", - "dev": true - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "requires": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - }, - "dependencies": { - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "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, - "requires": {} - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "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==", - "dev": true - }, - "addons-linter": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.27.0.tgz", - "integrity": "sha512-gDgl0FcmhZ5cs3St0qAaO9J1BoektwnY+p4dVgcvPu8WaBqH9MG2fk0gL/evCpoHSXeSw15GA87n8Y7zy7raVQ==", - "dev": true, - "requires": { - "@mdn/browser-compat-data": "5.2.29", - "addons-moz-compare": "1.3.0", - "addons-scanner-utils": "8.3.0", - "ajv": "8.12.0", - "chalk": "4.1.2", - "cheerio": "1.0.0-rc.12", - "columnify": "1.6.0", - "common-tags": "1.8.2", - "deepmerge": "4.2.2", - "eslint": "8.32.0", - "eslint-plugin-no-unsanitized": "4.0.2", - "eslint-visitor-keys": "3.3.0", - "espree": "9.4.1", - "esprima": "4.0.1", - "fast-json-patch": "3.1.1", - "fluent-syntax": "0.14.0", - "glob": "8.1.0", - "image-size": "1.0.2", - "is-mergeable-object": "1.1.1", - "jed": "1.1.1", - "json-merge-patch": "1.0.2", - "os-locale": "5.0.0", - "pino": "8.8.0", - "postcss": "8.4.21", - "relaxed-json": "1.0.3", - "semver": "7.3.8", - "sha.js": "2.4.11", - "source-map-support": "0.5.21", - "tosource": "1.0.0", - "upath": "2.0.1", - "yargs": "17.6.2", - "yauzl": "2.10.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "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": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.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==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "addons-moz-compare": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/addons-moz-compare/-/addons-moz-compare-1.3.0.tgz", - "integrity": "sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==", - "dev": true - }, - "addons-scanner-utils": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-8.3.0.tgz", - "integrity": "sha512-XP+2kxhZxlxiVFXVJ7lyJEuxpUS8ryrolUDqnUEnvOZ/3p8qt9hWCYSliXhI2W+Swf/hZ3F4CLAG6tBnqdxDYA==", - "dev": true, - "requires": { - "@types/yauzl": "2.10.0", - "common-tags": "1.8.2", - "first-chunk-stream": "3.0.0", - "strip-bom-stream": "4.0.0", - "upath": "2.0.1", - "yauzl": "2.10.0" - } - }, - "adm-zip": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz", - "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "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 - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-differ": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", - "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - } - }, - "array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "dev": true, - "requires": { - "array-filter": "^1.0.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "axios": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", - "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "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=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dev": true, - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "camelcase": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", - "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "requires": { - "resolve": "^1.17.0" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "requires": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "dev": true, - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.3.tgz", - "integrity": "sha512-6BehRBOs7iurNjAYN9iPazTwFDaMQavJO8W1MEm3s2pH8q/tkPTtLDRUZaweWK87WFGf2Y5wLAlaCJlR5kOz3w==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.0", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true - } - } - }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001177", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001177.tgz", - "integrity": "sha512-6Ld7t3ifCL02jTj3MxPMM5wAYjbo4h/TAQGFTgv1inihP1tWnWp8mxxT4ut4JBEHLbpFXEXJJQ119JCJTBkYDw==", - "dev": true - }, - "canvas": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.0.tgz", - "integrity": "sha512-bdTjFexjKJEwtIo0oRx8eD4G2yWoUOXP9lj279jmQ2zMnTQhT8C3512OKz3s+ZOaQlLbE7TuVvRDYDB3Llyy5g==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-launcher": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.1.tgz", - "integrity": "sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==", - "dev": true, - "requires": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - } - }, - "chromedriver": { - "version": "109.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-109.0.0.tgz", - "integrity": "sha512-jdmBq11IUwfThLFiygGTZ89qbROSQI4bICQjvOVQy2Bqr1LwC+MFkhwyZp3YG99eehQbZuTlQmmfCZBfpewTNA==", - "dev": true, - "requires": { - "@testim/chrome-version": "^1.1.3", - "axios": "^1.2.1", - "compare-versions": "^5.0.1", - "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^1.1.0", - "tcp-port-used": "^1.0.1" - } - }, - "ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - } - } - }, - "cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "compare-versions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.1.tgz", - "integrity": "sha512-v8Au3l0b+Nwkp4G142JcgJFh1/TUhdxut7wzD1Nq1dyp5oa3tXaqb03EXOAB6jS4gMlalkjAUPZBMiAfKUixHQ==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "requires": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "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=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "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, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "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==", - "dev": true - } - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - } - }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "decimal.js": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", - "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-eql": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", - "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "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=", - "dev": true - }, - "deepcopy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz", - "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==", - "dev": true, - "requires": { - "type-detect": "^4.0.8" - } - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - } - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - } - }, - "electron-to-chromium": { - "version": "1.3.641", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.641.tgz", - "integrity": "sha512-b0DLhsHSHESC1I+Nx6n4w4Lr61chMd3m/av1rZQhS2IXTzaS5BMM5N+ldWdMIlni9CITMRM09m8He4+YV/92TA==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promisify": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz", - "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==", - "dev": true - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true - }, - "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 - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "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==", - "dev": true, - "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=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", - "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "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.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "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" - }, - "dependencies": { - "ajv": { - "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": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "chalk": { - "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": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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 - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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 - } - } - }, - "eslint-plugin-no-unsanitized": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.2.tgz", - "integrity": "sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==", - "dev": true, - "requires": {} - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "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, - "requires": { - "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": "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": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - } - } - }, - "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 - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "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, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - }, - "dependencies": { - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "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 - }, - "fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", - "dev": true - }, - "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 - }, - "fast-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", - "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", - "dev": true - }, - "fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } - }, - "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, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "firefox-profile": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", - "integrity": "sha512-3kI17Xl9dL9AeRkpV1yahsJ+UbekkPtlQswKrIsTY1NLgxtEOR4R19rjGGz5+7/rP8Jt6fvxHk+Bai9R6Eai3w==", - "dev": true, - "requires": { - "adm-zip": "~0.5.x", - "fs-extra": "~9.0.1", - "ini": "~2.0.0", - "minimist": "^1.2.5", - "xml2js": "~0.4.23" - }, - "dependencies": { - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, - "first-chunk-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-3.0.0.tgz", - "integrity": "sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "fluent-syntax": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.14.0.tgz", - "integrity": "sha512-+k8uXWfRpSrE33764RbpjIKMzIX6R9EnSjFBgaA1s0Mboc3KnW9sYe0c6vjIoZQY1C4Gst1VFvAOP6YGJjTJuA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "requires": { - "fetch-blob": "^3.1.2" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "fx-runner": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fx-runner/-/fx-runner-1.3.0.tgz", - "integrity": "sha512-5b37H4GCyhF+Nf8xk9mylXoDq4wb7pbGAXxlCXp/631UTeeZomWSYcEGXumY4wk8g2QAqjPMGdWW+RbNt8PUcA==", - "dev": true, - "requires": { - "commander": "2.9.0", - "shell-quote": "1.7.3", - "spawn-sync": "1.0.15", - "when": "3.7.7", - "which": "1.2.4", - "winreg": "0.0.12" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==", - "dev": true, - "requires": { - "is-relative": "^0.1.0" - } - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==", - "dev": true - }, - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==", - "dev": true - }, - "which": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz", - "integrity": "sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==", - "dev": true, - "requires": { - "is-absolute": "^0.1.7", - "isexe": "^1.1.1" - } - } - } - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "geckodriver": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-3.2.0.tgz", - "integrity": "sha512-p+qR2RKlI/TQoCEYrSuTaYCLqsJNni96WmEukTyXmOmLn+3FLdgPAEwMZ0sG2Cwi9hozUzGAWyT6zLuhF6cpiQ==", - "dev": true, - "requires": { - "adm-zip": "0.5.9", - "bluebird": "3.7.2", - "got": "11.8.5", - "https-proxy-agent": "5.0.1", - "tar": "6.1.11" - }, - "dependencies": { - "adm-zip": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", - "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", - "dev": true - } - } - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "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==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "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 - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "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==", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - } - } - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - } - }, - "gulp-cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", - "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.4.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.2.0", - "yargs": "^7.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" - } - }, - "yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-jsbeautify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/gulp-jsbeautify/-/gulp-jsbeautify-0.1.1.tgz", - "integrity": "sha1-BIdu+yC2KhdNC5dlGQ9JXfq0Wfk=", - "dev": true, - "requires": { - "event-stream": "^3.1.5", - "js-beautify": "^1.5.1" - } - }, - "gulp-plumber": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", - "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "fancy-log": "^1.3.2", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "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=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-rename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", - "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", - "dev": true - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "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": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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 - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "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 - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dev": true, - "requires": { - "queue": "6.0.2" - } - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "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, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "requires": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", - "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", - "dev": true - }, - "ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "optional": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-mergeable-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.1.tgz", - "integrity": "sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==", - "dev": true - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true - }, - "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==", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.4.tgz", - "integrity": "sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true - }, - "is2": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz", - "integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "jed": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", - "integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==", - "dev": true - }, - "jose": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.11.2.tgz", - "integrity": "sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==", - "dev": true - }, - "js-beautify": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.4.tgz", - "integrity": "sha512-M5yEWwonlEO3kPcCZ3K3KBSpFRZAEO3FAWC6wtbIGeyg7dusStxvF0WG+HRLBoMZqREXSRSxkkqClDE865x1sg==", - "dev": true, - "requires": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "^1.0.4", - "nopt": "^5.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "jsdom": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz", - "integrity": "sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "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.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - } - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-merge-patch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-merge-patch/-/json-merge-patch-1.0.2.tgz", - "integrity": "sha512-M6Vp2GN9L7cfuMXiWOmHj9bEFbeC250iVtcKQbqVgEsDVYnIsrNsbU+h/Y/PkbBQCtEa4Bez+Ebv0zfbC8ObLg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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 - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dev": true, - "requires": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dev": true, - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "requires": { - "package-json": "^8.1.0" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", - "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", - "dev": true, - "requires": { - "invert-kv": "^3.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "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, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "lighthouse-logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz", - "integrity": "sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "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 - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "chalk": { - "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": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loupe": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.1.tgz", - "integrity": "sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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 - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true, - "optional": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", - "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^2.1.0", - "p-is-promise": "^2.1.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.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 - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "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 - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "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 - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "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==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "requires": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true, - "optional": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multimatch": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-6.0.0.tgz", - "integrity": "sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==", - "dev": true, - "requires": { - "@types/minimatch": "^3.0.5", - "array-differ": "^4.0.0", - "array-union": "^3.0.1", - "minimatch": "^3.0.4" - } - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "dev": true, - "optional": true, - "requires": { - "glob": "^6.0.1" - } - } - } - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } - } - } - } - }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true - }, - "node-notifier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", - "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", - "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "optional": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "on-exit-leak-free": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", - "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - } - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", - "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", - "dev": true, - "requires": { - "execa": "^4.0.0", - "lcid": "^3.0.0", - "mem": "^5.0.0" - } - }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", - "dev": true - }, - "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 - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", - "dev": true, - "requires": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "dependencies": { - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "got": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", - "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", - "dev": true, - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.1", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dev": true, - "requires": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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=", - "dev": true - }, - "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 - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - } - } - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pino": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.8.0.tgz", - "integrity": "sha512-cF8iGYeu2ODg2gIwgAHcPrtR63ILJz3f7gkogaHC/TXVVXxZgInmNYiIpDYEwgEkxZti2Se6P2W2DxlBIZe6eQ==", - "dev": true, - "requires": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.0.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", - "thread-stream": "^2.0.0" - } - }, - "pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", - "dev": true, - "requires": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - } - } - }, - "pino-std-serializers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz", - "integrity": "sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==", - "dev": true - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "dependencies": { - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - } - } - }, - "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 - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "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==", - "dev": true - }, - "process-warning": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz", - "integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==", - "dev": true - }, - "promise-toolbox": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/promise-toolbox/-/promise-toolbox-0.21.0.tgz", - "integrity": "sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==", - "dev": true, - "requires": { - "make-error": "^1.3.2" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "requires": { - "escape-goat": "^4.0.0" - } - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "requires": { - "inherits": "~2.0.3" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "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==", - "dev": true, - "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" - }, - "dependencies": { - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", - "dev": true, - "requires": { - "@pnpm/npm-conf": "^1.0.4" - } - }, - "registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relaxed-json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/relaxed-json/-/relaxed-json-1.0.3.tgz", - "integrity": "sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "commander": "^2.6.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "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.3", - "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.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "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 - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "requires": { - "lowercase-keys": "^3.0.0" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "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" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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==", - "dev": true - }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "dev": true, - "optional": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safe-stable-stringify": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", - "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0" - } - }, - "selenium-webdriver": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.0.tgz", - "integrity": "sha512-s/HL8WNwy1ggHR244+tAhjhyKMJnZLt1HKJ6Gn7nQgVjB/ybDF+46Uui0qI2J7AjPNJzlUmTncdC/jg/kKkn0A==", - "dev": true, - "requires": { - "jszip": "^3.10.0", - "tmp": "^0.2.1", - "ws": ">=8.11.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "requires": { - "semver": "^7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "requires": { - "fast-safe-stringify": "^2.0.7" - } - }, - "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, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "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 - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "sign-addon": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.2.0.tgz", - "integrity": "sha512-t5CZ4MSKAd3uJBUfjgWfSyKYC1pQS6BMUbgI5OytzMkTOQ9NkdkFE8bB0AJLQIGqDrNS2b1+/ghAP56iuCUE+g==", - "dev": true, - "requires": { - "common-tags": "1.8.2", - "core-js": "3.27.1", - "deepcopy": "2.1.0", - "es6-error": "4.1.1", - "es6-promisify": "7.0.0", - "jsonwebtoken": "9.0.0", - "mz": "2.7.0", - "request": "2.88.2", - "source-map-support": "0.5.21", - "stream-to-promise": "3.0.0" - }, - "dependencies": { - "core-js": { - "version": "3.27.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", - "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - } - } - }, - "sinon": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", - "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "10.0.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sonic-boom": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", - "integrity": "sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==", - "dev": true, - "requires": { - "atomic-sleep": "^1.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", - "dev": true, - "requires": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "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" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - } - } - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-to-array": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", - "dev": true, - "requires": { - "any-promise": "^1.1.0" - } - }, - "stream-to-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-3.0.0.tgz", - "integrity": "sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA==", - "dev": true, - "requires": { - "any-promise": "~1.3.0", - "end-of-stream": "~1.4.1", - "stream-to-array": "~2.3.0" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "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 - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-5.0.0.tgz", - "integrity": "sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==", - "dev": true - }, - "strip-bom-buf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz", - "integrity": "sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==", - "dev": true, - "requires": { - "is-utf8": "^0.2.1" - } - }, - "strip-bom-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-4.0.0.tgz", - "integrity": "sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==", - "dev": true, - "requires": { - "first-chunk-stream": "^3.0.0", - "strip-bom-buf": "^2.0.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "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 - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "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==", - "dev": true - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "tcp-port-used": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", - "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", - "dev": true, - "requires": { - "debug": "4.3.1", - "is2": "^2.0.6" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "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": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "thread-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", - "integrity": "sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==", - "dev": true, - "requires": { - "real-require": "^0.2.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - }, - "dependencies": { - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - } - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "tosource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz", - "integrity": "sha512-N6g8eQ1eerw6Y1pBhdgkubWIiPFwXa2POSUrlL8jth5CyyEWNWzoGKRkO3CaO7Jx27hlJP54muB3btIAbx4MPg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - } - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "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, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "undertaker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", - "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "fast-levenshtein": "^1.0.0", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - } - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true - }, - "update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "requires": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "uri-js": { - "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" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "utf-8-validate": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.2.tgz", - "integrity": "sha512-yd7PQEOW+EgecUzSD7XUXTyq/vREGXk7t7fzGfOvwOAr0Z64h5rfGrmkNk8+ddVmf/FrkjPPhVyYBa7fuSPVTg==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "web-ext": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.5.0.tgz", - "integrity": "sha512-Ymflj7Aq/LOD+zGoyvwRbAPx/yMJeig2OEb/rRXYrWl6NWRI5E0c2iWGqlBcnL45iKrOzz70H438dVeJk0w2ug==", - "dev": true, - "requires": { - "@babel/runtime": "7.20.13", - "@devicefarmer/adbkit": "3.2.3", - "addons-linter": "5.27.0", - "bunyan": "1.8.15", - "camelcase": "7.0.1", - "chrome-launcher": "0.15.1", - "debounce": "1.2.1", - "decamelize": "6.0.0", - "es6-error": "4.1.1", - "firefox-profile": "4.2.2", - "fs-extra": "11.1.0", - "fx-runner": "1.3.0", - "import-fresh": "3.3.0", - "jose": "4.11.2", - "mkdirp": "1.0.4", - "multimatch": "6.0.0", - "mz": "2.7.0", - "node-fetch": "3.3.0", - "node-notifier": "10.0.1", - "open": "8.4.0", - "parse-json": "6.0.2", - "promise-toolbox": "0.21.0", - "sign-addon": "5.2.0", - "source-map-support": "0.5.21", - "strip-bom": "5.0.0", - "strip-json-comments": "5.0.0", - "tmp": "0.2.1", - "update-notifier": "6.0.2", - "watchpack": "2.4.0", - "ws": "8.12.0", - "yargs": "17.6.2", - "zip-dir": "2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true - }, - "decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dev": true, - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - }, - "parse-json": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-6.0.2.tgz", - "integrity": "sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^2.3.1", - "lines-and-columns": "^2.0.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", - "dev": true - } - } - }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true - }, - "webextension-polyfill": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", - "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "when": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==", - "dev": true - }, - "which": { - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "requires": { - "string-width": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "winreg": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/winreg/-/winreg-0.0.12.tgz", - "integrity": "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==", - "dev": true - }, - "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==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "dev": true, - "requires": {} - }, - "xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true - }, - "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==", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "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.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "zip-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-2.0.0.tgz", - "integrity": "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==", - "dev": true, - "requires": { - "async": "^3.2.0", - "jszip": "^3.2.2" - }, - "dependencies": { - "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - } - } - } - } -} diff --git a/package.json b/package.json index 02d41016..2bc9752a 100644 --- a/package.json +++ b/package.json @@ -1,71 +1,43 @@ { - "name": "jabrefbrowserextension", - "scripts": { - "prepare": "ncp node_modules/webextension-polyfill/dist/browser-polyfill.min.js browser-polyfill.min.js", - "dev:firefox": "web-ext run", - "dev:chrome": "web-ext run -t chromium", - "dev:opera": "web-ext run -t chromium --chromium-binary C:\\Users\\Tobi\\AppData\\Local\\Programs\\Opera\\64.0.3417.92\\opera.exe", - "build": "web-ext build", - "lint:firefox": "web-ext lint", - "submit:firefox": "web-ext sign" - }, - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-preset-env": "^1.7.0", - "bluebird": "^3.7.2", - "browserify": "^17.0.0", - "chai": "^4.3.7", - "chalk": "^5.2.0", - "chromedriver": "^109.0.0", - "geckodriver": "^3.2.0", - "gulp": "^4.0.2", - "gulp-jsbeautify": "^0.1.1", - "gulp-plumber": "^1.2.1", - "gulp-rename": "^2.0.0", - "mocha": "^10.2.0", - "ncp": "^2.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "selenium-webdriver": "^4.8.0", - "sinon": "^15.0.1", - "through2": "^4.0.2", - "web-ext": "^7.5.0", - "webextension-polyfill": "^0.10.0", - "yargs": "^17.6.2", - "jsdom": "^21.1.0", - "canvas": "^2.11.0", - "bufferutil": "^4.0.7", - "utf-8-validate": "^6.0.2" - }, - "babel": { - "presets": [ - [ - "env", - { - "modules": false - } - ] - ] - }, - "dependencies": {}, - "repository": { - "type": "git", - "url": "git+https://github.com/JabRef/JabRef-Browser-Extension.git" - }, - "license": "AGPL-3.0-or-later", - "description": "Browser extension for users of the bibliographic reference manager [JabRef](https://www.jabref.org/). It automatically identifies and extracts bibliographic information on websites and sends them to JabRef with one click.", - "bugs": { - "url": "https://github.com/JabRef/JabRef-Browser-Extension/issues" - }, - "homepage": "https://github.com/JabRef/JabRef-Browser-Extension#readme", - "main": "background.js", - "keywords": [ - "bibliographic information extraction", - "collect references", - "JabRef", - "reference management" - ], - "author": "JabRef" + "name": "jabrefbrowserextension", + "description": "Browser extension for users of the bibliographic reference manager [JabRef](https://www.jabref.org/). It automatically identifies and extracts bibliographic information on websites and sends them to JabRef with one click.", + "keywords": [ + "JabRef", + "bibliographic information extraction", + "collect references", + "reference management" + ], + "homepage": "https://github.com/JabRef/JabRef-Browser-Extension#readme", + "bugs": { + "url": "https://github.com/JabRef/JabRef-Browser-Extension/issues" + }, + "license": "AGPL-3.0-or-later", + "author": "JabRef", + "repository": { + "type": "git", + "url": "git+https://github.com/JabRef/JabRef-Browser-Extension.git" + }, + "main": "background.js", + "scripts": { + "dev:firefox": "web-ext run", + "dev:chrome": "web-ext run -t chromium", + "dev:opera": "web-ext run -t chromium --chromium-binary C:\\Users\\Tobi\\AppData\\Local\\Programs\\Opera\\64.0.3417.92\\opera.exe", + "build": "web-ext build", + "lint": "pnpm lint:oxlint && pnpm lint:oxfmt && pnpm lint:firefox", + "lint:firefox": "web-ext lint", + "lint:oxlint": "oxlint", + "lint:oxfmt": "oxfmt --check", + "submit:firefox": "web-ext sign", + "test": "vitest run", + "test:legacy": "node test.js arXiv.org.js" + }, + "devDependencies": { + "globals": "^17.0.0", + "jsdom": "^27.4.0", + "oxfmt": "^0.27.0", + "oxlint": "^1.41.0", + "vitest": "^3.2.4", + "web-ext": "^9.2.0" + }, + "packageManager": "pnpm@10.20.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..7238afc8 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3859 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + globals: + specifier: ^17.0.0 + version: 17.1.0 + jsdom: + specifier: ^27.4.0 + version: 27.4.0 + oxfmt: + specifier: ^0.27.0 + version: 0.27.0 + oxlint: + specifier: ^1.41.0 + version: 1.41.0 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@25.0.10)(jsdom@27.4.0) + web-ext: + specifier: ^9.2.0 + version: 9.2.0 + +packages: + + '@acemir/cssom@0.9.31': + resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} + + '@asamuzakjp/css-color@4.1.1': + resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} + + '@asamuzakjp/dom-selector@6.7.6': + resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.25': + resolution: {integrity: sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==} + engines: {node: '>=18'} + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@devicefarmer/adbkit-logcat@2.1.3': + resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==} + engines: {node: '>= 4'} + + '@devicefarmer/adbkit-monkey@1.2.1': + resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==} + engines: {node: '>= 0.10.4'} + + '@devicefarmer/adbkit@3.3.8': + resolution: {integrity: sha512-7rBLLzWQnBwutH2WZ0EWUkQdihqrnLYCUMaB44hSol9e0/cdIhuNFcqZO0xNheAU6qqHVA8sMiLofkYTgb+lmw==} + engines: {node: '>= 0.10.4'} + hasBin: true + + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.0': + resolution: {integrity: sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@exodus/bytes@1.9.0': + resolution: {integrity: sha512-lagqsvnk09NKogQaN/XrtlWeUF8SRhT12odMvbTIIaVObqzwAogL6jhR4DAp0gPuKoM1AOVrKUshJpRdpMFrww==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + + '@fluent/syntax@0.19.0': + resolution: {integrity: sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==} + engines: {node: '>=14.0.0', npm: '>=7.0.0'} + + '@fregante/relaxed-json@2.0.0': + resolution: {integrity: sha512-PyUXQWB42s4jBli435TDiYuVsadwRHnMc27YaLouINktvTWsL3FcKrRMGawTayFk46X+n5bE23RjUTWQwrukWw==} + engines: {node: '>= 0.10.0'} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@mdn/browser-compat-data@7.1.22': + resolution: {integrity: sha512-pvfjbTDEYTDNKl9u3KbRzeNmU7PrcsFiGzIUbcB9JPq1LziTMs6YpE2x3Gf+2gHOPQzdO/KQ8hAr1Kkkzpklrg==} + + '@oxfmt/darwin-arm64@0.27.0': + resolution: {integrity: sha512-3vwqyzNlVTVFVzHMlrqxb4tgVgHp6FYS0uIxsIZ/SeEDG0azaqiOw/2t8LlJ9f72PKRLWSey+Ak99tiKgpbsnQ==} + cpu: [arm64] + os: [darwin] + + '@oxfmt/darwin-x64@0.27.0': + resolution: {integrity: sha512-5u8mZVLm70v6l1wLZ2MmeNIEzGsruwKw5F7duePzpakPfxGtLpiFNUwe4aBUJULTP6aMzH+A4dA0JOn8lb7Luw==} + cpu: [x64] + os: [darwin] + + '@oxfmt/linux-arm64-gnu@0.27.0': + resolution: {integrity: sha512-aql/LLYriX/5Ar7o5Qivnp/qMTUPNiOCr7cFLvmvzYZa3XL0H8XtbKUfIVm+9ILR0urXQzcml+L8pLe1p8sgEg==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-arm64-musl@0.27.0': + resolution: {integrity: sha512-6u/kNb7hubthg4u/pn3MK/GJLwPgjDvDDnjjr7TC0/OK/xztef8ToXmycxIQ9OeDNIJJf7Z0Ss/rHnKvQOWzRw==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-x64-gnu@0.27.0': + resolution: {integrity: sha512-EhvDfFHO1yrK/Cu75eU1U828lBsW2cV0JITOrka5AjR3PlmnQQ03Mr9ROkWkbPmzAMklXI4Q16eO+4n+7FhS1w==} + cpu: [x64] + os: [linux] + + '@oxfmt/linux-x64-musl@0.27.0': + resolution: {integrity: sha512-1pgjuwMT5sCekuteYZ7LkDsto7DJouaccwjozHqdWohSj2zJpFeSP2rMaC+6JJ1KD5r9HG9sWRuHZGEaoX9uOw==} + cpu: [x64] + os: [linux] + + '@oxfmt/win32-arm64@0.27.0': + resolution: {integrity: sha512-mmuEhXZEhAYAeyjVTWwGKIA3RSb2b/He9wrXkDJPhmqp8qISUzkVg1dQmLEt4hD+wI5rzR+6vchPt521tzuRDA==} + cpu: [arm64] + os: [win32] + + '@oxfmt/win32-x64@0.27.0': + resolution: {integrity: sha512-cXKVkL1DuRq31QjwHqtBEUztyBmM9YZKdeFhsDLBURNdk1CFW42uWsmTsaqrXSoiCj7nCjfP0pwTOzxhQZra/A==} + cpu: [x64] + os: [win32] + + '@oxlint/darwin-arm64@1.41.0': + resolution: {integrity: sha512-K0Bs0cNW11oWdSrKmrollKF44HMM2HKr4QidZQHMlhJcSX8pozxv0V5FLdqB4sddzCY0J9Wuuw+oRAfR8sdRwA==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.41.0': + resolution: {integrity: sha512-1LCCXCe9nN8LbrJ1QOGari2HqnxrZrveYKysWDIg8gFsQglIg00XF/8lRbA0kWHMdLgt4X0wfNYhhFz+c3XXLQ==} + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.41.0': + resolution: {integrity: sha512-Fow7H84Bs8XxuaK1yfSEWBC8HI7rfEQB9eR2A0J61un1WgCas7jNrt1HbT6+p6KmUH2bhR+r/RDu/6JFAvvj4g==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-arm64-musl@1.41.0': + resolution: {integrity: sha512-WoRRDNwgP5W3rjRh42Zdx8ferYnqpKoYCv2QQLenmdrLjRGYwAd52uywfkcS45mKEWHeY1RPwPkYCSROXiGb2w==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-x64-gnu@1.41.0': + resolution: {integrity: sha512-75k3CKj3fOc/a/2aSgO81s3HsTZOFROthPJ+UI2Oatic1LhvH6eKjKfx3jDDyVpzeDS2qekPlc/y3N33iZz5Og==} + cpu: [x64] + os: [linux] + + '@oxlint/linux-x64-musl@1.41.0': + resolution: {integrity: sha512-8r82eBwGPoAPn67ZvdxTlX/Z3gVb+ZtN6nbkyFzwwHWAh8yGutX+VBcVkyrePSl6XgBP4QAaddPnHmkvJjqY0g==} + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@1.41.0': + resolution: {integrity: sha512-aK+DAcckQsNCOXKruatyYuY/ROjNiRejQB1PeJtkZwM21+8rV9ODYbvKNvt0pW+YCws7svftBSFMCpl3ke2unw==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.41.0': + resolution: {integrity: sha512-dVBXkZ6MGLd3owV7jvuqJsZwiF3qw7kEkDVsYVpS/O96eEvlHcxVbaPjJjrTBgikXqyC22vg3dxBU7MW0utGfw==} + cpu: [x64] + os: [win32] + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.2': + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + engines: {node: '>=12'} + + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + cpu: [x64] + os: [win32] + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/node@25.0.10': + resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + addons-linter@9.2.0: + resolution: {integrity: sha512-0rPW6qjbLjBRBT02NZoY9wSc4KfwVV9tWJ0YHPOTT90yULJdYfv6ZzrVSvRyjm+jtqYyg06K0kSVkK3Gmp3yfA==} + engines: {node: '>=18.0.0'} + hasBin: true + + addons-moz-compare@1.3.0: + resolution: {integrity: sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==} + + addons-scanner-utils@9.14.0: + resolution: {integrity: sha512-CXG/r041S/eElF/XNcEtfNtFQERxzhVWFCXcdAB41kqDZ1GmFKA8gbPftstZxNKwLl7Y8yBW2jdmGv4Wd/LTWA==} + peerDependencies: + body-parser: 1.20.3 + express: 4.21.2 + node-fetch: 2.6.11 + safe-compare: 1.1.4 + peerDependenciesMeta: + body-parser: + optional: true + express: + optional: true + node-fetch: + optional: true + safe-compare: + optional: true + + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-differ@4.0.0: + resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + array-union@3.0.1: + resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} + engines: {node: '>=12'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + atomically@2.1.0: + resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} + + balanced-match@1.0.0: + resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.1.2: + resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + engines: {node: '>=20.18.1'} + + chrome-launcher@1.2.0: + resolution: {integrity: sha512-JbuGuBNss258bvGil7FT4HKdC3SC2K7UAEUqiPy3ACS3Yxo3hAW6bvFpCu2HsIJLgTqxgEX6BkujvzZfLpUD0Q==} + engines: {node: '>=12.13.0'} + hasBin: true + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + columnify@1.6.0: + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} + + commander@2.9.0: + resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} + engines: {node: '>= 0.6.x'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@7.1.0: + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} + engines: {node: '>=18'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssstyle@5.3.7: + resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} + engines: {node: '>=20'} + + data-urls@6.0.1: + resolution: {integrity: sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==} + engines: {node: '>=20'} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@6.0.1: + resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.3: + resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-no-unsanitized@4.1.4: + resolution: {integrity: sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==} + peerDependencies: + eslint: ^8 || ^9 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.0: + resolution: {integrity: sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@11.0.0: + resolution: {integrity: sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + firefox-profile@4.7.0: + resolution: {integrity: sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ==} + engines: {node: '>=18'} + hasBin: true + + first-chunk-stream@3.0.0: + resolution: {integrity: sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==} + engines: {node: '>=8'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fx-runner@1.4.0: + resolution: {integrity: sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==} + hasBin: true + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@17.1.0: + resolution: {integrity: sha512-8HoIcWI5fCvG5NADj4bDav+er9B9JMj2vyL2pI8D0eismKyUvPLTSs+Ln3wqhwcp306i73iyVnEKx3F6T47TGw==} + engines: {node: '>=18'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graceful-readlink@1.0.1: + resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} + + growly@1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + is-absolute@0.1.7: + resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==} + engines: {node: '>=0.10.0'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + + is-npm@6.1.0: + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-relative@0.1.3: + resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} + engines: {node: '>=0.10.0'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@1.1.2: + resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsdom@27.4.0: + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-merge-patch@1.0.2: + resolution: {integrity: sha512-M6Vp2GN9L7cfuMXiWOmHj9bEFbeC250iVtcKQbqVgEsDVYnIsrNsbU+h/Y/PkbBQCtEa4Bez+Ebv0zfbC8ObLg==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + ky@1.14.2: + resolution: {integrity: sha512-q3RBbsO5A5zrPhB6CaCS8ZUv+NWCXv6JJT4Em0i264G9W0fdPB8YRfnnEi7Dm7X7omAkBIPojzYJ2D1oHTHqug==} + engines: {node: '>=18'} + + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lighthouse-logger@2.0.2: + resolution: {integrity: sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multimatch@6.0.0: + resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} + engines: {node: '>= 6.13.0'} + + node-notifier@10.0.1: + resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + os-shim@0.1.3: + resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} + engines: {node: '>= 0.4.0'} + + oxfmt@0.27.0: + resolution: {integrity: sha512-FHR0HR3WeMKBuVEQvW3EeiRZXs/cQzNHxGbhCoAIEPr1FVcOa9GCqrKJXPqv2jkzmCg6Wqot+DvN9RzemyFJhw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint@1.41.0: + resolution: {integrity: sha512-Dyaoup82uhgAgp5xLNt4dPdvl5eSJTIzqzL7DcKbkooUE4PDViWURIPlSUF8hu5a+sCnNIp/LlQMDsKoyaLTBA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.11.1' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@10.1.0: + resolution: {integrity: sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==} + hasBin: true + + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + + promise-toolbox@0.21.0: + resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==} + engines: {node: '>=6'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.3.0: + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} + engines: {node: '>=12.20'} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + + shellwords@0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-sync@1.0.15: + resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom-buf@2.0.0: + resolution: {integrity: sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==} + engines: {node: '>=8'} + + strip-bom-stream@4.0.0: + resolution: {integrity: sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==} + engines: {node: '>=8'} + + strip-bom@5.0.0: + resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinypool@2.0.0: + resolution: {integrity: sha512-/RX9RzeH2xU5ADE7n2Ykvmi9ED3FBGPAjw9u3zucrNNaEBIO0HPSYgL0NT7+3p147ojeSdaVu08F6hjpv31HJg==} + engines: {node: ^20.0.0 || >=22.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici@7.19.0: + resolution: {integrity: sha512-Heho1hJD81YChi+uS2RkSjcVO+EQLmLSyUlHyp7Y/wFbxQaGb4WXVKD073JytrjXJVkSZVzoE2MCSOKugFGtOQ==} + engines: {node: '>=20.18.1'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-notifier@7.3.1: + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} + engines: {node: '>=18'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-ext@9.2.0: + resolution: {integrity: sha512-25xjkR/MaP7vbXyAWLYpMO6AnVvsxDXtxhSz9sev+OiM3MkDktnwFZNMq8l/J3gtmc9XAC9lJUgCppBwI/T0tw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} + + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + + when@3.7.7: + resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} + + which@1.2.4: + resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + winreg@0.0.12: + resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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 + + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zip-dir@2.0.0: + resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} + +snapshots: + + '@acemir/cssom@0.9.31': {} + + '@asamuzakjp/css-color@4.1.1': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.4 + + '@asamuzakjp/dom-selector@6.7.6': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.4 + + '@asamuzakjp/nwsapi@2.3.9': {} + + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/runtime@7.28.4': {} + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.25': {} + + '@csstools/css-tokenizer@3.0.4': {} + + '@devicefarmer/adbkit-logcat@2.1.3': {} + + '@devicefarmer/adbkit-monkey@1.2.1': {} + + '@devicefarmer/adbkit@3.3.8': + dependencies: + '@devicefarmer/adbkit-logcat': 2.1.3 + '@devicefarmer/adbkit-monkey': 1.2.1 + bluebird: 3.7.2 + commander: 9.5.0 + debug: 4.3.7 + node-forge: 1.3.3 + split: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@esbuild/aix-ppc64@0.27.4': + optional: true + + '@esbuild/android-arm64@0.27.4': + optional: true + + '@esbuild/android-arm@0.27.4': + optional: true + + '@esbuild/android-x64@0.27.4': + optional: true + + '@esbuild/darwin-arm64@0.27.4': + optional: true + + '@esbuild/darwin-x64@0.27.4': + optional: true + + '@esbuild/freebsd-arm64@0.27.4': + optional: true + + '@esbuild/freebsd-x64@0.27.4': + optional: true + + '@esbuild/linux-arm64@0.27.4': + optional: true + + '@esbuild/linux-arm@0.27.4': + optional: true + + '@esbuild/linux-ia32@0.27.4': + optional: true + + '@esbuild/linux-loong64@0.27.4': + optional: true + + '@esbuild/linux-mips64el@0.27.4': + optional: true + + '@esbuild/linux-ppc64@0.27.4': + optional: true + + '@esbuild/linux-riscv64@0.27.4': + optional: true + + '@esbuild/linux-s390x@0.27.4': + optional: true + + '@esbuild/linux-x64@0.27.4': + optional: true + + '@esbuild/netbsd-arm64@0.27.4': + optional: true + + '@esbuild/netbsd-x64@0.27.4': + optional: true + + '@esbuild/openbsd-arm64@0.27.4': + optional: true + + '@esbuild/openbsd-x64@0.27.4': + optional: true + + '@esbuild/openharmony-arm64@0.27.4': + optional: true + + '@esbuild/sunos-x64@0.27.4': + optional: true + + '@esbuild/win32-arm64@0.27.4': + optional: true + + '@esbuild/win32-ia32@0.27.4': + optional: true + + '@esbuild/win32-x64@0.27.4': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.0)': + dependencies: + eslint: 9.39.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.0': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@exodus/bytes@1.9.0': {} + + '@fluent/syntax@0.19.0': {} + + '@fregante/relaxed-json@2.0.0': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@mdn/browser-compat-data@7.1.22': {} + + '@oxfmt/darwin-arm64@0.27.0': + optional: true + + '@oxfmt/darwin-x64@0.27.0': + optional: true + + '@oxfmt/linux-arm64-gnu@0.27.0': + optional: true + + '@oxfmt/linux-arm64-musl@0.27.0': + optional: true + + '@oxfmt/linux-x64-gnu@0.27.0': + optional: true + + '@oxfmt/linux-x64-musl@0.27.0': + optional: true + + '@oxfmt/win32-arm64@0.27.0': + optional: true + + '@oxfmt/win32-x64@0.27.0': + optional: true + + '@oxlint/darwin-arm64@1.41.0': + optional: true + + '@oxlint/darwin-x64@1.41.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.41.0': + optional: true + + '@oxlint/linux-arm64-musl@1.41.0': + optional: true + + '@oxlint/linux-x64-gnu@1.41.0': + optional: true + + '@oxlint/linux-x64-musl@1.41.0': + optional: true + + '@oxlint/win32-arm64@1.41.0': + optional: true + + '@oxlint/win32-x64@1.41.0': + optional: true + + '@pinojs/redact@0.4.0': {} + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@rollup/rollup-android-arm-eabi@4.59.0': + optional: true + + '@rollup/rollup-android-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-x64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.59.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.59.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.59.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.59.0': + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/minimatch@3.0.5': {} + + '@types/node@25.0.10': + dependencies: + undici-types: 7.16.0 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 25.0.10 + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@25.0.10))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@25.0.10) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + addons-linter@9.2.0: + dependencies: + '@fluent/syntax': 0.19.0 + '@fregante/relaxed-json': 2.0.0 + '@mdn/browser-compat-data': 7.1.22 + addons-moz-compare: 1.3.0 + addons-scanner-utils: 9.14.0 + ajv: 8.17.1 + chalk: 4.1.2 + cheerio: 1.1.2 + columnify: 1.6.0 + common-tags: 1.8.2 + deepmerge: 4.3.1 + eslint: 9.39.0 + eslint-plugin-no-unsanitized: 4.1.4(eslint@9.39.0) + eslint-visitor-keys: 5.0.0 + espree: 11.0.0 + esprima: 4.0.1 + fast-json-patch: 3.1.1 + image-size: 2.0.2 + json-merge-patch: 1.0.2 + pino: 10.1.0 + semver: 7.7.3 + source-map-support: 0.5.21 + upath: 2.0.1 + yargs: 17.7.2 + yauzl: 2.10.0 + transitivePeerDependencies: + - body-parser + - express + - jiti + - node-fetch + - safe-compare + - supports-color + + addons-moz-compare@1.3.0: {} + + addons-scanner-utils@9.14.0: + dependencies: + '@types/yauzl': 2.10.3 + common-tags: 1.8.2 + first-chunk-stream: 3.0.0 + strip-bom-stream: 4.0.0 + upath: 2.0.1 + yauzl: 2.10.0 + + adm-zip@0.5.16: {} + + agent-base@7.1.4: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + array-differ@4.0.0: {} + + array-union@3.0.1: {} + + assertion-error@2.0.1: {} + + async@3.2.6: {} + + atomic-sleep@1.0.0: {} + + atomically@2.1.0: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + + balanced-match@1.0.0: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + cac@6.7.14: {} + + callsites@3.1.0: {} + + camelcase@8.0.0: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + check-error@2.1.3: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.1.2: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.19.0 + whatwg-mimetype: 4.0.0 + + chrome-launcher@1.2.0: + dependencies: + '@types/node': 25.0.10 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 2.0.2 + transitivePeerDependencies: + - supports-color + + cli-boxes@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + columnify@1.6.0: + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + commander@2.9.0: + dependencies: + graceful-readlink: 1.0.1 + + commander@9.5.0: {} + + common-tags@1.8.2: {} + + concat-map@0.0.1: {} + + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@7.1.0: + dependencies: + atomically: 2.1.0 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + + core-util-is@1.0.3: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.0.2 + + css-what@6.2.2: {} + + cssstyle@5.3.7: + dependencies: + '@asamuzakjp/css-color': 4.1.1 + '@csstools/css-syntax-patches-for-csstree': 1.0.25 + css-tree: 3.1.0 + lru-cache: 11.2.4 + + data-urls@6.0.1: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 15.1.0 + + debounce@1.2.1: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize@6.0.1: {} + + decimal.js@10.6.0: {} + + deep-eql@5.0.2: {} + + deep-extend@0.6.0: {} + + deep-is@0.1.3: {} + + deepmerge@4.3.1: {} + + default-browser-id@5.0.1: {} + + default-browser@5.4.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-lazy-prop@3.0.0: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + entities@4.5.0: {} + + entities@6.0.1: {} + + entities@7.0.1: {} + + es-module-lexer@1.7.0: {} + + es6-error@4.1.1: {} + + esbuild@0.27.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 + + escalade@3.2.0: {} + + escape-goat@4.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-no-unsanitized@4.1.4(eslint@9.39.0): + dependencies: + eslint: 9.39.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.0: {} + + eslint@9.39.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.0 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + espree@11.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 5.0.0 + + esprima@4.0.1: {} + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + expect-type@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-patch@3.1.1: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + firefox-profile@4.7.0: + dependencies: + adm-zip: 0.5.16 + fs-extra: 11.3.3 + ini: 4.1.3 + minimist: 1.2.8 + xml2js: 0.6.2 + + first-chunk-stream@3.0.0: {} + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + fx-runner@1.4.0: + dependencies: + commander: 2.9.0 + shell-quote: 1.7.3 + spawn-sync: 1.0.15 + when: 3.7.7 + which: 1.2.4 + winreg: 0.0.12 + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globals@14.0.0: {} + + globals@17.1.0: {} + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + graceful-readlink@1.0.1: {} + + growly@1.3.0: {} + + has-flag@4.0.0: {} + + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.9.0 + transitivePeerDependencies: + - '@noble/hashes' + + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + image-size@2.0.2: {} + + immediate@3.0.6: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + index-to-position@1.2.0: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + ini@4.1.3: {} + + is-absolute@0.1.7: + dependencies: + is-relative: 0.1.3 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-in-ci@1.0.0: {} + + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + + is-npm@6.1.0: {} + + is-path-inside@4.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-relative@0.1.3: {} + + is-utf8@0.2.1: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isexe@1.1.2: {} + + isexe@2.0.0: {} + + jose@5.9.6: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsdom@27.4.0: + dependencies: + '@acemir/cssom': 0.9.31 + '@asamuzakjp/dom-selector': 6.7.6 + '@exodus/bytes': 1.9.0 + cssstyle: 5.3.7 + data-urls: 6.0.1 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.19.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + - bufferutil + - supports-color + - utf-8-validate + + json-buffer@3.0.1: {} + + json-merge-patch@1.0.2: + dependencies: + fast-deep-equal: 3.1.3 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + ky@1.14.2: {} + + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lighthouse-logger@2.0.2: + dependencies: + debug: 4.4.3 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loupe@3.2.1: {} + + lru-cache@11.2.4: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + marky@1.3.0: {} + + mdn-data@2.12.2: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.8: {} + + ms@2.1.3: {} + + multimatch@6.0.0: + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 4.0.0 + array-union: 3.0.1 + minimatch: 3.1.2 + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + node-forge@1.3.3: {} + + node-notifier@10.0.1: + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 7.7.3 + shellwords: 0.1.1 + uuid: 8.3.2 + which: 2.0.2 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + on-exit-leak-free@2.1.2: {} + + open@11.0.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + + optionator@0.9.4: + 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.5 + + os-shim@0.1.3: {} + + oxfmt@0.27.0: + dependencies: + tinypool: 2.0.0 + optionalDependencies: + '@oxfmt/darwin-arm64': 0.27.0 + '@oxfmt/darwin-x64': 0.27.0 + '@oxfmt/linux-arm64-gnu': 0.27.0 + '@oxfmt/linux-arm64-musl': 0.27.0 + '@oxfmt/linux-x64-gnu': 0.27.0 + '@oxfmt/linux-x64-musl': 0.27.0 + '@oxfmt/win32-arm64': 0.27.0 + '@oxfmt/win32-x64': 0.27.0 + + oxlint@1.41.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.41.0 + '@oxlint/darwin-x64': 1.41.0 + '@oxlint/linux-arm64-gnu': 1.41.0 + '@oxlint/linux-arm64-musl': 1.41.0 + '@oxlint/linux-x64-gnu': 1.41.0 + '@oxlint/linux-x64-musl': 1.41.0 + '@oxlint/win32-arm64': 1.41.0 + '@oxlint/win32-x64': 1.41.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json@10.0.1: + dependencies: + ky: 1.14.2 + registry-auth-token: 5.1.1 + registry-url: 6.0.1 + semver: 7.7.3 + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.28.6 + index-to-position: 1.2.0 + type-fest: 4.41.0 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parse5@8.0.0: + dependencies: + entities: 6.0.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.1.0: {} + + pino@10.1.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + powershell-utils@0.1.0: {} + + prelude-ls@1.2.1: {} + + process-nextick-args@2.0.1: {} + + process-warning@5.0.0: {} + + promise-toolbox@0.21.0: + dependencies: + make-error: 1.3.6 + + proto-list@1.2.4: {} + + punycode@2.3.1: {} + + pupa@3.3.0: + dependencies: + escape-goat: 4.0.0 + + quick-format-unescaped@4.0.4: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + real-require@0.2.0: {} + + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.2 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + rollup@4.59.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 + fsevents: 2.3.3 + + run-applescript@7.1.0: {} + + safe-buffer@5.1.2: {} + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + sax@1.4.4: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + semver@7.7.3: {} + + setimmediate@1.0.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.7.3: {} + + shellwords@0.1.1: {} + + siginfo@2.0.0: {} + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.0.2: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spawn-sync@1.0.15: + dependencies: + concat-stream: 1.6.2 + os-shim: 0.1.3 + + split2@4.2.0: {} + + split@1.0.1: + dependencies: + through: 2.3.8 + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom-buf@2.0.0: + dependencies: + is-utf8: 0.2.1 + + strip-bom-stream@4.0.0: + dependencies: + first-chunk-stream: 3.0.0 + strip-bom-buf: 2.0.0 + + strip-bom@5.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strip-json-comments@5.0.3: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + symbol-tree@3.2.4: {} + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + through@2.3.8: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinypool@2.0.0: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + tldts-core@7.0.19: {} + + tldts@7.0.19: + dependencies: + tldts-core: 7.0.19 + + tmp@0.2.5: {} + + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.19 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@4.41.0: {} + + typedarray@0.0.6: {} + + undici-types@7.16.0: {} + + undici@7.19.0: {} + + universalify@2.0.1: {} + + upath@2.0.1: {} + + update-notifier@7.3.1: + dependencies: + boxen: 8.0.1 + chalk: 5.6.2 + configstore: 7.1.0 + is-in-ci: 1.0.0 + is-installed-globally: 1.0.0 + is-npm: 6.1.0 + latest-version: 9.0.0 + pupa: 3.3.0 + semver: 7.7.3 + xdg-basedir: 5.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + vite-node@3.2.4(@types/node@25.0.10): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.1(@types/node@25.0.10) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.1(@types/node@25.0.10): + dependencies: + esbuild: 0.27.4 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.8 + rollup: 4.59.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.10 + fsevents: 2.3.3 + + vitest@3.2.4(@types/node@25.0.10)(jsdom@27.4.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@25.0.10)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.1(@types/node@25.0.10) + vite-node: 3.2.4(@types/node@25.0.10) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.0.10 + jsdom: 27.4.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-ext@9.2.0: + dependencies: + '@babel/runtime': 7.28.4 + '@devicefarmer/adbkit': 3.3.8 + addons-linter: 9.2.0 + camelcase: 8.0.0 + chrome-launcher: 1.2.0 + debounce: 1.2.1 + decamelize: 6.0.1 + es6-error: 4.1.1 + firefox-profile: 4.7.0 + fx-runner: 1.4.0 + https-proxy-agent: 7.0.6 + jose: 5.9.6 + jszip: 3.10.1 + multimatch: 6.0.0 + node-notifier: 10.0.1 + open: 11.0.0 + parse-json: 8.3.0 + pino: 10.1.0 + promise-toolbox: 0.21.0 + source-map-support: 0.5.21 + strip-bom: 5.0.0 + strip-json-comments: 5.0.3 + tmp: 0.2.5 + update-notifier: 7.3.1 + watchpack: 2.4.4 + yargs: 17.7.2 + zip-dir: 2.0.0 + transitivePeerDependencies: + - body-parser + - express + - jiti + - node-fetch + - safe-compare + - supports-color + + webidl-conversions@8.0.1: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-mimetype@5.0.0: {} + + whatwg-url@15.1.0: + dependencies: + tr46: 6.0.0 + webidl-conversions: 8.0.1 + + when-exit@2.1.5: {} + + when@3.7.7: {} + + which@1.2.4: + dependencies: + is-absolute: 0.1.7 + isexe: 1.1.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + winreg@0.0.12: {} + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + ws@8.19.0: {} + + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 + + xdg-basedir@5.1.0: {} + + xml-name-validator@5.0.0: {} + + xml2js@0.6.2: + dependencies: + sax: 1.4.4 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xmlchars@2.2.0: {} + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + zip-dir@2.0.0: + dependencies: + async: 3.2.6 + jszip: 3.10.1 diff --git a/scripts/import_and_patch_translators.py b/scripts/import_and_patch_translators.py new file mode 100755 index 00000000..476e076a --- /dev/null +++ b/scripts/import_and_patch_translators.py @@ -0,0 +1,438 @@ +#!/usr/bin/env python3 +""" +Clone or add Zotero translators as a submodule under translators/zotero +and patch each .js file to ensure the initial JSON is commented and +append ES module exports. + +Usage: python3 scripts/import_and_patch_translators.py +""" + +import json +import re +import shutil +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +TARGET = ROOT / "translators" / "zotero" +ZOTERO_REPO = "https://github.com/zotero/translators" +ZOTERO_SUBMODULES = { + "translators/zotero": "esm", + "sources/zotero-translate": "async-sandbox", + "sources/zotero-utilities": "fix-import", +} + +SANDBOX_PATH = "../../sources/sandbox.js" +REQUIRED_SANDBOX_IMPORTS = [ + "ZU", + "Zotero", + "Z", + "text", + "requestJSON", + "requestText", + "attr", +] +FW_LINE_PREFIX = "/* FW LINE 59:b820c6d */" +TRANSLATOR_EXPORT_CANDIDATES = [ + "detectWeb", + "doWeb", + "detectImport", + "doImport", + "detectSearch", + "doSearch", + "doExport", +] + + +def should_ignore(path: Path) -> bool: + name = path.name + # Ignore dotfiles and any path component starting with a dot (e.g., .ci/) + for part in path.parts: + if part.startswith("."): + return True + if name in ("jsconfig.json", "AGENTS.md"): + return True + return False + + +def run(cmd, **kwargs): + print(">", " ".join(cmd)) + return subprocess.run(cmd, check=True, **kwargs) + + +def ensure_repo(): + for submodule, branch in ZOTERO_SUBMODULES.items(): + submodule_path = str(ROOT / submodule) + run(["git", "-C", submodule_path, "fetch", "upstream", "master"]) + run(["git", "-C", submodule_path, "checkout", "master"]) + run(["git", "-C", submodule_path, "pull", "--ff-only", "upstream", "master"]) + run(["git", "-C", submodule_path, "push", "origin", "master"]) + run(["git", "-C", submodule_path, "checkout", branch]) + + run(["git", "submodule", "update", "--remote", "--merge"]) + +def export_translator_info(text: str) -> tuple[str, bool]: + # Keep idempotent if already prefixed + if re.match(r"^\s*export\s+const\s+ZOTERO_TRANSLATOR_INFO\s*=", text): + return text, False + + # If it starts with '{', convert that leading object to an exported declaration + s = text.lstrip() + prefix_ws = text[: len(text) - len(s)] + if not s.startswith("{"): + return text, False + + text = prefix_ws + "export const ZOTERO_TRANSLATOR_INFO = " + s + return text, True + + +def _is_function_defined(text: str, fn_name: str) -> bool: + patterns = [ + rf"(^|\n)\s*(?:async\s+)?function\s+{re.escape(fn_name)}\s*\(", + rf"(^|\n)\s*(?:var|let|const)\s+{re.escape(fn_name)}\s*=\s*(?:async\s+)?function\b", + rf"(^|\n)\s*(?:var|let|const)\s+{re.escape(fn_name)}\s*=\s*(?:async\s+)?\([^)]*\)\s*=>", + rf"(^|\n)\s*{re.escape(fn_name)}\s*=\s*(?:async\s+)?function\b", + ] + return any(re.search(pattern, text) for pattern in patterns) + + +def _parse_generated_export_specs(specs_text: str) -> list[str]: + return [spec.strip() for spec in specs_text.split(",") if spec.strip()] + + +def _build_exports_body_from_specs(specs: list[str]) -> str: + entries = [] + for spec in specs: + if " as " in spec: + local_name, export_name = [part.strip() for part in spec.split(" as ", 1)] + entries.append(f"{export_name}: {local_name}") + else: + entries.append(spec) + if not entries: + return "" + return " " + ", ".join(entries) + " " + + +def _extract_and_remove_exports_object(text: str) -> tuple[str, str | None, bool]: + m = re.search(r"(?:export\s+)?(?:var|let|const)\s+exports\s*=\s*\{", text) + if not m: + return text, None, False + + declaration_start = m.start() + open_brace_index = text.find("{", declaration_start) + if open_brace_index == -1: + return text, None, False + + i = open_brace_index + depth = 0 + in_str = None + esc = False + close_brace_index = None + while i < len(text): + ch = text[i] + if in_str: + if esc: + esc = False + elif ch == "\\": + esc = True + elif ch == in_str: + in_str = None + else: + if ch == '"' or ch == "'": + in_str = ch + elif ch == "{": + depth += 1 + elif ch == "}": + depth -= 1 + if depth == 0: + close_brace_index = i + break + i += 1 + + if close_brace_index is None: + return text, None, False + + body = text[open_brace_index + 1 : close_brace_index] + + end = close_brace_index + 1 + if end < len(text) and text[end] == ";": + end += 1 + + return text[:declaration_start] + text[end:], body, True + + +def _remove_generated_export_blocks(text: str) -> tuple[str, list[str], str | None, bool]: + generated_block_re = re.compile( + r"\n?(?:(?:// Export translator compatibility exports for adapter\n)+" + r"export\s+const\s+exports\s*=\s*\{([\s\S]*?)\};\n*)?" + r"// Export translator functions as ES module bindings for adapter\n" + r"export\s*\{([^}]*)\};\s*\Z", + re.MULTILINE, + ) + m = generated_block_re.search(text) + if m: + return text[:m.start()].rstrip(), _parse_generated_export_specs(m.group(2)), m.group(1), True + + compatibility_only_re = re.compile( + r"\n?(?:// Export translator compatibility exports for adapter\n)+" + r"export\s+const\s+exports\s*=\s*\{([\s\S]*?)\};\s*\Z", + re.MULTILINE, + ) + m = compatibility_only_re.search(text) + if m: + return text[:m.start()].rstrip(), [], m.group(1), True + + return text, [], None, False + + +def append_exports(text: str) -> tuple[str, bool]: + original_text = text + text, old_generated_specs, old_generated_exports_body, removed_generated_blocks = _remove_generated_export_blocks(text) + text, exports_body, removed_exports_object = _extract_and_remove_exports_object(text) + + present = [fn for fn in TRANSLATOR_EXPORT_CANDIDATES if _is_function_defined(text, fn)] + specs: list[str] = [] + seen_specs: set[str] = set() + + for fn in present: + if fn not in seen_specs: + seen_specs.add(fn) + specs.append(fn) + + compatibility_exports_body = exports_body or old_generated_exports_body + if compatibility_exports_body is None and old_generated_specs: + extra_specs = [spec for spec in old_generated_specs if spec not in seen_specs] + compatibility_exports_body = _build_exports_body_from_specs(extra_specs) + + snippets = [] + if compatibility_exports_body and compatibility_exports_body.strip(): + snippets.append( + "\n// Export translator compatibility exports for adapter\n" + + "export const exports = {" + + compatibility_exports_body + + "};\n" + ) + + if specs: + export_line = f"export {{ {', '.join(specs)} }};" + snippets.append( + "\n// Export translator functions as ES module bindings for adapter\n" + + export_line + + "\n" + ) + + if not snippets: + return text, text != original_text + + candidate = text.rstrip() + "".join(snippets) + if candidate == original_text or candidate + "\n" == original_text: + return original_text, False + + return candidate, True + + +def ensure_sandbox_import(text: str) -> tuple[str, bool]: + import_re = re.compile( + r"^\s*import\s*\{\s*([^}]*)\}\s*from\s*[\"']\.\./\.\./sources/sandbox\.js[\"'];?\s*$", + re.MULTILINE, + ) + match = import_re.search(text) + + if match: + new_line = f'import {{ {", ".join(REQUIRED_SANDBOX_IMPORTS)} }} from "{SANDBOX_PATH}";' + old_line = match.group(0) + if old_line.strip() == new_line: + return text, False + return text.replace(old_line, new_line), True + + import_line = ( + f'import {{ {", ".join(REQUIRED_SANDBOX_IMPORTS)} }} from "{SANDBOX_PATH}";\n\n' + ) + + return import_line + text, True + + +def has_fw_line(text: str) -> bool: + return any(line.lstrip().startswith(FW_LINE_PREFIX) for line in text.splitlines()) + + +def extract_json_from_text(text: str): + """ + Try to parse JSON from the provided text. First attempt a direct json.loads, + otherwise try to locate a balanced {...} substring and parse that. + Returns the parsed object on success, or None on failure. + """ + try: + return json.loads(text) + except Exception: + s = text.strip() + if not s: + return None + start = s.find("{") + if start == -1: + return None + + i = start + depth = 0 + in_str = None + esc = False + end = None + while i < len(s): + ch = s[i] + if in_str: + if esc: + esc = False + elif ch == "\\": + esc = True + elif ch == in_str: + in_str = None + else: + if ch == '"' or ch == "'": + in_str = ch + elif ch == "{": + depth += 1 + elif ch == "}": + depth -= 1 + if depth == 0: + end = i + break + i += 1 + + if end is None: + return None + + try: + return json.loads(s[start : end + 1]) + except Exception: + return None + + +def extract_declared_translator_info(text: str): + m = re.search( + r"(?:export\s+)?(?:const|let|var)\s+ZOTERO_TRANSLATOR_INFO\s*=\s*", + text, + ) + if not m: + return None + return extract_json_from_text(text[m.end() :]) + + +def process_file(path: Path) -> tuple[bool, bool, bool, bool]: + commented = False + imported = False + exported = False + + text = path.read_text(encoding="utf-8") + + # Delete old translators that still use the deprecated "Zotero Framework" + # These are not valid esm, and are deprecated anyway: https://github.com/zotero/translators/issues/3105 + if has_fw_line(text): + path.unlink() + return commented, imported, exported, True + + text, commented = export_translator_info(text) + text, imported = ensure_sandbox_import(text) + text, exported = append_exports(text) + + if commented or imported or exported: + path.write_text(text, encoding="utf-8") + + return commented, imported, exported, False + + +def patch_all(): + js_files = [f for f in TARGET.rglob("*.js") if not should_ignore(f)] + if not js_files: + print("No .js files found under", TARGET) + return + + total = 0 + commented_count = 0 + imported_count = 0 + exported_count = 0 + deleted_count = 0 + for f in js_files: + total += 1 + try: + commented, imported, exported, deleted = process_file(f) + if commented: + commented_count += 1 + if imported: + imported_count += 1 + if exported: + exported_count += 1 + if deleted: + deleted_count += 1 + except Exception as e: + print("Error processing", f, e) + + print( + f"Processed {total} files: deleted {deleted_count}, commented {commented_count}, sandbox imports updated {imported_count}, exports updated {exported_count}" + ) + + +def generate_manifest(): + """Scan translators in TARGET and generate translators/manifest.json + by extracting the leading commented JSON header from each .js file. + """ + out = [] + for f in sorted(TARGET.rglob("*.js")): + if should_ignore(f): + continue + try: + txt = f.read_text(encoding="utf-8") + except Exception: + continue + + header = extract_declared_translator_info(txt) or None + + rel = f.relative_to(ROOT).as_posix() + entry = { + "path": rel, + "label": f.stem, + } + if header: + if "label" in header: + entry["label"] = header.get("label") + if "translatorID" in header: + entry["translatorID"] = header.get("translatorID") + if "target" in header: + entry["target"] = header.get("target") + if "browserSupport" in header: + entry["browserSupport"] = header.get("browserSupport") + if "translatorType" in header: + entry["translatorType"] = header.get("translatorType") + if "creator" in header: + entry["creator"] = header.get("creator") + if "priority" in header: + entry["priority"] = header.get("priority") + if "lastUpdated" in header: + entry["lastUpdated"] = header.get("lastUpdated") + if "minVersion" in header and header.get("minVersion") is not None: + entry["minVersion"] = header.get("minVersion") + if "maxVersion" in header and header.get("maxVersion") is not None: + entry["maxVersion"] = header.get("maxVersion") + + out.append(entry) + + manifest_path = ROOT / "translators" / "manifest.json" + try: + manifest_path.write_text(json.dumps(out, indent=2) + "\n", encoding="utf-8") + print("Wrote manifest to", manifest_path) + except Exception as e: + print("Failed to write manifest:", e) + +def main(): + try: + ensure_repo() + except Exception as e: + print("Error ensuring repo:", e) + sys.exit(1) + + patch_all() + generate_manifest() + + +if __name__ == "__main__": + main() diff --git a/sources/contentScript.js b/sources/contentScript.js new file mode 100644 index 00000000..01e8f2c8 --- /dev/null +++ b/sources/contentScript.js @@ -0,0 +1,83 @@ +console.debug("[contentScript] started"); + +browser.runtime.onMessage.addListener(async (msg, _sender, _sendResponse) => { + console.debug("[contentScript] received message: %o", msg); + + await import(browser.runtime.getURL("./sources/setupZotero.js")); + await import(browser.runtime.getURL("./sources/zotero-translate/src/translator.js")); + await import( + browser.runtime.getURL("./sources/zotero-translate/src/translation/translate_item.js") + ); + Zotero.isInject = true; + Zotero.COHTTP = { + request: async (method, url, options = {}) => { + const response = await browser.runtime.sendMessage({ + type: "COHTTP.request", + method, + url, + options, + }); + // From upstream: https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/messages.js#L319-L337 + response.getAllResponseHeaders = () => response.responseHeaders; + response.getResponseHeader = function (name) { + let match = response.responseHeaders.match(new RegExp(`^${name}: (.*)$`, "mi")); + return match ? match[1] : null; + }; + let isArrayBuffer = + Array.isArray(response.response) && response.responseType === "arraybuffer"; + if (isArrayBuffer) { + response.response = await unpackArrayBuffer(response.response); + } else { + response.responseText = response.response; + } + return response; + }, + }; + Zotero.Translate.ItemSaver.prototype.saveItems = async function ( + jsonItems, + _attachmentCallback, + _itemsDoneCallback, + ) { + return jsonItems; + }; + + if (!msg) return; + const { url } = msg; + + // Dynamic import as workaround for Chrome's content script limitations (no module support) + // see https://stackoverflow.com/a/53033388/873661 + const { createTranslateEngine } = await import( + browser.runtime.getURL("./sources/translateEngine.js") + ); + const translateEngine = await createTranslateEngine(url); + + if (msg.type === "detectTranslators") { + const translatorsInfo = await translateEngine.detect(); + return { + translatorsInfo, + }; + } + + if (msg.type !== "runTranslators") return; + + const translators = msg.translatorsInfo.map((info) => { + const path = info.path; + if (!path) { + throw new Error(`Translator ${info.label} is missing a path`); + } + const translator = new Zotero.Translator(info); + // Zotero expects the path to be under `file` + translator.file = { + path: path, + }; + return translator; + }); + console.debug( + "Content script received runTranslators message for url %o with translators %o", + url, + translators, + ); + const result = await translateEngine.translate(document, translators); + console.debug("Content script obtained translation result %o", result); + await browser.runtime.sendMessage({ type: "offscreenResult", url, items: result.items }); +}); diff --git a/sources/http.js b/sources/http.js new file mode 100644 index 00000000..76fb16a7 --- /dev/null +++ b/sources/http.js @@ -0,0 +1,640 @@ +// Taken from https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/http.js + +/* + ***** BEGIN LICENSE BLOCK ***** + + Copyright © 2011 Center for History and New Media + George Mason University, Fairfax, Virginia, USA + http://zotero.org + + This file is part of Zotero. + + Zotero is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Zotero is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with Zotero. If not, see . + + ***** END LICENSE BLOCK ***** +*/ + +const MAX_BACKOFF = 64e3; + +const HEADERS_SPECIAL_HANDLING = ["User-Agent", "Cookie", "Referer"]; + +/** + * Functions for performing HTTP requests, both via XMLHTTPRequest and using a hidden browser + * @namespace + */ +Zotero.HTTP = new (function () { + this.VALID_DOM_PARSER_CONTENT_TYPES = new Set([ + "text/html", + "text/xml", + "application/xml", + "application/xhtml+xml", + "image/svg+xml", + ]); + + this.StatusError = function (xmlhttp, url, responseText) { + this.message = `HTTP request to ${url} rejected with status ${xmlhttp.status}`; + this.status = xmlhttp.status; + if (xmlhttp.getResponseHeader && xmlhttp.getResponseHeader("Retry-After")) { + this.retryAfter = xmlhttp.getResponseHeader("Retry-After"); + } + try { + this.responseText = responseText.substr(0, 1024); + } catch (e) {} + }; + this.StatusError.prototype = Object.create(Error.prototype); + + this.TimeoutError = function (url, ms) { + this.message = `HTTP request to ${url} has timed out after ${ms}ms`; + }; + this.TimeoutError.prototype = Object.create(Error.prototype); + + /** + * Get a promise for a HTTP request + * + * @param {String} method The method of the request ("GET", "POST", "HEAD", or "OPTIONS") + * @param {String} url URL to request + * @param {Object} [options] Options for HTTP request:
      + *
    • body - The body of a POST request
    • + *
    • headers - Object of HTTP headers to send with the request
    • + *
    • debug - Log response text and status code
    • + *
    • logBodyLength - Length of request body to log
    • + *
    • timeout - Request timeout specified in milliseconds [default 15000]
    • + *
    • responseType - The response type of the request from the XHR spec
    • + *
    • responseCharset - The charset the response should be interpreted as
    • + *
    • successCodes - HTTP status codes that are considered successful, or FALSE to allow all
    • + *
    • maxBackoff - how many times should a HTTP 429 backoff be attempted before the request fails + * [default 0]
    • + *
    • forceInject - force the request to be sent via the inject script, even if it's not a same-origin request + * [default false]
    • + *
    + * @return {Promise} A promise resolved with the XMLHttpRequest object if the + * request succeeds, or rejected if the browser is offline or a non-2XX status response + * code is received (or a code not in options.successCodes if provided). + */ + this.request = async function (method, url, options = {}) { + // Default options + options = Object.assign( + { + body: null, + headers: {}, + debug: false, + logBodyLength: 1024, + timeout: 15000, + responseType: "", + responseCharset: null, + successCodes: null, + maxBackoff: 10, + backoff: 0, + forceInject: false, + }, + options, + ); + let originalOptions = Zotero.Utilities.deepCopy(options); + + try { + if (Zotero.isManifestV3) { + return await Zotero.HTTP._requestFetch(method, url, options); + } else { + return await Zotero.HTTP._requestXHR(method, url, options); + } + } catch (e) { + if ((e.status === 429 || e.retryAfter) && options.backoff < options.maxBackoff) { + if (e.status === 429) { + Zotero.debug(`HTTP 429 returned, attempting a backoff #${options.backoff + 1}`); + } else { + Zotero.debug( + `HTTP ${e.status} returned with Retry-After: ${e.retryAfter}, attempting a backoff #${options.backoff + 1}`, + ); + } + if (e.retryAfter && parseInt(e.retryAfter) == e.retryAfter) { + if (e.retryAfter * 1000 > MAX_BACKOFF) { + Zotero.debug( + `HTTP 429 Retry-After ${e.retryAfter} is higher than max backoff. Not retrying.`, + ); + throw e; + } + await Zotero.Promise.delay(e.retryAfter * 1000); + } else { + await Zotero.Promise.delay( + Math.min(Math.pow(2, options.backoff) * 1000, MAX_BACKOFF) + + Math.round(Math.random() * 1000), + ); + } + originalOptions.backoff++; + return Zotero.HTTP.request(method, url, originalOptions); + } + throw e; + } + }; + + this._requestXHR = async function (method, url, options) { + var useContentXHR = false; + let DNRRuleID; + + // There is no reason to run xhr not from background page for web extensions since those + // requests send full browser cookies. + // That is not the case with Safari though and without cookies requests to proxied + // resources fail, so we use on-page xhr there. + // However, if the request requires replacing user-agent, we still send the request via + // the background page since we're unable to replace user-agent via an on-page xhr and + // since user-agent option is explicitly set, it takes priority. + let sameOriginRequestViaSafari = + Zotero.isSafari && Zotero.HTTP.isSameOrigin(url) && !options.headers["User-Agent"]; + if (Zotero.isInject && !options.forceInject && !sameOriginRequestViaSafari) { + // The privileged XHR that Firefox makes available to content scripts so that they + // can make cross-domain requests doesn't include the Referer header in requests [1], + // so sites that check for it don't work properly. As long as we're not making a + // cross-domain request, we can use the content XHR that it provides, which does + // include Referer. Chrome's XHR in content scripts includes Referer by default. + // + // [1] https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#XHR_and_Fetch + if (Zotero.HTTP.isSameOrigin(url) && !(Zotero.isSafari && options.headers["User-Agent"])) { + if (typeof content != "undefined" && content.XMLHttpRequest) { + Zotero.debug("Using content XHR"); + useContentXHR = true; + } + } else { + if (Zotero.isBookmarklet) { + Zotero.debug("HTTP: Attempting cross-site request from bookmarklet; this may fail"); + } else { + // Make a cross-origin request via the background page, parsing the responseText with + // DOMParser and returning a Proxy with 'response' set to the parsed document + let isDocRequest = options.responseType == "document"; + let coOptions = Object.assign({}, options); + if (isDocRequest) { + coOptions.responseType = "text"; + } + if (Zotero.isSafari && options.headers["User-Agent"]) { + coOptions.headers["Cookie"] = document.cookie; + } + return Zotero.COHTTP.request(method, url, coOptions).then(function (xmlhttp) { + if (!isDocRequest) return xmlhttp; + + Zotero.debug("Parsing cross-origin response for " + url); + let parser = new DOMParser(); + let contentType = xmlhttp.getResponseHeader("Content-Type"); + let doc = parser.parseFromString( + xmlhttp.responseText, + Zotero.HTTP.determineDOMParserContentType(contentType), + ); + + return new Proxy(xmlhttp, { + get: function (target, name) { + return name == "response" ? doc : target[name]; + }, + }); + }); + } + } + } + + let logBody = ""; + if (["GET", "HEAD"].includes(method)) { + if (options.body != null) { + throw new Error(`HTTP ${method} cannot have a request body (${options.body})`); + } + } else if (options.body && !(options.body instanceof ArrayBuffer)) { + if (options.headers["Content-Type"] !== "multipart/form-data") { + options.body = + typeof options.body == "string" ? options.body : JSON.stringify(options.body); + + logBody = + `: ${options.body.substr(0, options.logBodyLength)}` + options.body.length > + options.logBodyLength + ? "..." + : ""; + // TODO: make sure below does its job in every API call instance + // Don't display password or session id in console + logBody = logBody.replace(/password":"[^"]+/, 'password":"********'); + logBody = logBody.replace(/password=[^&]+/, "password=********"); + } + + if (!options.headers) options.headers = {}; + if (!options.headers["Content-Type"]) { + options.headers["Content-Type"] = "application/x-www-form-urlencoded"; + } else if (options.headers["Content-Type"] == "multipart/form-data") { + // Allow XHR to set Content-Type with boundary for multipart/form-data + delete options.headers["Content-Type"]; + } + } + + if (Zotero.isBackground) { + if (options.referrer) { + options.headers["Referer"] = options.referrer; + } + let replaceHeaders = HEADERS_SPECIAL_HANDLING.filter( + (header) => !!options.headers[header], + ).map((header) => { + const val = { name: header, value: options.headers[header] }; + delete options.headers["User-Agent"]; + return val; + }); + if (replaceHeaders.length) { + DNRRuleID = await Zotero.WebRequestIntercept.replaceHeaders(url, replaceHeaders); + } + } + Zotero.debug(`HTTP ${method} ${url}${logBody}`); + + var xmlhttp = useContentXHR ? new content.XMLHttpRequest() : new XMLHttpRequest(); + xmlhttp.timeout = options.timeout; + var promise = Zotero.HTTP._attachHandlers(url, xmlhttp, options); + + xmlhttp.open(method, url, true); + + for (let header in options.headers) { + xmlhttp.setRequestHeader(header, options.headers[header]); + } + + xmlhttp.responseType = options.responseType || ""; + + // Maybe should provide "mimeType" option instead. This is xpcom legacy, where responseCharset + // could be controlled manually + if (options.responseCharset) { + xmlhttp.overrideMimeType("text/plain; charset=" + options.responseCharset); + } + + xmlhttp.send(options.body); + + try { + xmlhttp = await promise; + if (options.debug && (xmlhttp.responseType === "" || xmlhttp.responseType === "text")) { + Zotero.debug( + `HTTP ${xmlhttp.status} ${xmlhttp.responseURL} response: ${xmlhttp.responseText}`, + ); + } else { + Zotero.debug(`HTTP ${xmlhttp.status} ${xmlhttp.responseURL} response`); + } + + let invalidDefaultStatus = + options.successCodes === null && (xmlhttp.status < 200 || xmlhttp.status >= 300); + let invalidStatus = + Array.isArray(options.successCodes) && !options.successCodes.includes(xmlhttp.status); + if (invalidDefaultStatus || invalidStatus) { + // Firefox throws accessing responseText when the response is not text + let responseText = ["", "text"].includes(xmlhttp.responseType) + ? xmlhttp.responseText + : undefined; + throw new Zotero.HTTP.StatusError(xmlhttp, url, responseText); + } + return xmlhttp; + } finally { + if (DNRRuleID) { + await Zotero.WebRequestIntercept.removeRuleDNR(DNRRuleID); + } + } + }; + + this._requestFetch = async function (method, url, options) { + if (Zotero.isInject) { + // Make a cross-origin request via the background page, parsing the responseText with + // DOMParser and returning a Proxy with 'response' set to the parsed document + let isDocRequest = options.responseType == "document"; + let coOptions = Object.assign({}, options); + if (isDocRequest) { + coOptions.responseType = "text"; + } + if (Zotero.isSafari && options.headers["User-Agent"]) { + coOptions.headers["Cookie"] = document.cookie; + } + return Zotero.COHTTP.request(method, url, coOptions).then(function (xmlhttp) { + if (!isDocRequest || Zotero.isManifestV3) { + xmlhttp.responseType = options.responseType; + return xmlhttp; + } + + Zotero.debug("Parsing cross-origin response for " + url); + let parser = new DOMParser(); + let contentType = xmlhttp.getResponseHeader("Content-Type"); + let doc = parser.parseFromString( + xmlhttp.responseText, + Zotero.HTTP.determineDOMParserContentType(contentType), + ); + + return new Proxy(xmlhttp, { + get: function (target, name) { + return name == "response" ? doc : target[name]; + }, + }); + }); + } + + try { + let DNRRuleID; + Zotero.Connector_Browser.setKeepServiceWorkerAlive(true); + + let logBody = ""; + if (["GET", "HEAD"].includes(method)) { + if (options.body != null) { + throw new Error(`HTTP ${method} cannot have a request body (${options.body})`); + } + } else if (options.body && !(options.body instanceof ArrayBuffer)) { + if (options.headers["Content-Type"] !== "multipart/form-data") { + options.body = + typeof options.body == "string" ? options.body : JSON.stringify(options.body); + + logBody = + `: ${options.body.substr(0, options.logBodyLength)}` + options.body.length > + options.logBodyLength + ? "..." + : ""; + // TODO: make sure below does its job in every API call instance + // Don't display password or session id in console + logBody = logBody.replace(/password":"[^"]+/, 'password":"********'); + logBody = logBody.replace(/password=[^&]+/, "password=********"); + } + + if (!options.headers) options.headers = {}; + if (!options.headers["Content-Type"]) { + options.headers["Content-Type"] = "application/x-www-form-urlencoded"; + } else if (options.headers["Content-Type"] == "multipart/form-data") { + // Allow XHR to set Content-Type with boundary for multipart/form-data + delete options.headers["Content-Type"]; + } + } + + Zotero.debug(`HTTP ${method} ${url}${logBody}`); + if (options.responseType == "") { + options.responseType = "text"; + } + + if (options.timeout) { + var abortController = new AbortController(); + setTimeout(abortController.abort.bind(abortController), options.timeout); + } + if (options.referrer) { + options.headers["Referer"] = options.referrer; + } + + await this._augmentCfCookie(url, options); + let replaceHeaders = HEADERS_SPECIAL_HANDLING.filter( + (header) => !!options.headers[header], + ).map((header) => { + const val = { name: header, value: options.headers[header] }; + delete options.headers[header]; + return val; + }); + DNRRuleID = await Zotero.WebRequestIntercept.replaceHeaders(url, replaceHeaders); + + try { + let fetchOptions = { + method, + headers: options.headers, + body: options.body, + credentials: Zotero.isInject ? "same-origin" : "include", + }; + if (abortController) { + fetchOptions.signal = abortController.signal; + } + var response = await fetch(url, fetchOptions); + } catch (e) { + var err; + if (e.name == "AbortError") { + err = new Zotero.HTTP.TimeoutError(url, options.timeout); + } else { + Zotero.debug(`HTTP 0 ${url} response: ${e.message}`); + if (options.successCodes === false) { + return { + status: 0, + responseText: e.message, + response: e.message, + responseURL: url, + responseType: options.responseType, + statusText: e.message, + getAllResponseHeaders: () => "", + getResponseHeader: () => "", + }; + } + err = new Zotero.HTTP.StatusError({ status: 0 }, url, e.message); + } + // Zotero.logError(err); + throw err; + } finally { + if (DNRRuleID) { + await Zotero.WebRequestIntercept.removeRuleDNR(DNRRuleID); + } + } + + let responseData; + if (options.responseType == "arraybuffer") { + responseData = await response.arrayBuffer(); + } else if (options.responseType == "json") { + responseData = await response.text(); + try { + responseData = JSON.parse(responseData); + } catch (e) { + Zotero.debug(`HTTP: Failed to parse JSON from ${method} ${url}`); + } + } else { + responseData = await response.text(); + } + + if (options.debug && (options.responseType === "json" || options.responseType === "text")) { + Zotero.debug(`HTTP ${response.status} ${response.url} response: ${responseData}`); + } else { + Zotero.debug(`HTTP ${response.status} ${response.url} response`); + } + + let responseHeaders = {}; + let responseHeadersString = ""; + for (let [key, value] of response.headers.entries()) { + responseHeaders[key.toLowerCase()] = value; + responseHeadersString += `${key}: ${value}\r\n`; + } + + response = { + responseText: typeof responseData == "string" ? responseData : "", + response: responseData, + responseURL: response.url, + responseType: options.responseType, + status: response.status, + statusText: response.statusText, + getAllResponseHeaders: () => responseHeadersString, + getResponseHeader: (name) => responseHeaders[name.toLowerCase()], + }; + + let invalidDefaultStatus = + options.successCodes === null && (response.status < 200 || response.status >= 300); + let invalidStatus = + Array.isArray(options.successCodes) && !options.successCodes.includes(response.status); + if (invalidDefaultStatus || invalidStatus) { + throw new Zotero.HTTP.StatusError( + response, + url, + typeof responseData == "string" ? responseData : "", + ); + } + + return response; + } finally { + Zotero.Connector_Browser.setKeepServiceWorkerAlive(false); + } + }; + + /** + * Send an HTTP GET request via XMLHTTPRequest + * + * @deprecated Use {@link Zotero.HTTP.request} + * @param {String} url URL to request + * @param {Function} onDone Callback to be executed upon request completion + * @param {String} responseCharset + * @param {N/A} cookieSandbox Not used in Connector + * @param {Object} headers HTTP headers to include with the request + * @return {Boolean} True if the request was sent, or false if the browser is offline + */ + this.doGet = function (url, onDone, responseCharset, cookieSandbox, headers) { + Zotero.debug("Zotero.HTTP.doGet is deprecated. Use Zotero.HTTP.request"); + this.request("GET", url, { responseCharset, headers }).then(onDone, function (e) { + onDone({ status: e.status, responseText: e.responseText }); + throw e; + }); + return true; + }; + + /** + * Send an HTTP POST request via XMLHTTPRequest + * + * @deprecated Use {@link Zotero.HTTP.request} + * @param {String} url URL to request + * @param {String|Object[]} body Request body + * @param {Function} onDone Callback to be executed upon request completion + * @param {String} headers Request HTTP headers + * @param {String} responseCharset + * @return {Boolean} True if the request was sent, or false if the browser is offline + */ + this.doPost = function (url, body, onDone, headers, responseCharset) { + Zotero.debug("Zotero.HTTP.doPost is deprecated. Use Zotero.HTTP.request"); + this.request("POST", url, { body, responseCharset, headers }).then(onDone, function (e) { + onDone({ status: e.status, responseText: e.responseText }); + throw e; + }); + return true; + }; + + /** + * Adds a ES6 Proxied location attribute + * @param doc + * @param docURL + */ + this.wrapDocument = function (doc, docURL, props = {}) { + docURL = new URL(docURL); + var wrappedDoc = new Proxy(doc, { + get: function (t, prop) { + if (prop === "location") { + return docURL; + } else if (prop == "evaluate") { + // If you pass the document itself into doc.evaluate as the second argument + // it fails, because it receives a proxy, which isn't of type `Node` for some reason. + // Native code magic. + return function () { + if (arguments[1] == wrappedDoc) { + arguments[1] = t; + } + return t.evaluate.apply(t, arguments); + }; + } else if (prop == "documentURI") { + return docURL.href; + } else if (props[prop]) { + return props[prop]; + } else { + if (typeof t[prop] == "function") { + return t[prop].bind(t); + } + return t[prop]; + } + }, + }); + return wrappedDoc; + }; + + /** + * @param contentType {String} + * @returns {DOMParserSupportedType} + */ + this.determineDOMParserContentType = function (contentType) { + if (Zotero.HTTP.VALID_DOM_PARSER_CONTENT_TYPES.has(contentType)) { + return contentType; + } else { + if (contentType.includes("xml")) { + return "text/xml"; + } else { + return "text/html"; + } + } + }; + + /** + * Adds request handlers to the XMLHttpRequest and returns a promise that resolves when + * the request is complete. xmlhttp.send() still needs to be called, this just attaches the + * handler + * + * See {@link Zotero.HTTP.request} for parameters + * @private + */ + this._attachHandlers = function (url, xmlhttp, options) { + var deferred = Zotero.Promise.defer(); + xmlhttp.onload = () => deferred.resolve(xmlhttp); + xmlhttp.onerror = xmlhttp.onabort = function () { + var e = new Zotero.HTTP.StatusError( + xmlhttp, + url, + ["", "text"].includes(xmlhttp.responseType) ? xmlhttp.responseText : undefined, + ); + if (options.successCodes === false) { + deferred.resolve(xmlhttp); + } else { + deferred.reject(e); + } + }; + xmlhttp.ontimeout = function () { + var e = new Zotero.HTTP.TimeoutError(url, xmlhttp.timeout); + Zotero.logError(e); + deferred.reject(e); + }; + return deferred.promise; + }; + + /** + * Claudflare started setting their cf_clearance cookie from an iframe, perhaps as an additional bot + * protection measure which sets it under a partition key. + * Chrome service worker doesn't send this cookie via fetch even with credentials: 'include'. + * Firefox devtools don't show it sending this cookie either, but the request succeeds, although if you + * copy the request as curl and attempt it in the terminal it fails. + * + * Likely to continue causing headaches. + * @param {Object} options + */ + this._augmentCfCookie = async function (url, options) { + let cfCookies; + try { + cfCookies = await browser.cookies.getAll({ url, name: "cf_clearance", partitionKey: {} }); + } catch (e) { + // partitionKey added in Chrome 118+ (October 2023), some of our users are + // on older versions + return; + } + if (!cfCookies.length) return; + const cookieString = cfCookies.map((cookie) => `${cookie.name}=${cookie.value}`).join("; "); + if (options.headers["Cookie"]) { + options.headers["Cookie"] = `${options.headers["Cookie"]}; ${cookieString}`; + } else { + options.headers["Cookie"] = cookieString; + } + }; +})(); + +// Alias as COHTTP = Cross-origin HTTP; this is how we will call it from children +// For injected scripts, this get overwritten in messaging.js (see messages.js) +Zotero.COHTTP = { + request: Zotero.HTTP.request, +}; diff --git a/sources/sandbox.js b/sources/sandbox.js new file mode 100644 index 00000000..9aa8edb2 --- /dev/null +++ b/sources/sandbox.js @@ -0,0 +1,26 @@ +export let ZU; +export let Zotero; +export let Z; +export let requestJSON; +export let requestText; +export let text; +export let attr; +export let DOMParser; + +import "./zotero-utilities/xregexp-all.js"; + +export function setSandbox(sandbox) { + ZU = sandbox.ZU; + if (globalThis.XRegExp !== undefined) { + // No idea why, but the XRegExp provided by the sandbox is not working + // So let's overwrite it with a freshly imported one + ZU.XRegExp = XRegExp; + } + Zotero = sandbox.Zotero; + Z = sandbox.Zotero; + requestJSON = sandbox.requestJSON; + requestText = sandbox.requestText; + text = sandbox.text; + attr = sandbox.attr; + DOMParser = sandbox.DOMParser || DOMParser; +} diff --git a/sources/sandboxManager.js b/sources/sandboxManager.js new file mode 100644 index 00000000..074ae90c --- /dev/null +++ b/sources/sandboxManager.js @@ -0,0 +1,111 @@ +import { setSandbox } from "./sandbox.js"; + +/** + * Manages the translator sandbox + */ +class SandboxManager { + constructor() { + this.sandbox = { + Zotero: {}, + Promise, + }; + this._moduleCache = new Map(); + } + + /** + * Evaluates code in the sandbox + * @param {string} code Code to evaluate + * @param {string[]} functions Functions to import into the sandbox (rather than leaving as inner functions) + * @param {string?} path The source path of the code being evaluated + */ + eval(code, functions = [], path) { + return this.importTranslatorByPath(path, functions); + } + + /** + * Imports an object into the sandbox + * @param {Object} object Object to be imported (under attachTo) + * @param {Boolean|Object} passTranslateAsFirstArgument Whether the translate instance should be passed as the first argument to the function. + * @param {Object} attachTo An item from this.sandbox to which the object will be attached; defaults to this.sandbox.Zotero + */ + importObject(object, passTranslateAsFirstArgument, attachTo = this.sandbox.Zotero) { + const source = object.__exposedProps__ ? object.__exposedProps__ : object; + for (const key in source) { + if (!Object.prototype.hasOwnProperty.call(source, key)) continue; + if (Function.prototype[key]) continue; + if (typeof object[key] === "function" || typeof object[key] === "object") { + const fn = object[key]; + attachTo[key] = (...args) => { + const callArgs = passTranslateAsFirstArgument + ? [passTranslateAsFirstArgument, ...args] + : [...args]; + return fn.apply(object, callArgs); + }; + + this.importObject( + object[key], + passTranslateAsFirstArgument ? passTranslateAsFirstArgument : null, + attachTo[key], + ); + } else { + attachTo[key] = object[key]; + } + } + } + + _resolvePath(path) { + if (!path) throw new Error("No translator path provided"); + if (typeof browser !== "undefined" && browser.runtime?.getURL) { + return browser.runtime.getURL(path); + } + return new URL(path, import.meta.url).href; + } + + isModuleLoaded(path) { + const url = this._resolvePath(path); + const cached = this._moduleCache.get(url); + return !!(cached && cached.loaded && cached.module); + } + + async importTranslatorByPath(path, functions = []) { + const url = this._resolvePath(path); + + let cached = this._moduleCache.get(url); + if (!cached) { + setSandbox(this.sandbox); + const promise = import(url).then((mod) => { + cached.module = mod; + cached.loaded = true; + return mod; + }); + cached = { promise, loaded: false, module: null }; + this._moduleCache.set(url, cached); + } + + const mod = cached.loaded ? cached.module : await cached.promise; + const exported = mod && mod.default ? mod.default : mod; + + // Clear old bindings and attach translator exports into the sandbox + for (const fn of functions) { + delete this.sandbox[fn]; + } + + for (const fn of functions) { + if (exported && Object.prototype.hasOwnProperty.call(exported, fn)) { + this.sandbox[fn] = (...args) => { + // Prepend sandbox properties + setSandbox(this.sandbox); + return exported[fn].apply(this.sandbox, args); + }; + } + } + + this.sandbox.ZOTERO_TRANSLATOR_INFO = exported.ZOTERO_TRANSLATOR_INFO; + + this.sandbox.exports = exported.exports; + + return exported; + } +} + +Zotero.Translate.SandboxManager = SandboxManager; diff --git a/sources/setupZotero.js b/sources/setupZotero.js new file mode 100644 index 00000000..a8986a1a --- /dev/null +++ b/sources/setupZotero.js @@ -0,0 +1,32 @@ +import "./setupZoteroPlain.js"; +import "./zotero-translate/src/promise.js"; +import "./zotero-translate/src/translation/translate.js"; +import "./sandboxManager.js"; +// See zotero-translate/example/index.html for the following list of imports +import "./zotero-utilities/openurl.js"; +import "./zotero-utilities/date.js"; +import "./zotero-utilities/xregexp-all.js"; +import "./zotero-utilities/xregexp-unicode-zotero.js"; +import "./zotero-utilities/utilities.js"; +import "./zotero-utilities/utilities_item.js"; +import "./zotero-utilities/schema.js"; +import { ZOTERO_TYPE_SCHEMA } from "./zotero-utilities/resource/zoteroTypeSchemaData.js"; +import "./zotero-utilities/cachedTypes.js"; +import "./zotero-translate/src/utilities_translate.js"; +import "./zotero-translate/src/http.js"; +import "./http.js"; +import "./webRequestIntercept.js"; + +Zotero.setTypeSchema(ZOTERO_TYPE_SCHEMA); +if (browser.webRequest) { + // webRequest is not available some contexts, so check before initializing + Zotero.WebRequestIntercept.init(); +} + +Zotero.Date.init( + JSON.parse( + await ( + await fetch(new URL("./zotero-utilities/resource/dateFormats.json", import.meta.url)) + ).text(), + ), +); diff --git a/sources/setupZoteroPlain.js b/sources/setupZoteroPlain.js new file mode 100644 index 00000000..1821cfc7 --- /dev/null +++ b/sources/setupZoteroPlain.js @@ -0,0 +1,34 @@ +globalThis.Zotero = { + isConnector: true, + isBrowserExt: true, + locale: "en-US", + logError: console.error, + debug: console.debug, + Prefs: { + get(key) { + switch (key) { + case "automaticSnapshots": + return false; + case "downloadAssociatedFiles": + return false; + case "reportTranslationFailure": + return true; + default: + throw new Error(`Unknown preference ${key}`); + } + }, + }, + Utilities: {}, + isManifestV3: true, + Connector_Browser: { + setKeepServiceWorkerAlive(_val) { + // No-op in this context + }, + }, +}; + +globalThis.OS = { + Path: { + basename: (path) => path.split(/[\\/]/).pop(), + }, +}; diff --git a/sources/translateEngine.js b/sources/translateEngine.js new file mode 100644 index 00000000..8c80d8b2 --- /dev/null +++ b/sources/translateEngine.js @@ -0,0 +1,208 @@ +import { TranslateWeb } from "./translateWeb.js"; +import "./setupZotero.js"; +import "./zotero-translate/src/translator.js"; +import "./zotero-translate/src/translation/translate_item.js"; + +const EXPORT_TRANSLATORS = { + bibtex: "9cb70025-a888-4a29-a210-93ec52da40d4", + biblatex: "b6e39b57-8942-4d11-8259-342c46ce395f", +}; + +export async function createTranslateEngine(location) { + return { + detect: async () => { + // Upstream: https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/inject/pageSaving.js#L113-L114 + const translate = await _initTranslate(); + return await TranslateWeb.detect({ translate, location }); + }, + translate: async (doc, translators) => { + // Upstream: https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/inject/pageSaving.js#L287-L291 + if (!translators || !translators.length) { + throw new Error("No translators provided for translation"); + } + + const translate = await _initTranslate(translators[0].itemType); + const onSelect = (args) => { + console.log("Translator select handler called with args %o", args); + }; + const onItemSaving = (args) => { + console.log("Translator itemSaving handler called with args %o", args); + }; + const onTranslatorFallback = (args) => { + console.log("Translator fallback handler called with args %o", args); + }; + return await TranslateWeb.translate({ + doc, + translate, + location: doc.location.href, + translators: translators.slice(), + onSelect, + onItemSaving, + onTranslatorFallback, + }); + }, + }; +} + +export async function exportItems(items, mode = "bibtex") { + if (!Array.isArray(items) || !items.length) { + throw new Error("No items provided for export"); + } + + const translatorId = EXPORT_TRANSLATORS[mode] || EXPORT_TRANSLATORS.bibtex; + const translate = new Zotero.Translate.Export(); + translate._translatorProvider = new TranslatorProvider(); + translate.setItems(items); + translate.setTranslator(translatorId); + await translate.translate(); + return translate.string; +} + +/** + * Implements sources\zotero-translate\src\translators.js interface using the bundled translators. + */ +class TranslatorProvider { + constructor() { + this._initialized = false; + this._cache = { import: [], export: [], web: [], search: [] }; + this._byId = new Map(); + } + + async _ensure() { + if (this._initialized) return; + const manifestUrl = browser.runtime.getURL("../translators/manifest.json"); + const manifestResponse = await fetch(manifestUrl); + const manifest = await manifestResponse.json(); + + const cache = { import: [], export: [], web: [], search: [] }; + for (const info of manifest) { + const path = info.path; + if (!path) { + throw new Error(`Translator ${info.label} is missing a path`); + } + const translator = new Zotero.Translator(info); + // Zotero expects the path to be under `file` + translator.file = { + path: path, + }; + const typeKeys = this._typeKey(translator.translatorType); + for (const typeKey of typeKeys) { + cache[typeKey].push(translator); + } + this._byId.set(translator.translatorID, translator); + } + // Sort by priority + for (const type in cache) { + cache[type].sort((a, b) => a.priority - b.priority); + } + + this._cache = cache; + this._initialized = true; + } + + _typeKey(type) { + switch (type) { + case 1: + return ["import"]; + case 2: + return ["export"]; + case 3: + return ["import", "export"]; + case 4: + return ["web"]; + case 6: + return ["export", "web"]; + case 8: + return ["search"]; + case 12: + return ["web", "search"]; + default: + throw new Error(`Unknown translator type ${type}`); + } + } + + async get(id) { + await this._ensure(); + return this._byId.get(id) || null; + } + + async getAllForType(type) { + await this._ensure(); + return (this._cache[type] || []).slice(); + } + + /* + Upstream: https://github.com/zotero/zotero-connectors/blob/dac609fb9dea1e98dbcc73387b05f7af5ef7814d/src/common/translators.js#L381. + With the following changes: + - Don't use `webRegex.all` (which is set by `targetAll` in the translator) because it is actually not used (see https://github.com/zotero/translators/issues/3254#issuecomment-1972914000) + */ + async getWebTranslatorsForLocation(URI, rootURI) { + const matches = []; + for (const translator of await this.getAllForType("web")) { + const target = translator?.target; + if (!target && !translator.runInBrowser) { + // Don't attempt to use generic translators that can't be run in this browser + continue; + } + if (!target) { + // No target: match all URLs (generic translator) + matches.push(translator); + continue; + } + try { + const urlRegexp = new RegExp(target, "i"); + if (urlRegexp.test(URI)) matches.push(translator); + } catch (e) { + // ignore invalid regex patterns + console.warn("Invalid target regex", target, e); + } + } + return [matches]; + } + + /* + Upstream: https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/translators.js#L322 + */ + async getCodeForTranslator(translator) { + if (translator.code) return translator.code; + if (translator.file?.path) { + const url = browser.runtime.getURL(translator.file.path); + const response = await fetch(url); + const code = await response.text(); + translator.code = code; + return code; + } + throw new Error( + `TranslatorProvider.getCodeForTranslator: translator ${translator.label} has no code`, + ); + } +} + +async function _initTranslate(itemType = null) { + // Upstream: https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/inject/pageSaving.js#L63 + let translate; + if (browser.offscreen /*Zotero.isManifestV3*/) { + try { + translate = await Zotero.VirtualOffscreenTranslate.create(); + } catch (e) { + Zotero.logError( + new Error(`Inject: Initializing translate failed at ${document.location.href}`), + ); + Zotero.logError(e); + throw e; + } + } else { + translate = new Zotero.Translate.Web(); + translate._translatorProvider = new TranslatorProvider(); + } + translate.setHandler("pageModified", () => { + Zotero.Messaging.sendMessage("pageModified", true); + }); + // Async in MV3 + if (Zotero.isManifestV3) { + await translate.setDocument(document, itemType === "multiple"); + } else { + translate.setDocument(document); + } + return translate; +} diff --git a/sources/translateWeb.js b/sources/translateWeb.js new file mode 100644 index 00000000..bacd3f58 --- /dev/null +++ b/sources/translateWeb.js @@ -0,0 +1,149 @@ +// Taken from https://github.com/zotero/zotero-connectors/blob/ea060a0aa2fea1267049b5fc880e53aa6c915eeb/src/common/translateWeb.js +// We include it here with the hope that it will eventually be included in the Zotero Translate API. +/* + ***** BEGIN LICENSE BLOCK ***** + + Copyright © 2024 Corporation for Digital Scholarship + Vienna, Virginia, USA + http://zotero.org + + This file is part of Zotero. + + Zotero is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Zotero is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with Zotero. If not, see . + + ***** END LICENSE BLOCK ***** +*/ + +/** + * @typedef {Object} InitTranslateOptions + * @property {Document} [doc] - The document to translate. + * @property {Zotero.Translate.Web} [translate] - Optionally pass in a preconfigured translate + * @property {Object} [cookieSandbox] - The cookie sandbox. + * @property {string|Location} [location] - The URL of the document being translated. + * @property {Translator[]} [translators] - The translators to use. + * @property {Function} [onSelect] - The 'select' event handler for multiple translate items. + * @property {Function} [onItemSaving] - The 'itemSaving' event handler for multiple translate items. + * @property {Function} [onDebug] - Custom translate debug line handler. + * @property {Function} [onTranslatorFallback] - Handler for failed translator fallback. + * Params are oldTranslator and newTranslator. + */ + +/** + * @typedef {Object} TranslateReturnType + * @property {Object[]} items - the translated JSON item array + * @property {Zotero.Proxy} [proxy] - the proxy used to translate the items if any + */ + +/** + * A wrapper around Zotero.Translate.Web that is less insane + * Only handles item translation and not: + * - item saving + * - attachment saving + * - saving progress management + * - save session management + */ +export let TranslateWeb = { + /** + * @param {InitTranslateOptions} options + * @returns {Zotero.Translate.Web} - The initialized translate object + */ + async _initTranslate({ + translate, + doc, + cookieSandbox, + location, + onSelect, + onItemSaving, + onDebug, + } = {}) { + if (!translate) { + translate = new Zotero.Translate.Web(); + if (!doc) throw new Error(`TranslateWeb: No document provided for translation`); + } + // Support for "remote" translate where all these commands could potentially be async + await Promise.all([ + doc && translate.setDocument(doc), + cookieSandbox && translate.setCookieSandbox(cookieSandbox), + location && translate.setLocation(location, location), + onSelect && translate.setHandler("select", onSelect), + onItemSaving && translate.setHandler("itemSaving", onItemSaving), + onDebug && translate.setHandler("debug", onDebug), + ]); + + return translate; + }, + + /** + * Returns a list of translators that can translate the given document + * @param {InitTranslateOptions} options + * @returns {Promise} + */ + async detect(options) { + let translate = await this._initTranslate(options); + + if (options.translators) { + translate.setTranslator(options.translators); + } + return await translate.getTranslators(true, !!options.translators); + }, + + /** + * Translates the document falling back to other translators on failure and returns + * translated items + * @param {InitTranslateOptions} options + * @returns {Promise} + */ + async translate(options) { + let translate = await this._initTranslate(options); + let translators = options.translators; + if (!translators) { + translators = await translate.getTranslators(true); + } + + while (true) { + let translator = translators.shift(); + translate.setTranslator(translator); + try { + let items = await translate.translate(); + return { + items, + proxy: translate._proxy, + }; + } catch (e) { + if (translator.itemType != "multiple" && translators.length) { + // If we have more translators and not translating multiple items, continue + if (options.onTranslatorFallback) { + // Optionally notify about fallback to a different translator + options.onTranslatorFallback(translator, translators[0]); + } + } else { + // Otherwise throw + throw e; + } + } + } + }, +}; + +var Zotero = Zotero || {}; +Zotero.Translate = Zotero.Translate || {}; +Zotero.Translate.ItemSaver = Zotero.Translate.ItemSaver || function () {}; +// Couple with translate/translation/translate_item.js for a mock ItemSaver +// Other code, post-translation should handle item and attachment saving and progress notifications/UI. +Zotero.Translate.ItemSaver.prototype.saveItems = async function (jsonItems) { + this.items = (this.items || []).concat(jsonItems); + return jsonItems; +}; + +Zotero.TranslateWeb = TranslateWeb; diff --git a/sources/webRequestIntercept.js b/sources/webRequestIntercept.js new file mode 100644 index 00000000..a6b28983 --- /dev/null +++ b/sources/webRequestIntercept.js @@ -0,0 +1,245 @@ +// Taken from https://github.com/zotero/zotero-connectors/blob/92d2c56de53c82526bc68bab378b014dcc3b007a/src/browserExt/webRequestIntercept.js + +/* + ***** BEGIN LICENSE BLOCK ***** + + Copyright © 2016 Center for History and New Media + George Mason University, Fairfax, Virginia, USA + http://zotero.org + + This file is part of Zotero. + + Zotero is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Zotero is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with Zotero. If not, see . + + ***** END LICENSE BLOCK ***** +*/ + +/** + * Handles web request interception and header parsing + */ + +(function () { + "use strict"; + + Zotero.WebRequestIntercept = { + listeners: { + beforeSendHeaders: [], + headersReceived: [], + errorOccurred: [], + }, + + reqIDToReqMeta: {}, + + init: function () { + const types = ["main_frame", "sub_frame"]; + let extraInfoSpec = ["requestHeaders"].concat(!Zotero.isManifestV3 ? ["blocking"] : []); + browser.webRequest.onBeforeSendHeaders.addListener( + Zotero.WebRequestIntercept.handleRequest("beforeSendHeaders"), + { urls: [""], types }, + extraInfoSpec, + ); + browser.webRequest.onErrorOccurred.addListener(Zotero.WebRequestIntercept.removeRequestMeta, { + urls: [""], + types, + }); + browser.webRequest.onCompleted.addListener(Zotero.WebRequestIntercept.removeRequestMeta, { + urls: [""], + types, + }); + extraInfoSpec = ["responseHeaders"].concat(!Zotero.isManifestV3 ? ["blocking"] : []); + browser.webRequest.onHeadersReceived.addListener( + Zotero.WebRequestIntercept.handleRequest("headersReceived"), + { urls: [""], types }, + extraInfoSpec, + ); + + Zotero.WebRequestIntercept.addListener( + "beforeSendHeaders", + Zotero.WebRequestIntercept.storeRequestHeaders, + ); + Zotero.WebRequestIntercept.addListener( + "headersReceived", + Zotero.WebRequestIntercept.offerSavingPDFInFrame, + ); + }, + + storeRequestHeaders: function (details, meta) { + meta.requestHeadersObject = details.requestHeadersObject; + }, + + offerSavingPDFInFrame: function (details) { + if (details.frameId === 0) return; + if (!details.responseHeadersObject["content-type"]) return; + const contentType = details.responseHeadersObject["content-type"].split(";")[0]; + + // If no translators are found for the top frame or the first child frame, and some frame + // contains a pdf, saving that PDF will be offered. + if (contentType == "application/pdf") { + setTimeout(() => + Zotero.Connector_Browser.onPDFFrame(details.url, details.frameId, details.tabId), + ); + } + }, + + removeRequestMeta: function (details) { + delete Zotero.WebRequestIntercept.reqIDToReqMeta[details.requestId]; + }, + + /** + * Convert from webRequest.HttpHeaders array to a lowercased object. + * + * headers = _processHeaders(details.requestHeaders) + * console.log(headers['accept-charset']) // utf-8 + * + * @param {Array} headerArray + * @return {Object} headers + */ + processHeaders: function (headerArray) { + if (!Array.isArray(headerArray)) return headerArray; + + let headers = {}; + for (let header of headerArray) { + headers[header.name.toLowerCase()] = header.value; + } + return headers; + }, + + handleRequest: function (requestType) { + return function (details) { + if (!Zotero.WebRequestIntercept.listeners[requestType].length) return; + + let meta = Zotero.WebRequestIntercept.reqIDToReqMeta[details.requestId]; + if (!meta) { + meta = {}; + Zotero.WebRequestIntercept.reqIDToReqMeta[details.requestId] = meta; + } + + if (meta.requestHeadersObject) { + details.requestHeadersObject = meta.requestHeadersObject; + } else if (details.requestHeaders) { + details.requestHeadersObject = Zotero.WebRequestIntercept.processHeaders( + details.requestHeaders, + ); + } + + if (details.responseHeaders) { + details.responseHeadersObject = Zotero.WebRequestIntercept.processHeaders( + details.responseHeaders, + ); + } + + var returnValue = null; + for (let listener of Zotero.WebRequestIntercept.listeners[requestType]) { + let retVal = listener(details, meta); + if (typeof retVal == "object") { + returnValue = Object.assign(returnValue || {}, retVal); + } + } + if (returnValue !== null && !Zotero.isManifestV3) { + return returnValue; + } + }; + }, + + addListener: function (requestType, listener) { + if (Zotero.WebRequestIntercept.listeners[requestType] === undefined) { + throw new Error(`Web request listener for '${requestType}' not allowed`); + } + if (typeof listener != "function") { + throw new Error(`Web request listener of type ${typeof listener} is not allowed`); + } + Zotero.WebRequestIntercept.listeners[requestType].push(listener); + }, + + removeListener: function (requestType, listener) { + if (Zotero.WebRequestIntercept.listeners[requestType] === undefined) { + throw new Error(`Web request listener for '${requestType}' not allowed`); + } + if (typeof listener != "function") { + throw new Error(`Web request listener of type ${typeof listener} is not allowed`); + } + let idx = Zotero.WebRequestIntercept.listeners[requestType].indexOf(listener); + if (idx != -1) { + Zotero.WebRequestIntercept.listeners[requestType].splice(idx, 1); + } + }, + + replaceHeaders: async function (url, headers) { + if (!Zotero.isBrowserExt) return; + return this.replaceHeadersDNR(url, headers); + }, + + replaceHeadersDNR: async function (url, headers) { + const requestHeaders = headers.map((headerObj) => { + if (headerObj.name.toLowerCase() === "cookie") { + // Chrome bug: 'append' op is checked against an allow-list and fails if header name is not lowercase + return { + header: headerObj.name.toLowerCase(), + value: headerObj.value, + operation: "append", + }; + } + return { header: headerObj.name, value: headerObj.value, operation: "set" }; + }); + // Some pages (ie ieeexplore) check for the presence of the origin header + // and block requests if it's not 'correct', so remove it to avoid issues + // otherwise the origin header would be set to the extension id + requestHeaders.push({ + header: "origin", + operation: "remove", + }); + const ruleID = Math.floor(Math.random() * 100000); + const rules = [ + { + id: ruleID, + action: { + type: "modifyHeaders", + requestHeaders, + }, + condition: { + resourceTypes: ["xmlhttprequest"], + initiatorDomains: [new URL(browser.runtime.getURL("")).hostname], + }, + }, + ]; + // Keep the service worker alive while the rule is active + Zotero.Connector_Browser.setKeepServiceWorkerAlive(true); + try { + await browser.declarativeNetRequest.updateSessionRules({ + removeRuleIds: rules.map((r) => r.id), + addRules: rules, + }); + // Automatically clean up the rule after 60 seconds in case the caller does not + setTimeout(async () => { + try { + await Zotero.WebRequestIntercept.removeRuleDNR(ruleID); + } catch (e) { + Zotero.logError(e); + } + }, 60000); + Zotero.debug( + `HTTP: Added a DNR rule to change headers for ${url} to ${JSON.stringify(headers)}`, + ); + } catch (e) { + Zotero.logError(e); + } + return ruleID; + }, + + removeRuleDNR: async function (ruleId) { + Zotero.Connector_Browser.setKeepServiceWorkerAlive(false); + return browser.declarativeNetRequest.updateSessionRules({ removeRuleIds: [ruleId] }); + }, + }; +})(); diff --git a/sources/zotero-translate b/sources/zotero-translate new file mode 160000 index 00000000..2e8fce67 --- /dev/null +++ b/sources/zotero-translate @@ -0,0 +1 @@ +Subproject commit 2e8fce6788fdc07e5d163669b897b17931700cc0 diff --git a/sources/zotero-utilities b/sources/zotero-utilities new file mode 160000 index 00000000..ddf67c39 --- /dev/null +++ b/sources/zotero-utilities @@ -0,0 +1 @@ +Subproject commit ddf67c39d558cab5544f10cc3b3121f18962d1d2 diff --git a/test.js b/test.js new file mode 100644 index 00000000..6b36e280 --- /dev/null +++ b/test.js @@ -0,0 +1,361 @@ +#!/usr/bin/env node +// Test runner: executes runTranslatorOnHtml on the testCases defined in +// translators/zotero/ScienceDirect.js + +import { createWriteStream, mkdirSync, existsSync, promises, readFileSync, readdir } from "fs"; +import { join, dirname } from "path"; +import { createContext, runInContext } from "vm"; +import { inspect } from "util"; + +// Compute root directory compatible with ESM `import.meta.url` and +// legacy CommonJS `__dirname`. +const ROOT_DIR = + typeof __dirname !== "undefined" ? __dirname : dirname(new URL(import.meta.url).pathname); + +// Create a log file and duplicate console output to it. +const LOG_PATH = join(ROOT_DIR, "test.log"); +try { + // append mode so repeated runs accumulate; you can change to 'w' to overwrite + const logStream = createWriteStream(LOG_PATH, { flags: "a" }); + const writeLog = (...args) => { + try { + const line = args + .map((a) => (typeof a === "string" ? a : inspect(a, { depth: null }))) + .join(" "); + logStream.write(line + "\n"); + } catch (e) { + // ignore logging errors + } + }; + + const origLog = console.log; + const origError = console.error; + const origWarn = console.warn; + const origDebug = console.debug || (() => {}); + + console.log = function (...args) { + writeLog(...args); + origLog.apply(console, args); + }; + console.error = function (...args) { + writeLog(...args); + origError.apply(console, args); + }; + console.warn = function (...args) { + writeLog(...args); + origWarn.apply(console, args); + }; + console.debug = function (...args) { + writeLog(...args); + origDebug.apply(console, args); + }; + + process.on("exit", () => { + try { + logStream.end(); + } catch (e) {} + }); +} catch (e) { + console.error("Failed to initialize log file", e && e.message ? e.message : e); +} + +// Directory to cache fetched HTML between test runs. This speeds up repeated +// runs and reduces network requests when iterating on translators. +const CACHE_DIR = join(ROOT_DIR, "test_cache"); +try { + mkdirSync(CACHE_DIR, { recursive: true }); +} catch (e) {} + +function urlToCacheName(url) { + // base64url encode the URL to a safe filename + const b = Buffer.from(String(url || ""), "utf8") + .toString("base64") + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=+$/, ""); + return b + ".html"; +} + +async function readCachedHtml(url) { + try { + const fname = join(CACHE_DIR, urlToCacheName(url)); + if (existsSync(fname)) { + return await promises.readFile(fname, "utf8"); + } + } catch (e) {} + return null; +} + +async function writeCachedHtml(url, html) { + try { + const fname = join(CACHE_DIR, urlToCacheName(url)); + await promises.writeFile(fname, html, "utf8"); + } catch (e) {} +} + +async function run_on_file(filename, singleTestIndex) { + // Ensure DOMParser and a fetch implementation are available for translation engine + let JSDOM; + try { + const jsdomMod = await import("jsdom"); + JSDOM = jsdomMod.JSDOM; + } catch (e) { + console.error("Please install jsdom: pnpm add jsdom"); + process.exit(1); + } + const dom = new JSDOM(""); + // Wrap jsdom's DOMParser so created documents get a usable `location`. + // The runner expects `doc.location.pathname` to be a string; cached HTML + // tests may not provide a proper location, so we inject the current + // test URL (stored in `global.__test_current_url`) when available. + const OriginalDOMParser = dom.window.DOMParser; + global.DOMParser = class DOMParserWrapper { + constructor() { + this._p = new OriginalDOMParser(); + } + parseFromString(str, type) { + const doc = this._p.parseFromString(str, type); + try { + const u = global.__test_current_url; + const loc = u ? new URL(String(u)) : { href: "", pathname: "" }; + + // Return a proxy that forwards to the real document but + // guarantees a usable `location` property so translators can + // safely access `doc.location.pathname`. + const proxy = new Proxy(doc, { + get(target, prop, receiver) { + if (prop === "location") return loc; + const val = Reflect.get(target, prop, receiver); + return typeof val === "function" ? val.bind(target) : val; + }, + getOwnPropertyDescriptor(target, prop) { + if (prop === "location") return { configurable: true, enumerable: true, value: loc }; + return Reflect.getOwnPropertyDescriptor(target, prop); + }, + }); + return proxy; + } catch (e) { + return doc; + } + } + }; + // Expose XPathResult from jsdom so xpath evaluation constants are available + global.XPathResult = dom.window.XPathResult; + + // Dynamic import of the ES module translator runner + const trPath = join(ROOT_DIR, "sources", "translateEngine.js"); + const trModule = await import("file://" + trPath); + const { runTranslatorOnHtml } = trModule; + + // Load ScienceDirect translator source and execute it in a sandbox so we can + // read the `testCases` variable produced by the translator file. + const sdPath = join(ROOT_DIR, "translators", "zotero", filename); + const sdSrc = readFileSync(sdPath, "utf8"); + + const sandbox = { console, URL, window: {}, document: {}, DOMParser: global.DOMParser }; + // Minimal ZU shim for detection-time helpers (xpath, xpathText, text, trimInternal) + sandbox.ZU = { + xpath: (doc, xp) => { + try { + if (doc && typeof doc.evaluate === "function") { + const res = doc.evaluate(xp, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + const out = []; + for (let i = 0; i < res.snapshotLength; i++) out.push(res.snapshotItem(i)); + return out; + } + return []; + } catch (e) { + return []; + } + }, + xpathText: (doc, xp) => { + try { + const nodes = sandbox.ZU.xpath(doc, xp); + return nodes && nodes[0] ? nodes[0].textContent.trim() : ""; + } catch (e) { + return ""; + } + }, + text: (doc, selector) => { + try { + const el = (doc || {}).querySelector(selector); + return el ? el.textContent.trim() : ""; + } catch (e) { + return ""; + } + }, + trimInternal: (s) => (s || "").replace(/\s+/g, " ").trim(), + }; + createContext(sandbox); + try { + runInContext(sdSrc, sandbox, { filename: filename }); + } catch (e) { + // Some translators reference globals at load time; warn but continue + console.warn("Warning: executing translator source threw:", e && e.message); + } + + // Prefer the `testCases` variable populated by executing the file in the sandbox. + // Fall back to extracting and evaluating the array literal if the variable isn't present. + let testCases = sandbox.testCases; + if (!testCases) { + const m = sdSrc.match(/var\s+testCases\s*=\s*([\s\S]*?\]);/m); + if (!m) { + console.error("Could not find testCases in ", filename); + process.exit(1); + } + try { + testCases = new Function("return " + m[1])(); + console.log("Extracted testCases via fallback literal evaluation"); + } catch (e) { + console.error("Failed to evaluate testCases array:", e); + process.exit(1); + } + } + + // We'll import the translator file directly when running so that the + // translator's code executes in the same module context where + // `runTranslatorOnHtml` installs ZU/Zotero shims. + const sdFileUrl = "file://" + sdPath; + + console.log("Found", testCases.length, "test cases"); + let test_id = 0; + + for (let i = 0; i < testCases.length; i++) { + const tc = testCases[i]; + if (tc.type === "search") { + console.error("arXiv: Skip category."); + continue; + } + + const position = i + 1; + + // If a single test index was requested, skip others + if (singleTestIndex && position !== singleTestIndex) continue; + + test_id = position; + + if (!tc) continue; + + // If the requested single test is not runnable, report and exit early + // if (singleTestIndex && (tc.type !== 'web' || tc.items == "multiple")) { + // console.error(`Selected test #${position} is not runnable (type: ${tc.type}, items: ${tc.items})`); + // return; + // } + + // if (tc.type !== 'web' || tc.items == "multiple") continue; + const url = tc.url; + console.log(`\n=== Test case #${test_id}/${testCases.length}: ${url} ===`); + try { + if (url.includes("arxiv.org/") && (url.includes("find/") || tc.type === "search")) { + console.error("arXiv: Legacy Find has been shut off."); + continue; + } + // Try cache first to avoid refetching the same page across runs + let html = await readCachedHtml(url); + if (!html) { + const res = await fetch(url, { redirect: "follow" }); + html = await res.text(); + // Cache successful fetches for reuse + try { + await writeCachedHtml(url, html); + } catch (e) {} + } + console.log(`Running translator on cached file: ${urlToCacheName(url)}`); + // Expose the current test URL so our DOMParser wrapper can set + // `doc.location` before the translator runs. + try { + global.__test_current_url = url; + } catch (e) {} + const out = await runTranslatorOnHtml(sdFileUrl, html, url); + try { + delete global.__test_current_url; + } catch (e) {} + if (!out) { + throw new Error("No output from translator"); + } + // console.log('Result:', typeof out === 'string' ? out.slice(0, 1000) : JSON.stringify(out, null, 2)); + } catch (e) { + console.error("Error processing", url, e && e.message); + // Some translators return "multiple" during detection; the + // runner doesn't support multi-select execution. Treat that + // as an expected outcome when the test case expects multiple + // items and continue to the next test instead of aborting. + if ( + e && + e.message && + e.message.includes("multi-select not supported") && + tc.items === "multiple" + ) { + console.log("Translator reported multiple items (expected) — skipping execution"); + continue; + } + if (e.message == "Could not scrape metadata via known methods") { + console.error("Skip this test due to translator inability to scrape metadata."); + } else { + break; + } + } + } +} + +// Run the test on a specified file if given as command-line argument, otherwise on all the files. +const args = process.argv.slice(2); +if (args.length >= 1) { + const filename = args[0]; + const indexArg = args[1]; + let singleTestIndex = null; + if (typeof indexArg !== "undefined") { + singleTestIndex = parseInt(indexArg, 10); + if (!Number.isInteger(singleTestIndex) || singleTestIndex < 1) { + console.error("Invalid test index. Provide a 1-based positive integer as second argument."); + process.exit(1); + } + } + run_on_file(filename, singleTestIndex).catch((e) => { + console.error("Fatal error:", e); + process.exit(1); + }); +} else { + // No argument: run on all test files in translators/zotero + const translatorsDir = join(ROOT_DIR, "translators", "zotero"); + readdir(translatorsDir, (err, files) => { + if (err) { + console.error("Failed to read translators directory:", err); + process.exit(1); + } + const jsFiles = files.filter((f) => f.endsWith(".js")); + (async () => { + // Run translator test files in parallel with bounded concurrency to + // avoid overwhelming the machine or network. Default concurrency=4. + const concurrency = 4; + let idx = 0; + const results = []; + + const worker = async () => { + while (true) { + let cur; + // simple atomic fetch + if (idx >= jsFiles.length) return; + cur = jsFiles[idx++]; + console.log(`\n\n######## Running tests for translator file: ${cur} ########`); + try { + await run_on_file(cur); + results.push({ file: cur, ok: true }); + } catch (e) { + console.error("Fatal error while running", cur, e); + results.push({ file: cur, ok: false, error: e }); + } + } + }; + + const workers = Array.from({ length: Math.min(concurrency, jsFiles.length) }, () => worker()); + await Promise.all(workers); + // Optionally inspect results to decide exit code + const failed = results.find((r) => !r.ok); + if (failed) process.exit(1); + })().catch((e) => { + console.error("Fatal error:", e); + process.exit(1); + }); + }); +} diff --git a/tests/translator-import.test.mjs b/tests/translator-import.test.mjs new file mode 100644 index 00000000..29a83039 --- /dev/null +++ b/tests/translator-import.test.mjs @@ -0,0 +1,67 @@ +import { readdir } from "node:fs/promises"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import { describe, expect, it } from "vitest"; + +import { setSandbox } from "../sources/sandbox.js"; + +const TRANSLATORS_DIR = path.resolve(process.cwd(), "translators", "zotero"); +const translatorFiles = (await readdir(TRANSLATORS_DIR)).filter((name) => name.endsWith(".js")); +const EXPORT_CANDIDATES = [ + "detectWeb", + "doWeb", + "detectImport", + "doImport", + "detectSearch", + "doSearch", + "doExport", +]; + +// DOMParser is provided by the browser environment +// So we mock it here +globalThis.DOMParser = class { + parseFromString() { + return {}; + } +}; + +setSandbox({ + ZU: { + cleanAuthor: (_) => {}, + fieldIsValidForType: (_) => true, + }, + Zotero: { + Item: class {}, + }, + requestJSON: async () => {}, + requestText: async () => {}, + text: () => "", + attr: () => "", +}); + +describe("Zotero translator", () => { + for (const filename of translatorFiles) { + if (filename === "Bibliontology RDF.js") { + // Currently fails, needs https://github.com/zotero/translators/pull/3594 + it.skip(`skips ${filename} due to known issues`, () => {}); + continue; + } + + const filePath = path.join(TRANSLATORS_DIR, filename); + const moduleUrl = pathToFileURL(filePath).href; + it(`imports ${filename}`, async () => { + await expect(import(moduleUrl)).resolves.toBeDefined(); + }); + + it(`exports expected entry points for ${filename}`, async () => { + const mod = await import(moduleUrl); + const exportedEntryPoints = EXPORT_CANDIDATES.filter( + (fnName) => typeof mod[fnName] === "function", + ); + + expect(exportedEntryPoints, `${filename} should export at least one entry point`).not.toBe( + [], + ); + }); + } +}); diff --git a/translators/manifest.json b/translators/manifest.json new file mode 100644 index 00000000..7a6f8ad4 --- /dev/null +++ b/translators/manifest.json @@ -0,0 +1,9212 @@ +[ + { + "path": "translators/zotero/ABC News Australia.js", + "label": "ABC News Australia", + "translatorID": "92d45016-5f7b-4bcf-bb63-193033f02f2b", + "target": "https?://(www\\.)?abc\\.net\\.au/news/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Joyce Chia", + "priority": 100, + "lastUpdated": "2021-07-23 00:29:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Access Engineering.js", + "label": "Access Engineering", + "translatorID": "d120a8a7-9d45-446e-8c18-ad9ef0a6bf47", + "target": "^https?://www\\.accessengineeringlibrary\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Vinoth K - highwirepress.com", + "priority": 100, + "lastUpdated": "2023-09-09 09:42:36", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Access Medicine.js", + "label": "Access Medicine", + "translatorID": "60e55b65-08cb-4a8f-8a61-c36338ec8754", + "target": "^https?://(0-)?(access(anesthesiology|cardiology|emergencymedicine|medicine|pediatrics|surgery)|neurology)\\.mhmedical\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jaret M. Karnuta", + "priority": 100, + "lastUpdated": "2017-01-12 22:14:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Access Science.js", + "label": "Access Science", + "translatorID": "558330ca-3531-467a-8003-86cd9602cc48", + "target": "^https?://www\\.accessscience\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Vinoth K - highwirepress.com", + "priority": 100, + "lastUpdated": "2023-10-17 20:19:39", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ACLS Humanities EBook.js", + "label": "ACLS Humanities EBook", + "translatorID": "2553b683-dc1b-4a1e-833a-7a7755326186", + "target": "^https?://www\\.fulcrum\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-03 01:54:15", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ACLWeb.js", + "label": "ACLWeb", + "translatorID": "f4a5876a-3e53-40e2-9032-d99a30d7a6fc", + "target": "^https?://(www\\.)?(aclanthology\\.org|aclweb\\.org/anthology)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guy Aglionby", + "priority": 100, + "lastUpdated": "2022-11-10 10:36:48", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ACM Digital Library.js", + "label": "ACM Digital Library", + "translatorID": "f3f092bf-ae09-4be6-8855-a22ddd817925", + "target": "^https://dl\\.acm\\.org/(doi|do|profile|toc|topic|keyword|action/doSearch|acmbooks|browse)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guy Aglionby", + "priority": 100, + "lastUpdated": "2026-01-07 17:48:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ACM Queue.js", + "label": "ACM Queue", + "translatorID": "212ffcc8-927c-4e84-a097-bd24fd4a44b6", + "target": "^https://queue\\.acm\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bogdan Lynn", + "priority": 100, + "lastUpdated": "2025-12-04 18:10:19", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ACS Publications.js", + "label": "ACS Publications", + "translatorID": "938ebe32-2b2e-4349-a5b3-b3a05d3de627", + "target": "^https?://pubs\\.acs\\.org/(toc/|journal/|topic/|isbn/\\d|doi/(full/|abs/|epdf/|book/)?10\\.|action/(doSearch\\?|showCitFormats\\?.*doi))", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Michael Berkowitz, Santawort, and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2024-09-30 13:50:18", + "minVersion": "4.0.5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Adam Matthew Digital.js", + "label": "Adam Matthew Digital", + "translatorID": "0701696c-3523-47ba-9617-b04eee03b6ba", + "target": "^https?://www\\.([^.]+)\\.amdigital\\.co\\.uk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-21 05:00:48", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ADS Bibcode.js", + "label": "ADS Bibcode", + "translatorID": "09bd8037-a9bb-4f9a-b3b9-d18b2564b49e", + "target": "", + "translatorType": 8, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/AEA Web.js", + "label": "AEA Web", + "translatorID": "6044b16f-2452-4ce8-ad02-fab69ef04f13", + "target": "^https?://www\\.aeaweb\\.org/(articles|journals|issues)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebatian Karcher", + "priority": 100, + "lastUpdated": "2025-05-08 17:43:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Agencia del ISBN.js", + "label": "Agencia del ISBN", + "translatorID": "b8a86e36-c270-48c9-bdd1-22aaa167ef46", + "target": "^https?://www\\.mcu\\.es/webISBN", + "browserSupport": "gcs", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2015-06-10 11:33:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/AGRIS.js", + "label": "AGRIS", + "translatorID": "48a67d12-1bcf-44ac-a4f4-11457ebfc0bb", + "target": "^https?://agris\\.fao\\.org/agris-search/search", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-12 21:34:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ahval News.js", + "label": "Ahval News", + "translatorID": "64f4a2b8-33d8-4303-834a-3b71065cf6c6", + "target": "^https?://ahvalnews\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-12 20:49:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/AIP.js", + "label": "AIP", + "translatorID": "48d3b115-7e09-4134-ad5d-0beda6296761", + "target": "^https?://scitation\\.aip\\.org/(search\\?|content/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2015-10-17 17:37:33", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Air University Journals.js", + "label": "Air University Journals", + "translatorID": "e317b4d4-03cf-4356-aa3c-defadc6fd10e", + "target": "https?://www\\.airuniversity\\.af\\.edu/(ASPJ|SSQ)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-10-14 19:04:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Airiti.js", + "label": "Airiti", + "translatorID": "5f0ca39b-898a-4b1e-b98d-8cd0d6ce9801", + "target": "^https?://([^/]+\\.)?airitilibrary\\.com/Publication/alDetailedMesh", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 110, + "lastUpdated": "2023-08-04 05:04:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Alexander Street Press.js", + "label": "Alexander Street Press", + "translatorID": "0a84a653-79ea-4c6a-8a68-da933e3b504a", + "target": "^https?://(www\\.)alexanderstreet", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "John West and Michael Berkowitz", + "priority": 100, + "lastUpdated": "2021-12-28 04:42:00", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/AllAfrica.js", + "label": "AllAfrica", + "translatorID": "34B1E0EA-FD02-4069-BAE4-ED4D98674A5E", + "target": "^https?://(fr\\.)?allafrica\\.com/(stories|search)/", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-22 19:33:08", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Alsharekh.js", + "label": "Alsharekh", + "translatorID": "70fbaf2f-ba02-426c-8beb-4ddfbbefd14b", + "target": "^https://archive\\.alsharekh\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-07-24 02:21:59", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Aluka.js", + "label": "Aluka", + "translatorID": "e8fc7ebc-b63d-4eb3-a16c-91da232f7220", + "target": "^https?://(www\\.)aluka\\.org/(stable/|struggles/search\\?|struggles/collection/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-09-27 06:02:24", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Amazon.js", + "label": "Amazon", + "translatorID": "96b9f483-c44d-5784-cdad-ce21b984fe01", + "target": "^https?://((www\\.)|(smile\\.))?amazon", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Michael Berkowitz, and Simon Kornblith", + "priority": 100, + "lastUpdated": "2025-03-20 15:38:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/American Archive of Public Broadcasting.js", + "label": "American Archive of Public Broadcasting", + "translatorID": "d13eb92e-fb16-41e0-9a24-73bad50f9bb7", + "target": "^https?://(www\\.)?americanarchive\\.org/catalog", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-28 19:23:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/American Institute of Aeronautics and Astronautics.js", + "label": "American Institute of Aeronautics and Astronautics", + "translatorID": "75edc5a1-6470-465a-a928-ccb77d95eb72", + "target": "^https?://arc\\.aiaa\\.org/", + "browserSupport": "gcv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2013-12-12 03:22:14", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/AMS Journals.js", + "label": "AMS Journals", + "translatorID": "bdaac15c-b0ee-453f-9f1d-f35d00c7a994", + "target": "^https?://www\\.ams\\.org/journals/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2016-09-03 20:50:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/AMS MathSciNet (Legacy).js", + "label": "AMS MathSciNet (Legacy)", + "translatorID": "a354331-981b-43de-a61-bc26dd1be3a9", + "target": "^https?://(mathscinet\\.)?ams\\.[^/]*/(mathscinet/2006/)?mathscinet(\\-getitem\\?|/search/(publications\\.html|publdoc\\.html))", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-07-06 17:03:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/AMS MathSciNet.js", + "label": "AMS MathSciNet", + "translatorID": "16f2936d-a059-40e8-a48e-f0acbb1e93e0", + "target": "^https?://mathscinet\\.ams\\.[^/]*/mathscinet/(article\\?|publications-search\\?|author\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-07-14 11:04:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Anarchist Library.js", + "label": "Anarchist Library", + "translatorID": "1a31e4c5-22ed-4b5b-a75f-55476db29a44", + "target": "https://theanarchistlibrary\\.org/(latest|library|stats/popular|category/topic|category/author|special/index|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sister Ba\u00e6'l", + "priority": 100, + "lastUpdated": "2025-10-25 01:31:43", + "minVersion": "7.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ancestry.com US Federal Census.js", + "label": "Ancestry.com US Federal Census", + "translatorID": "0dda3f89-15de-4479-987f-cc13f1ba7999", + "target": "^https?://(www\\.)?ancestry\\.com/", + "browserSupport": "gcibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-22 19:20:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Annual Reviews.js", + "label": "Annual Reviews", + "translatorID": "5f22bd25-5b70-11e1-bb1d-c4f24aa18c1e", + "target": "^https?://[^/]*annualreviews\\.org(:[\\d]+)?(?=/)[^?]*(/(toc|journal|doi)/|showMost(Read|Cited)Articles|doSearch)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius and Abe Jellinek", + "priority": 150, + "lastUpdated": "2022-08-02 12:48:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Antikvarium.hu.js", + "label": "Antikvarium.hu", + "translatorID": "68a54283-67e0-4e1c-ad3d-5b699868b194", + "target": "^https?://(www\\.)?antikvarium\\.hu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Vel\u0151sy P\u00e9ter Krist\u00f3f", + "priority": 100, + "lastUpdated": "2021-09-22 19:39:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/APA PsycNET.js", + "label": "APA PsycNet", + "translatorID": "1e1e35be-6264-45a0-ad2e-7212040eb984", + "target": "^https?://(psycnet|doi)\\.apa\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-03-10 19:48:42", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/APS-Physics.js", + "label": "APS-Physics", + "translatorID": "f318ab1e-71c6-4f67-8ac3-4b1144e5bf4e", + "target": "^https?://(www\\.)?(physics)\\.aps\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Will Shanks and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-31 22:13:29", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/APS.js", + "label": "APS", + "translatorID": "2c310a37-a4dd-48d2-82c9-bd29c53c1c76", + "target": "^https?://journals\\.aps\\.org/([^/]+/(abstract|supplemental|references|cited-by|issues)/|search(\\?|/))", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius and Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-11-21 18:50:09", + "minVersion": "3.0.12", + "maxVersion": "" + }, + { + "path": "translators/zotero/AquaDocs.js", + "label": "AquaDocs", + "translatorID": "97b65138-71b7-424f-b305-4a2161e90661", + "target": "^https?://aquadocs\\.org/(handle|discover|browse)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-08-24 02:41:29", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Archeion.js", + "label": "Archeion", + "translatorID": "f6717cbb-2771-4043-bde9-dbae19129bb3", + "target": "^https?://www\\.(archeion|memorybc|albertaonrecord)\\.ca", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2018-03-05 07:08:54", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Archiv fuer Sozialgeschichte.js", + "label": "Archiv fuer Sozialgeschichte", + "translatorID": "7ecb9512-9195-478a-a525-40e71b01f3b0", + "target": "^https?://library\\.fes\\.de/jportal/", + "browserSupport": "gcbv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2013-05-15 20:05:47", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC).js", + "label": "Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC)", + "translatorID": "dedcae51-073c-48fb-85ce-2425e97f128d", + "target": "^https?://archivesic\\.ccsd\\.cnrs\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2021-12-27 20:43:34", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Archives Canada.js", + "label": "Archives Canada", + "translatorID": "18bc329c-51af-497e-a7cf-aa572fae363d", + "target": "^https?://(www\\.)?archivescanada\\.ca", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2019-06-13 23:00:25", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ariana News.js", + "label": "Ariana News", + "translatorID": "44552245-d911-4613-8b4f-19f41a5e5b0d", + "target": "^https://ariananews\\.af/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-16 15:20:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Art Institute of Chicago.js", + "label": "Art Institute of Chicago", + "translatorID": "8e98b11a-5648-42b2-8542-5f366cb953f6", + "target": "^https?://(www\\.)?artic\\.edu/(artworks/|collection)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "nikhil trivedi, Illya Moskvin", + "priority": 100, + "lastUpdated": "2021-06-04 20:08:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Artefacts Canada.js", + "label": "Artefacts Canada", + "translatorID": "661fc39a-2500-4710-8285-2d67ddc00a69", + "target": "^https?://(www\\.)?pro\\.rcip-chin\\.gc\\.ca", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2013-09-16 00:25:18", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ARTFL Encyclopedie.js", + "label": "ARTFL Encyclopedie", + "translatorID": "72cb2536-3211-41e0-ae8b-974c0385e085", + "target": "^https?://artflsrv\\d+\\.uchicago\\.edu/philologic4/encyclopedie\\d+/(navigate/|query)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Sebastian Karcher, and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-30 19:55:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Artforum.js", + "label": "Artforum", + "translatorID": "a127f012-4ea4-4d05-a657-24d47f91b016", + "target": "^https?://(www\\.)?artforum\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2021-09-02 00:33:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/artnet.js", + "label": "artnet", + "translatorID": "a6bfb69f-5dd3-4d60-b9ad-d68ef9eb9a26", + "target": "https?://(www\\.)?artnet\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-20 15:14:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ARTstor.js", + "label": "ARTstor", + "translatorID": "5278b20c-7c2c-4599-a785-12198ea648bf", + "target": "^https?://library\\.artstor\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-23 05:46:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/arXiv.org.js", + "label": "arXiv.org", + "translatorID": "ecddda2e-4fc6-4aea-9f17-ef3b56d7377a", + "target": "^https?://([^\\.]+\\.)?(arxiv\\.org|xxx\\.lanl\\.gov)/(search|find|catchup|list/\\w|abs/|pdf/)", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Sean Takats and Michael Berkowitz", + "priority": 100, + "lastUpdated": "2025-11-12 15:42:58", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ASCE.js", + "label": "ASCE", + "translatorID": "303bdfc5-11b8-4107-bca1-63ca97701a0f", + "target": "^https?://(www\\.)?ascelibrary\\.org/(toc|doi|action)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2020-06-28 02:29:25", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/ASTIS.js", + "label": "ASTIS", + "translatorID": "d4e227c0-cebb-425a-ac8d-a6625c4bfdd2", + "target": "^https?://(www\\.)?aina\\.ucalgary\\.ca/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-04 19:44:55", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Atlanta Journal-Constitution.js", + "label": "Atlanta Journal-Constitution", + "translatorID": "01322929-5782-4612-81f7-d861fb46d9f2", + "target": "^https?://(www\\.)?ajc\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-14 19:41:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ATS International Journal.js", + "label": "ATS International Journal", + "translatorID": "ec0628ad-e508-444e-9e4c-e1819766a1ae", + "target": "^https?://(www\\.)?atsinternationaljournal\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-09-10 19:50:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Atypon Journals.js", + "label": "Atypon Journals", + "translatorID": "5af42734-7cd5-4c69-97fc-bc406999bdba", + "target": "^https?://[^?#]+(/doi/((abs|abstract|full|figure|ref|citedby|book)/)?10\\.|/action/doSearch\\?)|^https?://[^/]+/toc/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 270, + "lastUpdated": "2022-10-25 02:51:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/AustLII and NZLII.js", + "label": "AustLII and NZLII", + "translatorID": "5ed5ab01-899f-4a3b-a74c-290fb2a1c9a4", + "target": "^https?://(www\\d?|classic)\\.(austlii\\.edu\\.au|nzlii\\.org)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Justin Warren, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2024-11-21 18:54:11", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Australian Dictionary of Biography.js", + "label": "Australian Dictionary of Biography", + "translatorID": "0aea3026-a246-4201-a4b5-265f75b9a6a7", + "target": "^https?://adb\\.anu\\.edu\\.au/biograph(y|ies)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-07-14 04:18:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Baidu Scholar.js", + "label": "Baidu Scholar", + "translatorID": "e034d9be-c420-42cf-8311-23bca5735a32", + "target": "^https?://(www\\.)?xueshu\\.baidu\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-06-16 17:43:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BAILII.js", + "label": "BAILII", + "translatorID": "5ae63913-669a-4792-9f45-e089a37de9ab", + "target": "^https?://www\\.bailii\\.org(/cgi\\-bin/markup\\.cgi\\?doc\\=)?/\\w+/cases/.+", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bill McKinney", + "priority": 100, + "lastUpdated": "2021-09-16 20:57:17", + "minVersion": "1.0.0b4.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bangkok Post.js", + "label": "Bangkok Post", + "translatorID": "7f74d823-d2ba-481c-b717-8b12c90ed874", + "target": "^https://www\\.bangkokpost\\.com/[a-z0-9-]+/([a-z0-9-]+/)?[0-9]+", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Matt Mayer", + "priority": 100, + "lastUpdated": "2024-06-18 20:46:45", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Baruch Foundation.js", + "label": "Baruch Foundation", + "translatorID": "283d6b78-d3d7-48d4-8fc0-0bdabef7c4ee", + "target": "^https?://baruchfoundation\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-20 18:55:13", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BBC Genome.js", + "label": "BBC Genome", + "translatorID": "777e5ce0-0b16-4a12-8e6c-5a1a2cb33189", + "target": "^https?://genome\\.ch\\.bbc\\.co\\.uk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-09-04 22:38:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BBC.js", + "label": "BBC", + "translatorID": "f4130157-93f7-4493-8f24-a7c85549013d", + "target": "^https?://(www|news?)\\.bbc\\.(co\\.uk|com)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-10 21:51:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/beck-online.js", + "label": "beck-online", + "translatorID": "e8544423-1515-4daf-bb5d-3202bf422b58", + "target": "^https?://beck[-.]online\\.beck\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-07-09 13:33:45", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Beobachter.js", + "label": "Beobachter", + "translatorID": "a571680e-6338-46c2-a740-3cd9eb80fc7f", + "target": "^https?://((www\\.)?beobachter\\.ch/.)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-02-05 20:11:36", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/BibLaTeX.js", + "label": "BibLaTeX", + "translatorID": "b6e39b57-8942-4d11-8259-342c46ce395f", + "target": "bib", + "translatorType": 2, + "creator": "Simon Kornblith, Richard Karnesky and Anders Johansson", + "priority": 100, + "lastUpdated": "2024-03-25 14:49:42", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Biblio.com.js", + "label": "Biblio.com", + "translatorID": "9932d1a7-cc6d-4d83-8462-8f6658b13dc0", + "target": "^https?://www\\.biblio\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble, Michael Berkowitz, Sebastian Karcher, and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-14 21:52:42", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bibliontology RDF.js", + "label": "Bibliontology RDF", + "translatorID": "14763d25-8ba0-45df-8f52-b8d1108e7ac9", + "target": "rdf", + "browserSupport": "gcsibv", + "translatorType": 3, + "creator": "Simon Kornblith", + "priority": 50, + "lastUpdated": "2022-09-30 10:56:50", + "minVersion": "2.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Biblioteca Nacional de Maestros.js", + "label": "Biblioteca Nacional de Maestros", + "translatorID": "b383df35-15e7-43ee-acd9-88fd62669083", + "target": "^https?://www\\.bnm\\.me\\.gov\\.ar/catalogo", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2020-06-22 00:23:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bibliotheque et Archives Nationale du Quebec (Pistard).js", + "label": "Bibliotheque et Archives Nationale du Quebec (Pistard)", + "translatorID": "1eb5eb03-26ab-4015-bd0d-65487734744a", + "target": "^https?://pistard\\.banq\\.qc\\.ca", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2008-08-06 17:00:00", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bibliotheque et Archives Nationales du Quebec.js", + "label": "Biblioth\u00e8que et Archives Nationales du Qu\u00e9bec", + "translatorID": "59cce211-9d77-4cdd-876d-6229ea20367f", + "target": "^https?://catalogue\\.banq\\.qc\\.ca/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2015-06-29 17:02:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bibliotheque nationale de France.js", + "label": "Biblioth\u00e8que nationale de France", + "translatorID": "47533cd7-ccaa-47a7-81bb-71c45e68a74d", + "target": "^https?://[^/]*catalogue\\.bnf\\.fr", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Florian Ziche, Sylvain Machefert", + "priority": 100, + "lastUpdated": "2024-01-09 03:40:58", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BIBSYS.js", + "label": "BIBSYS", + "translatorID": "ab961e61-2a8a-4be1-b8a3-044f20d52d78", + "target": "^https?://ask\\.bibsys\\.no/ask/action", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ramesh Srigiriraju", + "priority": 100, + "lastUpdated": "2021-12-28 04:44:52", + "minVersion": "1.0.0b4.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/BibTeX.js", + "label": "BibTeX", + "translatorID": "9cb70025-a888-4a29-a210-93ec52da40d4", + "target": "bib", + "translatorType": 3, + "creator": "Simon Kornblith, Richard Karnesky and Emiliano heyns", + "priority": 200, + "lastUpdated": "2024-03-25 14:51:02", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bioconductor.js", + "label": "Bioconductor", + "translatorID": "21f62926-4343-4518-b6f2-a284e650e64a", + "target": "https?://(www\\.)?bioconductor\\.org/(packages/.*/bioc/html|help/search)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Qiang Hu", + "priority": 100, + "lastUpdated": "2019-09-17 16:47:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BioMed Central.js", + "label": "BioMed Central", + "translatorID": "75ccea3c-fdb8-4473-8203-ceb27f3395f8", + "target": "^https?://[^\\.]+\\.(biomedcentral|springeropen)\\.com/(articles|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2020-12-01 16:45:33", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BioOne.js", + "label": "BioOne", + "translatorID": "7cb0089b-9551-44b2-abca-eb03cbf586d9", + "target": "^https?://[^/]*www\\.bioone\\.org[^/]*/s", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2014-04-03 16:38:14", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Blaetter.js", + "label": "Blaetter fuer deutsche und internationale Politik", + "translatorID": "e8e10bd4-fd6f-4297-a060-a8e0a479043f", + "target": "^https?://www\\.blaetter\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff", + "priority": 100, + "lastUpdated": "2014-04-03 16:42:18", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Blogger.js", + "label": "Blogger", + "translatorID": "6f9aa90d-6631-4459-81ef-a0758d2e3921", + "target": "\\.blogspot\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2016-09-05 23:14:05", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bloomberg.js", + "label": "Bloomberg", + "translatorID": "a509f675-cf80-4b70-8cbc-2ea8664dd38f", + "target": "^https?://(www)?\\.bloomberg\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-09-08 20:56:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bloomsbury Food Library.js", + "label": "Bloomsbury Food Library", + "translatorID": "0524c89b-2a96-4d81-bb05-ed91ed8b2b47", + "target": "^https?://(www\\.)?bloomsburyfoodlibrary\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-03 01:17:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bluesky.js", + "label": "Bluesky", + "translatorID": "3bba003a-ad42-457e-9ea1-547df39d9d00", + "target": "^https://bsky\\.app/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Stephan H\u00fcgel", + "priority": 100, + "lastUpdated": "2025-03-26 14:26:25", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BnF ISBN.js", + "label": "BnF ISBN", + "translatorID": "f349954c-9957-4b5f-be24-1a8bb52f7fbd", + "target": "", + "browserSupport": "gcsibv", + "translatorType": 8, + "creator": "Abe Jellinek", + "priority": 98, + "lastUpdated": "2021-07-30 21:23:00", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BOCC.js", + "label": "BOCC", + "translatorID": "ecd1b7c6-8d31-4056-8c15-1807b2489254", + "target": "^https?://[^/]*bocc[^/]*/(_listas|_esp)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Jos\u00e9 Antonio Meira da Rocha", + "priority": 100, + "lastUpdated": "2014-04-04 10:08:43", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/BOE.js", + "label": "BOE", + "translatorID": "3f1b68b1-8ee7-4ab7-a514-185d72b2f80d", + "target": "^https?://([a-z]+\\.)?boe\\.es/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "F\u00e9lix Brezo (@febrezo)", + "priority": 100, + "lastUpdated": "2021-07-26 17:07:40", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bookmarks.js", + "label": "Bookmarks", + "translatorID": "4e7119e0-02be-4848-86ef-79a64185aad8", + "target": "html", + "translatorType": 3, + "creator": "Avram Lyon", + "priority": 100, + "lastUpdated": "2022-07-14 20:21:20", + "minVersion": "2.1b6", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bookshop.org.js", + "label": "Bookshop.org", + "translatorID": "05997944-d1c2-41bf-a399-9932268c81e5", + "target": "^https://bookshop\\.org/books", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-01 17:14:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Boston Review.js", + "label": "Boston Review", + "translatorID": "55d28a64-e56e-4d3c-93db-a5fc584776de", + "target": "^https?://(www\\.)?bostonreview\\.net/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-08-18 06:17:49", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bosworth Toller's Anglo-Saxon Dictionary Online.js", + "label": "Bosworth Toller's Anglo-Saxon Dictionary Online", + "translatorID": "b2d07a2a-c8c6-4426-ba6b-35f094a4d916", + "target": "^https://bosworthtoller\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Zo\u00eb C. Ma", + "priority": 100, + "lastUpdated": "2023-08-18 07:39:58", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bracero History Archive.js", + "label": "Bracero History Archive", + "translatorID": "f9373e49-e6ac-46f7-aafe-bb24a2fbc3f0", + "target": "^https?://braceroarchive\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2021-12-28 04:32:48", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Brill.js", + "label": "Brill", + "translatorID": "6d087de8-f858-4ac5-9fbd-2bf2b35ee41a", + "target": "^https?://(www\\.|referenceworks\\.|bibliographies\\.)?brill(online)?\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-06-14 15:36:55", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Brukerhandboken.js", + "label": "Brukerh\u00e5ndboken", + "translatorID": "6c94ba9a-8639-4f58-bea3-076f774cf3a1", + "target": "https://brukerhandboken\\.miraheze\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sondre Bogen-Straume", + "priority": 100, + "lastUpdated": "2024-06-27 16:03:43", + "minVersion": "5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bryn Mawr Classical Review.js", + "label": "Bryn Mawr Classical Review", + "translatorID": "635c1246-e0c8-40a0-8799-a73a0b013ad8", + "target": "^https?://bmcr\\.brynmawr\\.edu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz, John Muccigrosso, and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-22 05:27:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Bundesgesetzblatt.js", + "label": "Bundesgesetzblatt", + "translatorID": "e23afbe8-b5cb-42cc-af90-e915b2c00de2", + "target": "^https?://www\\.bgbl\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-07-22 20:35:31", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CABI - CAB Abstracts.js", + "label": "CABI - CAB Abstracts", + "translatorID": "a29d22b3-c2e4-4cc0-ace4-6c2326144332", + "target": "^https?://(www\\.)?cabidirect\\.org/cabdirect", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-06-14 03:41:30", + "minVersion": "3.0.4", + "maxVersion": "" + }, + { + "path": "translators/zotero/Cairn.info.js", + "label": "Cairn.info", + "translatorID": "f46cc903-c447-47d6-a2cf-c75ed22dc96b", + "target": "^https?://www\\.cairn\\.info/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher, Sylvain Machefert and Nicolas Chachereau", + "priority": 100, + "lastUpdated": "2023-10-23 08:08:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Calisphere.js", + "label": "Calisphere", + "translatorID": "80505478-d42e-4920-8c33-4f863d4ce513", + "target": "^https://calisphere\\.org/(item/|search/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-07 21:01:11", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CalMatters.js", + "label": "CalMatters", + "translatorID": "64b634ce-3957-4c89-bcce-7603fe552780", + "target": "^https?://calmatters\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-07 18:07:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Camara Brasileira do Livro ISBN.js", + "label": "C\u00e2mara Brasileira do Livro ISBN", + "translatorID": "cdb5c893-ab69-4e96-9b5c-f4456d49ddd8", + "target": "", + "translatorType": 8, + "creator": "Abe Jellinek", + "priority": 98, + "lastUpdated": "2023-09-26 16:11:18", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Cambridge Core.js", + "label": "Cambridge Core", + "translatorID": "850f4c5f-71fb-4669-b7da-7fb7a95500ef", + "target": "^https?://www\\.cambridge\\.org/core/(search\\?|journals/|books/|.+/listing?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-11-20 15:43:05", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Cambridge Engage Preprints.js", + "label": "Cambridge Engage Preprints", + "translatorID": "4338eead-a8b7-431f-8533-ea53062c9f89", + "target": "/engage/[^/]+/(article-details/|search-dashboard\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 200, + "lastUpdated": "2023-10-23 08:35:07", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Canada.com.js", + "label": "Canada.com", + "translatorID": "4da40f07-904b-4472-93b6-9bea1fe7d4df", + "target": "^https?://www\\.canada\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2021-12-28 04:34:11", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Canadian Letters and Images.js", + "label": "Canadian Letters and Images", + "translatorID": "a7c8b759-6f8a-4875-9d6e-cc0a99fe8f43", + "target": "^https?://(www\\.)?canadianletters\\.ca/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-09-09 19:45:42", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Canadiana.ca.js", + "label": "Canadiana.ca", + "translatorID": "2d174277-7651-458f-86dd-20e168d2f1f3", + "target": "^https?://eco\\.canadiana\\.ca", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2012-07-03 16:44:04", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/CanLII.js", + "label": "CanLII", + "translatorID": "84799379-7bc5-4e55-9817-baf297d129fe", + "target": "^https?://(www\\.)?canlii\\.org/(en|fr)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-03-15 05:20:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CAOD.js", + "label": "CAOD", + "translatorID": "d2a9e388-5b79-403a-b4ec-e7099ca1bb7f", + "target": "^https?://caod\\.oriprobe\\.com/articles/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guy Aglionby", + "priority": 100, + "lastUpdated": "2018-09-08 13:38:50", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Cascadilla Proceedings Project.js", + "label": "Cascadilla Proceedings Project", + "translatorID": "cbed2134-f963-43a0-a8ad-9813e94de9a7", + "target": "^https?://(www\\.)?lingref\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-29 00:35:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CBC.js", + "label": "CBC", + "translatorID": "03c4b906-8cb2-4850-a771-697cbd92c2a1", + "target": "^https?:\\/\\/www\\.cbc\\.ca/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Geoff Banh", + "priority": 100, + "lastUpdated": "2024-03-14 20:55:10", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CCfr (BnF).js", + "label": "CCfr (BnF)", + "translatorID": "899d10f5-3f35-40e6-8dfb-f8ee2dfb1849", + "target": "^https?://ccfr\\.bnf\\.fr/portailccfr/.*\\b(action=search|menu=menu_view_grappage|search\\.jsp)\\b", + "browserSupport": "g", + "translatorType": 4, + "creator": "Sylvain Machefert, Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2014-09-18 14:08:05", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Cell Press.js", + "label": "Cell Press", + "translatorID": "f26cfb71-efd7-47ae-a28c-d4d8852096bd", + "target": "^https?://([^/]*\\.)?cell\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz, Sebastian Karcher, Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2017-06-06 22:03:36", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Central and Eastern European Online Library Journals.js", + "label": "Central and Eastern European Online Library Journals", + "translatorID": "19cef926-c5b6-42e2-a91c-6f2722f8b36d", + "target": "^https?://www\\.ceeol\\.com/search", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Timotheus Kim", + "priority": 100, + "lastUpdated": "2021-09-22 20:12:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CERN Document Server.js", + "label": "CERN Document Server", + "translatorID": "e4b51f32-bb3f-4d37-a46d-083efe534233", + "target": "^https?://cds\\.cern\\.ch/(search\\?|collection/|record/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-04-13 01:12:36", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CEUR Workshop Proceedings.js", + "label": "CEUR Workshop Proceedings", + "translatorID": "5f88a099-564d-4885-9a2a-e72939be3a8c", + "target": "https?://ceur-ws\\.org/Vol-", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-25 17:43:52", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CFF References.js", + "label": "CFF References", + "translatorID": "99A6641F-A8C2-4923-9BBB-0DA87F1E5187", + "target": "cff", + "translatorType": 2, + "creator": "Sebastian Karcher, Dave Bunten", + "priority": 100, + "lastUpdated": "2024-05-17 20:02:13", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CFF.js", + "label": "CFF", + "translatorID": "e782b521-99ed-47c7-b021-62351a0a4f91", + "target": "cff", + "translatorType": 2, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-05-04 13:21:10", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Champlain Society - Collection.js", + "label": "Champlain Society - Collection", + "translatorID": "50d3ca81-3c4c-406b-afb2-0fe8105b9b38", + "target": "^https?://link\\.library\\.utoronto\\.ca", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2021-12-28 04:41:28", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/ChatGPT.js", + "label": "ChatGPT", + "translatorID": "d8a83346-164a-467d-8717-eb96d4dcce6f", + "target": "^https://chatgpt\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-10-27 15:38:43", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Chicago Journal of Theoretical Computer Science.js", + "label": "Chicago Journal of Theoretical Computer Science", + "translatorID": "1e2a9aba-eb04-4398-9e3a-630e6132db13", + "target": "^https?://cjtcs\\.cs\\.uchicago\\.edu/articles", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Morgan Shirley", + "priority": 100, + "lastUpdated": "2025-05-14 00:10:19", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Chronicling America.js", + "label": "Chronicling America", + "translatorID": "fa8f8274-ada5-415a-96dd-a5c19fce7046", + "target": "^https?://chroniclingamerica\\.loc\\.gov", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2013-03-31 23:29:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CIA World Factbook.js", + "label": "CIA World Factbook", + "translatorID": "d9d4822f-f69e-4f31-b094-5324b2a04761", + "target": "^https?://www\\.cia\\.gov/the-world-factbook/countries/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-20 03:58:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CiNii Research.js", + "label": "CiNii Research", + "translatorID": "46291dc3-5cbd-47b7-8af4-d009078186f6", + "target": "^https?://cir\\.nii\\.ac\\.jp/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz, Mitsuo Yoshida and Satoshi Ando", + "priority": 100, + "lastUpdated": "2024-09-26 14:22:20", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Citavi 5 XML.js", + "label": "Citavi 5 XML", + "translatorID": "e7243cef-a709-4a46-ba46-1b1318051bec", + "target": "xml", + "translatorType": 1, + "creator": "Philipp Zumstein, Tomasz Najdek", + "priority": 100, + "lastUpdated": "2025-01-04 01:03:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CiteSeer.js", + "label": "CiteSeer", + "translatorID": "fa396dd4-7d04-4f99-95e1-93d6f355441d", + "target": "^https?://citeseerx?\\.ist\\.psu\\.edu", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher, Guy Aglionby", + "priority": 100, + "lastUpdated": "2018-01-28 16:31:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Citizen Lab.js", + "label": "Citizen Lab", + "translatorID": "06c372dc-f7e1-454d-b704-401efc78e6eb", + "target": "^https?://citizenlab\\.ca/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-14 01:28:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Civilization.ca.js", + "label": "Civilization.ca", + "translatorID": "8451431a-895f-4732-8339-79eb6756d2f9", + "target": "^https?://collections\\.civilization\\.ca", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2021-12-28 04:38:36", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/CLACSO.js", + "label": "CLACSO", + "translatorID": "a6f95213-468c-4558-94a3-59b2436cbcdd", + "target": "^https?://biblioteca\\.clacso\\.edu\\.ar/gsdl/cgi-bin/", + "browserSupport": "g", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2013-02-28 14:47:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CLASE.js", + "label": "CLASE", + "translatorID": "1dd21245-29cf-434d-b5b8-49eae0a6912a", + "target": "^https?://132\\.248\\.9\\.1\\:", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2013-12-07 15:15:58", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Climate Change and Human Health Literature Portal.js", + "label": "Climate Change and Human Health Literature Portal", + "translatorID": "0722e1d4-3c3b-47b1-b8b2-1ed986030303", + "target": "^https?://tools\\.niehs\\.nih\\.gov/cchhl/index\\.cfm", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-08-22 04:14:33", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Clinical Key.js", + "label": "Clinical Key", + "translatorID": "a55463ba-e403-415b-80d4-284d5f9b4b15", + "target": "^https?://(www\\.|www-)clinicalkey(\\.|-)com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jaret M. Karnuta, Mike Davidson", + "priority": 100, + "lastUpdated": "2017-01-30 08:08:52", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/clinicaltrials.gov.js", + "label": "clinicaltrials.gov", + "translatorID": "874d70a0-6b95-4391-a681-c56dabaa1411", + "target": "^https://(classic\\.clinicaltrials\\.gov/ct2/(show|results)|(www\\.)?clinicaltrials\\.gov/(study|search))\\b", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ryan Velazquez and contributors", + "priority": 100, + "lastUpdated": "2025-01-10 00:42:22", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CNKI.js", + "label": "CNKI", + "translatorID": "5c95b67b-41c5-4f55-b71a-48d5d7183063", + "target": "^https?://([^/]+\\.)?cnki\\.net", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius, Xingzhong Lin, Zo\u00eb C. Ma", + "priority": 100, + "lastUpdated": "2023-11-27 05:30:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/COBISS.js", + "label": "COBISS", + "translatorID": "ceace65b-4daf-4200-a617-a6bf24c75607", + "target": "^https?://plus\\.cobiss\\.net/cobiss", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Brendan O'Connell", + "priority": 100, + "lastUpdated": "2023-08-17 18:57:34", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Code4Lib Journal.js", + "label": "Code4Lib Journal", + "translatorID": "a326fc49-60c2-405b-8f44-607e5d18b9ad", + "target": "^https?://journal\\.code4lib\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2018-08-23 11:15:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/COinS.js", + "label": "COinS", + "translatorID": "05d07af9-105a-4572-99f6-a8e231c0daef", + "target": "", + "browserSupport": "gcsv", + "translatorType": 6, + "creator": "Simon Kornblith", + "priority": 310, + "lastUpdated": "2021-06-01 17:38:46", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Colorado State Legislature.js", + "label": "Colorado State Legislature", + "translatorID": "1a615592-77b0-4715-a509-702b66196ff1", + "target": "^https?://leg\\.colorado\\.gov/(bills|bill-search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Andrew Schwartz", + "priority": 100, + "lastUpdated": "2021-08-18 19:52:53", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Columbia University Press.js", + "label": "Columbia University Press", + "translatorID": "a75e0594-a9e8-466e-9ce8-c10560ea59fd", + "target": "^https?://(www\\.)?cup\\.columbia\\.edu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-09-10 11:35:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Common-Place.js", + "label": "Common-Place", + "translatorID": "c3edb423-f267-47a1-a8c2-158c247f87c2", + "target": "^https?://(www\\.)?(common-place\\.org/|common-place-archives\\.org/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Frederick Gibbs, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-09-10 09:34:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Computer History Museum Archive.js", + "label": "Computer History Museum Archive", + "translatorID": "f3b81c4e-28b4-41ae-9824-55739fe9c91a", + "target": "^https?://www\\.computerhistory\\.org/collections/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bo An", + "priority": 100, + "lastUpdated": "2021-06-07 16:40:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Copernicus.js", + "label": "Copernicus", + "translatorID": "8082115d-5bc6-4517-a4e8-abed1b2a784a", + "target": "^https?://[^./]+\\.copernicus\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-01-25 15:59:41", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Cornell LII.js", + "label": "Cornell LII", + "translatorID": "930d49bc-44a1-4c22-9dde-aa6f72fb11e5", + "target": "^https?://www\\.law\\.cornell\\.edu/supct/.+", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Bill McKinney", + "priority": 100, + "lastUpdated": "2013-02-09 12:09:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Cornell University Press.js", + "label": "Cornell University Press", + "translatorID": "4363275e-5cc5-4627-9a7f-951fb58a02c3", + "target": "^https?://www\\.cornellpress\\.cornell\\.edu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcer", + "priority": 100, + "lastUpdated": "2016-09-10 11:32:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CourtListener.js", + "label": "CourtListener", + "translatorID": "07890a30-866e-452a-ac3e-c19fcb39b597", + "target": "^https?://www\\.courtlistener\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CQ Press.js", + "label": "CQ Press", + "translatorID": "0de4cddf-be9d-4e1e-9b51-891b7a4bb136", + "target": "^https?://library\\.cqpress\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-01 21:06:24", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CROSBI.js", + "label": "CROSBI", + "translatorID": "fcabdbd7-e3e8-4f4a-9d78-25296417bdc5", + "target": "^https?://www\\.bib\\.irb\\.hr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-09 22:29:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Crossref REST.js", + "label": "Crossref REST", + "translatorID": "0a61e167-de9a-4f93-a68a-628b48855909", + "target": "", + "translatorType": 8, + "creator": "Martynas Bagdonas", + "priority": 90, + "lastUpdated": "2025-08-03 05:38:26", + "minVersion": "5.0.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Crossref Unixref XML.js", + "label": "Crossref Unixref XML", + "translatorID": "93514073-b541-4e02-9180-c36d2f3bb401", + "target": "xml", + "translatorType": 1, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-10-30 12:58:25", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/CSIRO Publishing.js", + "label": "CSIRO Publishing", + "translatorID": "303c2744-ea37-4806-853d-e1ca67be6818", + "target": "^https?://(www\\.)?publish\\.csiro\\.au/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2021-06-07 16:46:32", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/CSL JSON.js", + "label": "CSL JSON", + "translatorID": "bc03b4fe-436d-4a1f-ba59-de4d2d7a63f7", + "target": "json", + "translatorType": 3, + "creator": "Simon Kornblith", + "priority": 100, + "lastUpdated": "2022-09-20 13:32:25", + "minVersion": "4.0.27", + "maxVersion": "" + }, + { + "path": "translators/zotero/CSV.js", + "label": "CSV", + "translatorID": "25f4c5e2-d790-4daa-a667-797619c7e2f2", + "target": "csv", + "translatorType": 2, + "creator": "Philipp Zumstein and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2022-06-28 19:45:59", + "minVersion": "4.0.26", + "maxVersion": "" + }, + { + "path": "translators/zotero/Current Affairs.js", + "label": "Current Affairs", + "translatorID": "f16f8542-9038-492d-8669-7ffe40869294", + "target": "^https?://www\\.currentaffairs\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-07 00:42:35", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DABI.js", + "label": "DABI", + "translatorID": "5cf8bb21-e350-444f-b9b4-f46d9fab7827", + "target": "^https?://dabi\\.ib\\.hu-berlin\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jens Mittelbach", + "priority": 100, + "lastUpdated": "2021-09-10 18:58:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dagens Nyheter.js", + "label": "Dagens Nyheter", + "translatorID": "192a29de-3d6e-4850-984f-943764126429", + "target": "^https?://www\\.dn\\.se/(nyheter|ekonomi|kultur-noje|sport|sok)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Berlin", + "priority": 100, + "lastUpdated": "2018-07-19 12:35:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dagstuhl Research Online Publication Server.js", + "label": "Dagstuhl Research Online Publication Server", + "translatorID": "0526c18d-8dc8-40c9-8314-399e0b743a4d", + "target": "^https?://(www\\.)?drops\\.dagstuhl\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-07-19 19:20:18", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DAI-Zenon.js", + "label": "DAI-Zenon", + "translatorID": "16199bf0-a365-4aad-baeb-225019ae32dc", + "target": "^https?://zenon\\.dainst\\.org/(Record/|Search/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2020-10-13 15:24:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dar Almandumah.js", + "label": "Dar Almandumah", + "translatorID": "721a6b6e-d584-4252-b319-7ea46a8b02a7", + "target": "^https?://search\\.mandumah\\.com/(Search|Record)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-30 23:08:33", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DART-Europe.js", + "label": "DART-Europe", + "translatorID": "658f2707-bb46-44eb-af0a-e73a5387fc90", + "target": "^https?://www\\.dart-europe\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-05-04 03:09:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Data.gov.js", + "label": "Data.gov", + "translatorID": "162b43d7-e29d-4cf0-9e05-85e472613430", + "target": "^https?://catalog\\.data\\.gov/dataset", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-21 21:34:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Databrary.js", + "label": "Databrary", + "translatorID": "45ece855-7303-41d2-8c9f-1151f684943c", + "target": "^https?://nyu\\.databrary\\.org/(volume|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-04-19 16:49:05", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Datacite JSON.js", + "label": "Datacite JSON", + "translatorID": "b5b5808b-1c61-473d-9a02-e1f5ba7b8eef", + "target": "json", + "translatorType": 1, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dataverse.js", + "label": "Dataverse", + "translatorID": "aedf3fb0-9a50-47b3-ba2f-3206552b82a9", + "target": "^https?://(www\\.)?((open|research-?|hei|planetary-|osna|in|bonn|borealis|lida\\.|archaeology\\.|entrepot\\.recherche\\.|archive\\.|redape\\.)?(data|e?da[td]os)|dvn|sodha\\.be|repositorio(\\.|dedados|pesquisas)|abacus\\.library\\.ubc\\.ca|dorel\\.univ-lorraine\\.fr|darus\\.uni-stuttgart\\.de|dunas\\.ua\\.pt|edmond\\.mpdl\\.mpg\\.de|keen\\.zih\\.tu-dresden\\.de|rdr\\.kuleuven\\.be|portal\\.odissei\\.nl)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-05-01 12:09:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Daum News.js", + "label": "Daum News", + "translatorID": "f2d6c94f-ac75-4862-9364-45fb72c8e1ca", + "target": "^https?://news\\.v\\.daum\\.net/v/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Kagami Sascha Rosylight", + "priority": 100, + "lastUpdated": "2021-06-07 16:41:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DBLP Computer Science Bibliography.js", + "label": "DBLP Computer Science Bibliography", + "translatorID": "625c6435-e235-4402-a48f-3095a9c1a09c", + "target": "^https?://(www\\.)?(dblp\\d?(\\.org|\\.uni-trier\\.de/|\\.dagstuhl\\.de/))", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher, Philipp Zumstein, and Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-04-20 13:37:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DBpia.js", + "label": "DBpia", + "translatorID": "0c31f371-e012-4b1c-b793-f89ab1ae2610", + "target": "^https?://[^/]+\\.dbpia\\.co\\.kr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Yunwoo Song, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-09-14 00:23:40", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/De Gruyter Brill.js", + "label": "De Gruyter Brill", + "translatorID": "2a5dc3ed-ee5e-4bfb-baad-36ae007e40ce", + "target": "^https?://www\\.degruyterbrill\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2026-01-23 15:59:51", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Defense Technical Information Center.js", + "label": "Defense Technical Information Center", + "translatorID": "99be9976-2ff9-40df-96e8-82edfa79d9f3", + "target": "^https?://oai\\.dtic\\.mil/oai/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Matt Burton", + "priority": 100, + "lastUpdated": "2013-01-09 15:36:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/dejure.org.js", + "label": "dejure.org", + "translatorID": "16c7d938-5f77-4fb5-99a1-bcec6fdafe84", + "target": "^https?://dejure\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-16 20:00:51", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Delpher.js", + "label": "Delpher", + "translatorID": "c4008cc5-9243-4d13-8b35-562cdd184558", + "target": "^https?://[^\\/]+\\.delpher\\.nl", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2022-01-20 14:35:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Demographic Research.js", + "label": "Demographic Research", + "translatorID": "ed317bdd-0416-4762-856d-435004a9f05c", + "target": "^https?://www\\.demographic-research\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebatian Karcher", + "priority": 100, + "lastUpdated": "2018-05-05 11:04:17", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Denik CZ.js", + "label": "Denik CZ", + "translatorID": "4ed446ca-b480-43ee-a8fb-5f9730915edc", + "target": "^https?://[^/]*denik\\.cz", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ji\u0159\u00ed Sedl\u00e1\u010dek, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-01-07 09:27:42", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DEPATISnet.js", + "label": "DEPATISnet", + "translatorID": "d76fea32-fe20-4c00-b5b9-bea8c688c2b0", + "target": "^https?://depatisnet\\.dpma\\.de/DepatisNet/depatisnet", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Klaus Flittner", + "priority": 100, + "lastUpdated": "2019-12-07 20:44:27", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Der Freitag.js", + "label": "Der Freitag", + "translatorID": "1ab8b9a4-72b5-4ef4-adc8-4956a50718f7", + "target": "^https?://www\\.freitag\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-04-15 16:29:59", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Der Spiegel.js", + "label": "Der Spiegel", + "translatorID": "eef50507-c756-4081-86fd-700ae4ebf22e", + "target": "^https?://www\\.spiegel\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-05 17:55:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Desiring God.js", + "label": "Desiring God", + "translatorID": "48105411-e76d-47a7-b538-07e9a59be234", + "target": "^https?://(www\\.)?desiringgod\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Luke van der Hoeven", + "priority": 100, + "lastUpdated": "2021-06-11 17:20:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Deutsche Fotothek.js", + "label": "Deutsche Fotothek", + "translatorID": "26d2a264-f25d-4898-b40c-e7c83fdbbc34", + "target": "https?://www\\.deutschefotothek\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-29 02:40:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Deutsche Nationalbibliothek.js", + "label": "Deutsche Nationalbibliothek", + "translatorID": "d8341c22-8cf4-428f-be3b-ada9fa8933eb", + "target": "^https?://portal\\.dnb\\.de/opac(\\.htm|/(enhancedSearch|simpleSearch|showFullRecord)\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2024-01-15 19:48:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dialnet.js", + "label": "Dialnet", + "translatorID": "938ccabb-e297-4092-aa15-22b6511bbd0f", + "target": "^https?://dialnet\\.unirioja\\.es/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2023-01-05 20:54:41", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Die Zeit.js", + "label": "Die Zeit", + "translatorID": "312bbb0e-bfb6-4563-a33c-085445d391ed", + "target": "^https?://www\\.zeit\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-11-25 19:35:23", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/digibib.net.js", + "label": "digibib.net", + "translatorID": "e99bd723-39e6-418c-9524-390dbc583e08", + "target": "^https?://.*\\.digibib\\.net/(Digibib|jumpto|metasearch|opensearch|template)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Heiko Jansen (hbz), Ingolf Kuss (hbz), Bernhard Assmann (hbz)", + "priority": 100, + "lastUpdated": "2017-06-05 17:35:41", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Digital Humanities Quarterly.js", + "label": "Digital Humanities Quarterly", + "translatorID": "bbad0221-134b-495a-aa56-d77cfaa67ab5", + "target": "^https?://(www\\.)?digitalhumanities\\.org/(dhq)?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2024-05-15 15:07:13", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Digital Spy.js", + "label": "Digital Spy", + "translatorID": "d45c50cb-6dee-4cfb-974d-797991f8385b", + "target": "^https?://(www\\.)?digitalspy\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2021-05-26 19:44:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DigiZeitschriften.js", + "label": "DigiZeitschriften", + "translatorID": "e46830a2-1b19-4b6b-9f1a-e5e9760a0f80", + "target": "^https?://www\\.digizeitschriften\\.de/((en/)?dms/|index\\.php\\?id=27[24])", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-01-07 09:28:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dimensions.js", + "label": "Dimensions", + "translatorID": "19409763-fb3c-403f-af1c-c06ff9a9ea0e", + "target": "^https?://app\\.dimensions\\.ai/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-12 22:22:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/dLibra.js", + "label": "dLibra", + "translatorID": "915e3ae2-afa9-4b1d-9780-28ed3defe0ab", + "target": "/.*dlibra/(doccontent|docmetadata|collectiondescription|results)|/dlibra/?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Pawel Kolodziej and Kamil Gronowski ", + "priority": 100, + "lastUpdated": "2021-10-21 04:23:31", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/DOAJ.js", + "label": "DOAJ", + "translatorID": "53734210-2284-437f-9896-8ad65917c343", + "target": "^https?://(www\\.)?doaj\\.org/(article|search)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-08-08 16:00:53", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DOI Content Negotiation.js", + "label": "DOI Content Negotiation", + "translatorID": "b28d0d42-8549-4c6d-83fc-8382874a5cb9", + "target": "", + "translatorType": 8, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-07-27 04:51:26", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DOI.js", + "label": "DOI", + "translatorID": "c159dcfe-8a53-4301-a499-30f6549c340d", + "target": "", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 400, + "lastUpdated": "2024-06-04 14:34:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Douban.js", + "label": "Douban", + "translatorID": "fc353b26-8911-4c34-9196-f6f567c93901", + "target": "^https?://(www|book)\\.douban\\.com/(subject|doulist|people/[a-zA-Z0-9._]*/(do|wish|collect)|.*?status=(do|wish|collect)|group/[0-9]*?/collection|tag)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ace Strong", + "priority": 100, + "lastUpdated": "2024-08-07 08:46:18", + "minVersion": "2.0rc1", + "maxVersion": "" + }, + { + "path": "translators/zotero/DPLA.js", + "label": "DPLA", + "translatorID": "117feb72-21bb-4424-a47b-c9ca6b71f979", + "target": "^https?://dp\\.la/", + "browserSupport": "gcv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2016-09-12 06:17:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dreier Neuerscheinungsdienst.js", + "label": "Dreier Neuerscheinungsdienst", + "translatorID": "60888261-7f17-41bd-95be-6982f05c01b3", + "target": "^https?://www\\.dietmardreier\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Denis Maier", + "priority": 100, + "lastUpdated": "2021-08-25 08:40:51", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Dryad Digital Repository.js", + "label": "Dryad Digital Repository", + "translatorID": "7a81d945-7d9c-4f8c-bd7b-4226c1cab40e", + "target": "^https?://(www\\.)?datadryad\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Nathan Day", + "priority": 100, + "lastUpdated": "2021-06-07 02:15:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/DSpace Intermediate Metadata.js", + "label": "DSpace Intermediate Metadata", + "translatorID": "2c05e2d1-a533-448f-aa20-e919584864cb", + "target": "xml", + "translatorType": 1, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-12-24 19:29:02", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Duke University Press Books.js", + "label": "Duke University Press Books", + "translatorID": "4608f0e4-40a6-47ac-8467-1955eb8bd708", + "target": "^https?://www\\.dukeupress\\.edu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-10-23 09:05:55", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/E-periodica Switzerland.js", + "label": "E-periodica Switzerland", + "translatorID": "dbfd99e3-6925-4b71-92b8-12b02aa875fc", + "target": "^https?://(www|news?)\\.e-periodica\\.ch", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Alain Borel", + "priority": 100, + "lastUpdated": "2023-08-15 20:15:50", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Eastview.js", + "label": "Eastview", + "translatorID": "c59896bc-4beb-43ed-8109-a73a13251828", + "target": "^https?://dlib\\.eastview\\.com/(search/(advanced|simple)/|browse/(doc|favorites|issue))", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-21 04:57:23", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ebrary.js", + "label": "ebrary", + "translatorID": "2abe2519-2f0a-48c0-ad3a-b87b9c059459", + "target": "^https?://site\\.ebrary\\.com/.+(docDetail|search|detail)\\.action\\?", + "browserSupport": "gcv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2015-08-29 22:03:15", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/EBSCO Discovery Layer.js", + "label": "EBSCO Discovery Layer", + "translatorID": "660fcf3e-3414-41b8-97a5-e672fc2e491d", + "target": "^https?://(discovery|research)\\.ebsco\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2026-03-09 16:01:06", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/EBSCOhost.js", + "label": "EBSCOhost", + "translatorID": "d0b1914a-11f1-4dd7-8557-b32fe8a3dd47", + "target": "^https?://[^/]+/(eds|bsi|ehost)/(results|detail|folder|pdfviewer)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith, Michael Berkowitz, Josh Geller", + "priority": 100, + "lastUpdated": "2024-04-15 01:50:53", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Edinburgh University Press Journals.js", + "label": "Edinburgh University Press Journals", + "translatorID": "b7bd798d-e518-46d1-aa13-a69f2864fa91", + "target": "^https?://www\\.euppublishing\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2016-09-13 21:55:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Education Week.js", + "label": "Education Week", + "translatorID": "7e51d3fb-082e-4063-8601-cda08f6004a3", + "target": "^https?://(www2?\\.|blogs\\.)?edweek\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ben Parr", + "priority": 100, + "lastUpdated": "2021-01-29 15:47:14", + "minVersion": "1.0.0b4.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/EIDR.js", + "label": "EIDR", + "translatorID": "79c3d292-0afc-42a1-bd86-7e706fc35aa5", + "target": "", + "browserSupport": "gcsibv", + "translatorType": 8, + "creator": "Aurimas Vinckevicius", + "priority": 80, + "lastUpdated": "2017-06-03 11:41:00", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/El Comercio (Peru).js", + "label": "El Comercio (Per\u00fa)", + "translatorID": "e3da3448-db8f-44ad-a650-54110335c4ae", + "target": "^https?://elcomercio\\.pe", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 280, + "lastUpdated": "2022-08-22 02:12:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/El Pais.js", + "label": "El Pais", + "translatorID": "c3b97a6e-4879-4f77-9dbb-18a3fa2b2b81", + "target": "^https?://([^.]\\.)?elpais\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2018-01-07 16:59:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Electronic Colloquium on Computational Complexity.js", + "label": "Electronic Colloquium on Computational Complexity", + "translatorID": "09a9599e-c20e-a405-d10d-35ad4130a426", + "target": "^https?://eccc\\.weizmann\\.ac\\.il/(title|year|keyword|report|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jonas Schrieb and Morgan Shirley", + "priority": 100, + "lastUpdated": "2023-08-14 06:03:23", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/eLibrary.ru.js", + "label": "eLibrary.ru", + "translatorID": "587709d3-80c5-467d-9fc8-ed41c31e20cf", + "target": "^https?://(www\\.)?elibrary\\.ru/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon", + "priority": 100, + "lastUpdated": "2024-07-14 15:27:57", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Elicit.js", + "label": "Elicit", + "translatorID": "e1c104ef-9f4d-44fb-bf84-59b99ead7329", + "target": "^https://elicit\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-04-28 21:18:17", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/eLife.js", + "label": "eLife", + "translatorID": "98ad3ad1-9d43-4b2e-bc36-172cbf00ba1d", + "target": "^https?://(elife\\.)?elifesciences\\.org/(articles|search|subjects|archive)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-07-10 18:26:20", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Elsevier Health Journals.js", + "label": "Elsevier Health Journals", + "translatorID": "b043e7ed-b921-4444-88af-2fcc39881ee2", + "target": "/action/doSearch\\?|/article/[^/]+/(abstract|fulltext|references|images)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 250, + "lastUpdated": "2021-11-24 23:10:20", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Elsevier Pure.js", + "label": "Elsevier Pure", + "translatorID": "ccc23d0e-77ac-42b4-ac54-c606bfb218b8", + "target": "/[a-z]{2}/(publications|persons|searchAll)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 270, + "lastUpdated": "2021-08-31 04:08:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Embedded Metadata.js", + "label": "Embedded Metadata", + "translatorID": "951c027d-74ac-47d4-a107-9c3069ab7b48", + "target": "", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith and Avram Lyon", + "priority": 320, + "lastUpdated": "2025-10-14 17:29:56", + "minVersion": "3.0.4", + "maxVersion": "" + }, + { + "path": "translators/zotero/eMedicine.js", + "label": "eMedicine", + "translatorID": "ab88d517-d88c-4a73-a0ad-c94c76cca849", + "target": "^https?://emedicine\\.medscape\\.com/article/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "William Smith", + "priority": 100, + "lastUpdated": "2013-04-15 18:04:37", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Emerald Insight.js", + "label": "Emerald Insight", + "translatorID": "a14301dc-be1c-4f34-bcaa-1b53b08ce80d", + "target": "^https?://www\\.emerald\\.com/insight/(publication/|content/|search\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-08-29 15:32:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/eMJA.js", + "label": "eMJA", + "translatorID": "966a7612-900c-42d9-8780-2a3247548588", + "target": "^https?://www\\.mja\\.com\\.au/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-06-18 17:31:29", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Encyclopedia of Korean Culture.js", + "label": "Encyclopedia of Korean Culture", + "translatorID": "dc879929-ae39-45b3-b49b-dab2c80815ab", + "target": "^https?://(www\\.)?encykorea\\.aks\\.ac\\.kr/Article/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "jacoblee36251", + "priority": 100, + "lastUpdated": "2023-09-15 20:07:33", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Endnote XML.js", + "label": "Endnote XML", + "translatorID": "eb7059a4-35ec-4961-a915-3cf58eb9784b", + "target": "xml", + "translatorType": 3, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-07-14 20:41:42", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Engineering Village.js", + "label": "Engineering Village", + "translatorID": "1f40baef-eece-43e4-a1cc-27d20c0ce086", + "target": "^https?://(www\\.)?engineeringvillage(2)?\\.(com|org)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ben Parr, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-10-04 02:24:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Envidat.js", + "label": "Envidat", + "translatorID": "0f6f5164-b44b-4ef6-9c5e-e3f39637569b", + "target": "^https://(www\\.)?envidat.ch/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Alain Borel", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/EPA National Library Catalog.js", + "label": "EPA National Library Catalog", + "translatorID": "99f11c5d-4413-4f96-9fc7-72fbd40372ef", + "target": "^https?://cfpub\\.epa\\.gov/ols", + "browserSupport": "gcv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2016-09-14 10:36:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Epicurious.js", + "label": "Epicurious", + "translatorID": "aee2323e-ce00-4fcc-a949-06eb1becc98f", + "target": "^https?://www\\.epicurious\\.com/(tools/searchresults|recipes/food/views)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-09-14 10:54:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ePrint IACR.js", + "label": "ePrint IACR", + "translatorID": "04a23cbe-5f8b-d6cd-8eb1-2e23bcc8ae8f", + "target": "^https://eprint\\.iacr\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jonas Schrieb", + "priority": 100, + "lastUpdated": "2025-10-19 18:51:24", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ERIC.js", + "label": "ERIC", + "translatorID": "e4660e05-a935-43ec-8eec-df0347362e4c", + "target": "^https?://(www\\.)?eric\\.ed\\.gov/", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-07-05 11:56:39", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Erudit.js", + "label": "Erudit", + "translatorID": "daad5868-6e6a-414e-b2da-14fa013879fc", + "target": "^https?://(www\\.)?erudit\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-01-02 22:48:58", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ESpacenet.js", + "label": "ESpacenet", + "translatorID": "176948f7-9df8-4afc-ace7-4c1c7318d426", + "target": "^https?://(worldwide|[a-z][a-z])\\.espacenet\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher, Aurimas Vinckevicius, Philipp Zumstein, and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-06 19:45:27", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Euclid.js", + "label": "Euclid", + "translatorID": "2e1c09a0-3006-11de-8c30-0800200c9a66", + "target": "^https?://[^/]*projecteuclid\\.org[^/]*/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guy Freeman and Avram Lyon", + "priority": 100, + "lastUpdated": "2014-06-05 07:32:38", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/EUR-Lex.js", + "label": "EUR-Lex", + "translatorID": "bf053edc-a8c3-458c-93db-6d04ead2e636", + "target": "^https://eur-lex\\.europa\\.eu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein, Pieter van der Wees", + "priority": 100, + "lastUpdated": "2025-10-30 15:50:58", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/EurogamerUSgamer.js", + "label": "Eurogamer/USgamer", + "translatorID": "e570f517-83f2-4735-97d2-44499aee0b21", + "target": "^https?://(www\\.)?(eurogamer|usgamer)\\.(net|cz|de|es|it|nl|pl|pt)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2018-07-14 19:42:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Europe PMC.js", + "label": "Europe PMC", + "translatorID": "0fd5beb3-646a-4e01-960b-e7168d9292e1", + "target": "^https?://europepmc\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-03-23 01:38:15", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Evernote.js", + "label": "Simple Evernote Export", + "translatorID": "18dd188a-9afc-4cd6-8775-1980c3ce0fbf", + "target": "enex", + "translatorType": 2, + "creator": "Volodymir Skipa", + "priority": 50, + "lastUpdated": "2019-10-11 07:30:00", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/F1000 Research.js", + "label": "F1000 Research", + "translatorID": "f36025f5-597e-4873-841c-f5c877a05b9b", + "target": "^https?://(www\\.)?(((openresearchcentral|(aas|amrc|hrb|wellcome|gates)openresearch)\\.org)|(f1000research|emeraldopenresearch)\\.com)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 200, + "lastUpdated": "2024-03-21 19:05:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Fachportal Padagogik.js", + "label": "Fachportal P\u00e4dagogik", + "translatorID": "4b0b42df-76b7-4a61-91aa-b15bc553b77d", + "target": "^https?://(www\\.fachportal-paedagogik\\.de/literatur/|www\\.pedocs\\.de/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-10-14 07:01:47", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Factiva.js", + "label": "Factiva", + "translatorID": "7bdb79e-a47f-4e3d-b317-ccd5a0a74456", + "target": "^https?://(global\\.factiva\\.com|[^/]*\\bglobal-factiva-com\\b[^/]+)/([gh]a|redir|np)/default\\.aspx", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Philipp Zumstein and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2015-02-13 21:54:59", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Failed Architecture.js", + "label": "Failed Architecture", + "translatorID": "31807458-4c59-4a9c-b78f-e6267aca53be", + "target": "^https?://failedarchitecture\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-05 21:18:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/FAO Knowledge Repository.js", + "label": "FAO Knowledge Repository", + "translatorID": "4883f662-29df-44ad-959e-27c9d036d165", + "target": "^https?://openknowledge\\.fao\\.org/(items/|search|browse/|collections/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bin Liu", + "priority": 100, + "lastUpdated": "2026-02-09 15:53:01", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/FAOLEX Database.js", + "label": "FAOLEX Database", + "translatorID": "3b163469-3e62-46d8-82a1-4f31e86bf6f4", + "target": "^https?://www\\.fao\\.org/faolex/results/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bin Liu", + "priority": 100, + "lastUpdated": "2025-10-28 21:09:38", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Fatcat.js", + "label": "Fatcat", + "translatorID": "afef9c9d-53a1-49da-9155-1fdf683798c3", + "target": "^https://fatcat\\.wiki/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-18 23:05:26", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/FAZ.NET.js", + "label": "FAZ.NET", + "translatorID": "4f0d0c90-5da0-11df-a08a-0800200c9a66", + "target": "^https?://((www\\.)?faz\\.net/.)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-11-11 11:24:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/feb-web.ru.js", + "label": "feb-web.ru", + "translatorID": "e92c8359-c3fc-468b-bc6a-107b2744fd17", + "target": "^https?://(www\\.)?feb-web\\.ru/.*cmd=2", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon", + "priority": 100, + "lastUpdated": "2017-01-01 16:09:57", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Figshare.js", + "label": "Figshare", + "translatorID": "ab5983ab-6ad9-4060-aff1-4b455c89a3b3", + "target": "^https?://figshare\\.com/", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Sebatian Karcher", + "priority": 100, + "lastUpdated": "2017-06-20 03:57:47", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Financial Times.js", + "label": "Financial Times", + "translatorID": "fc9b7700-b3cc-4150-ba89-c7e4443bd96d", + "target": "^https?://www\\.ft\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-03-27 05:16:52", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Finna.js", + "label": "Finna", + "translatorID": "808e29ab-620a-407a-b706-acae6c2c7ad7", + "target": "^https?://([^/]+\\.)?finna\\.fi/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 150, + "lastUpdated": "2021-08-04 20:33:47", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/fishpond.co.nz.js", + "label": "fishpond.co.nz", + "translatorID": "c436f3c7-4246-4ed3-a227-a538c8113a0e", + "target": "^https?://www\\.fishpond\\.co\\.nz/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sopheak Hean, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-06-07 17:26:42", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Flickr.js", + "label": "Flickr", + "translatorID": "5dd22e9a-5124-4942-9b9e-6ee779f1023e", + "target": "^https?://(www\\.)?flickr\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Rintze Zelle, and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2025-06-27 14:29:20", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Foreign Affairs.js", + "label": "Foreign Affairs", + "translatorID": "4ab6d49c-d94e-4a9c-ae9a-3310c44ba612", + "target": "^https?://www\\.foreignaffairs\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher, Philipp Zumstein, Wenzhi Dave Ding", + "priority": 100, + "lastUpdated": "2025-01-21 16:26:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/fr-online.de.js", + "label": "fr-online.de", + "translatorID": "488fe1e0-b7d2-406f-8257-5060418ce9b2", + "target": "^https?://www\\.fr-online\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff", + "priority": 100, + "lastUpdated": "2014-04-03 17:37:43", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/FreeCite.js", + "label": "FreeCite", + "translatorID": "7bbef39f-8bb9-44d7-826f-47ce75eb15ae", + "target": "^https?://freecite\\.library\\.brown\\.edu/citations/create", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2015-03-16 23:13:55", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/FreePatentsOnline.js", + "label": "FreePatentsOnline", + "translatorID": "879d738c-bbdd-4fa0-afce-63295764d3b7", + "target": "^https?://www\\.freepatentsonline\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2022-12-13 17:39:29", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Frieze.js", + "label": "Frieze", + "translatorID": "7feb4b6c-05d6-4d61-bf0d-5e7f70c1ef0b", + "target": "^https?://(www\\.)?frieze\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2021-06-11 16:34:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Frontiers.js", + "label": "Frontiers", + "translatorID": "cb9e794e-7a65-47cd-90f6-58cdd191e8b0", + "target": "^https?://[^./]+\\.frontiersin\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-04-03 18:50:17", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Gale Databases.js", + "label": "Gale Databases", + "translatorID": "e3748cf3-36dc-4816-bf86-95a0b63feb03", + "target": "^https?://[^?&]*(?:gale|galegroup|galetesting|ggtest)\\.com(?:\\:\\d+)?/ps/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek and Jim Miazek", + "priority": 100, + "lastUpdated": "2021-12-21 04:18:59", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/GaleGDC.js", + "label": "GaleGDC", + "translatorID": "04e63564-b92b-41cd-a9d5-366a02056d10", + "target": "/gdc/ncco|/gdc/xsearch|/gdc/artemis", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "GaleGDC", + "priority": 270, + "lastUpdated": "2014-08-26 03:45:45", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Galegroup.js", + "label": "Galegroup", + "translatorID": "4ea89035-3dc4-4ae3-b22d-726bc0d83a64", + "target": "^https?://(find\\.galegroup\\.com/|go\\.galegroup\\.com/gdsc)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2018-10-07 16:06:56", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Gallica.js", + "label": "Gallica", + "translatorID": "58ab2618-4a25-4b9b-83a7-80cd0259f896", + "target": "^https?://gallica\\.bnf\\.fr", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-09-21 09:49:15", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/GameStar GamePro.js", + "label": "GameStar/GamePro", + "translatorID": "c87a910d-70aa-4f33-9bec-f703d63ba84f", + "target": "^https?://(www\\.)?game(star|pro)\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Matthias Mail\u00e4nder", + "priority": 100, + "lastUpdated": "2021-06-01 22:28:52", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Gemeinsamer Bibliotheksverbund ISBN.js", + "label": "Gemeinsamer Bibliotheksverbund ISBN", + "translatorID": "b7259652-640b-43f1-94e5-18e2f2268463", + "target": null, + "browserSupport": "gcsibv", + "translatorType": 8, + "creator": "Philipp Zumstein", + "priority": 99, + "lastUpdated": "2021-06-30 03:15:48", + "minVersion": "4.0" + }, + { + "path": "translators/zotero/Gene Ontology.js", + "label": "Gene Ontology", + "translatorID": "cee0cca2-e82a-4618-b6cf-16327970169d", + "target": "^https?://(amigo\\.)?geneontology\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Amelia Ireland and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-18 21:31:51", + "minVersion": "2.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/GitHub.js", + "label": "GitHub", + "translatorID": "a7747ba7-42c6-4a22-9415-1dafae6262a9", + "target": "^https?://(www\\.)?github\\.com/([^/]+/[^/]+|search\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Fenner, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-07-29 19:26:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Globes.js", + "label": "Globes", + "translatorID": "4e9c34ef-89bb-4c7e-97dd-abb61d8b9254", + "target": "^https?://(www\\.)?(en\\.)?globes\\.co\\.il/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Eran Rosenthal", + "priority": 100, + "lastUpdated": "2019-12-21 07:49:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Gmail.js", + "label": "Gmail", + "translatorID": "58a778cc-25e2-4884-95b3-6b22d7571183", + "target": "^https?://mail\\.google\\.com/", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2017-01-01 16:53:13", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/GMS German Medical Science.js", + "label": "GMS German Medical Science", + "translatorID": "8d5984e8-3ba9-4faa-8b84-a58adae56439", + "target": "^https?://www\\.egms\\.de/static/(de|en)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-11-12 15:53:36", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Goodreads.js", + "label": "Goodreads", + "translatorID": "c3ecf413-ddd6-4d98-86e2-f63054bd2cc8", + "target": "^https?://www\\.goodreads\\.com/(book/show/|search\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-12-11 18:50:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Google Books.js", + "label": "Google Books", + "translatorID": "3e684d82-73a3-9a34-095f-19b112d88bbf", + "target": "^https?://(books|www)\\.google\\.[a-z]+(\\.[a-z]+)?/(books(/.*)?\\?(.*id=.*|.*q=.*)|search\\?.*?(btnG=Search\\+Books|tbm=bks)|books/edition/)|^https?://play\\.google\\.[a-z]+(\\.[a-z]+)?/(store/)?(books|search\\?.*c=books)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Simon Kornblith, Michael Berkowitz, Rintze Zelle, and Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-10-12 18:13:54", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Google Gemini.js", + "label": "Google Gemini", + "translatorID": "8a0e0cde-0d21-43f6-915b-d1aab9dd0520", + "target": "^https://gemini\\.google\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-10-27 15:55:46", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Google Patents.js", + "label": "Google Patents", + "translatorID": "d71e9b6d-2baa-44ed-acb4-13fe2fe592c0", + "target": "^https?://(www\\.)?patents\\.google\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-07-05 17:15:19", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Google Play.js", + "label": "Google Play", + "translatorID": "abc89357-6185-4ddd-8583-80034b754832", + "target": "^https?://play\\.google\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon", + "priority": 100, + "lastUpdated": "2017-06-07 18:01:47", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Google Presentation.js", + "label": "Google Presentation", + "translatorID": "c114f9fd-6387-4387-853d-fcfe5ab3ac0a", + "target": "^https?://docs\\.google\\.com/presentation/d/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2024-02-19 09:33:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Google Research.js", + "label": "Google Research", + "translatorID": "5f1c4a3b-b7cf-4170-a896-e4d82c0621c9", + "target": "^https://research\\.google/(pubs|people|research-areas|teams)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guy Aglionby", + "priority": 100, + "lastUpdated": "2020-01-01 19:36:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Google Scholar.js", + "label": "Google Scholar", + "translatorID": "57a00950-f0d1-4b41-b6ba-44ff0fc30289", + "target": "^https?://scholar[-.]google[-.](com|cat|(com?[-.])?[a-z]{2})(\\.[^/]+)?/(scholar(_case|_labs/search/session/\\d+)?\\?|citations\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith, Frank Bennett, Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2025-12-11 15:26:53", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/govinfo.js", + "label": "govinfo", + "translatorID": "12a3b1cb-6bbb-4cf9-904f-8f732ee3d1e3", + "target": "https?://www\\.govinfo\\.gov/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-10-28 14:47:36", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/GPO Access e-CFR.js", + "label": "GPO Access e-CFR", + "translatorID": "dede653d-d1f8-411e-911c-44a0219bbdad", + "target": "^https?://(www\\.)?ecfr\\.gov/cgi-bin/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bill McKinney, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2014-04-03 17:38:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Gulag Many Days, Many Lives.js", + "label": "Gulag: Many Days, Many Lives", + "translatorID": "c41c9c66-8540-4216-b138-7c00532748c9", + "target": "^https?://gulaghistory\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2012-01-30 22:49:27", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Haaretz.js", + "label": "Haaretz", + "translatorID": "d6f64d96-aa6f-4fd3-816f-bdef842c7088", + "target": "^https?://www\\.haaretz\\.(co\\.il|com)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Eran Rosenthal", + "priority": 100, + "lastUpdated": "2023-11-05 08:15:35", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Habr.js", + "label": "Habr", + "translatorID": "b4c54248-6e78-4afc-b566-45fee8cd43b7", + "target": "^https://habr\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ilya Zonov", + "priority": 100, + "lastUpdated": "2025-03-29 18:23:31", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HAL.js", + "label": "HAL", + "translatorID": "f20f91fe-d875-47e7-9656-0abb928be472", + "target": "^https://([^/.]+\\.)?hal\\.science/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-10-23 17:03:48", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Handelszeitung.js", + "label": "Handelszeitung", + "translatorID": "cfbb3e2c-8292-43d0-86d5-e457399107de", + "target": "^https?://((www\\.)?(handelszeitung|bilanz|stocks)\\.ch/.)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "ibex", + "priority": 100, + "lastUpdated": "2016-10-31 18:41:26", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Hanrei Watch.js", + "label": "Hanrei Watch RSS service", + "translatorID": "8e5f8616-05d0-4d33-8554-dad76b20ecbx", + "target": "^https?://kanz\\.jp/hanrei/detail/[0-9]+/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Frank Bennett", + "priority": 100, + "lastUpdated": "2012-01-30 22:49:15", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Harper's Magazine.js", + "label": "Harper's Magazine", + "translatorID": "36e28164-afac-42c6-9a99-ed757b640002", + "target": "^https?://(www\\.)?harpers\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-22 00:16:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Harvard Business Review.js", + "label": "Harvard Business Review", + "translatorID": "afcd2650-9bdb-4489-b279-ec2274a24962", + "target": "^https?://(www\\.)?hbr\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-10-11 17:02:23", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Harvard Caselaw Access Project.js", + "label": "Harvard Caselaw Access Project", + "translatorID": "2a1cafb9-6f61-48d3-b621-c3265fde9eba", + "target": "^https://(cite\\.)?case\\.law", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Franklin Pezzuti Dyer", + "priority": 100, + "lastUpdated": "2024-01-17 01:22:49", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Harvard University Press Books.js", + "label": "Harvard University Press Books", + "translatorID": "1ffa5e32-a985-49cc-8c74-8b638d2c4142", + "target": "https://www.hup.harvard.edu/(catalog.php|results-list.php)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-10-06 14:39:23", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HathiTrust.js", + "label": "HathiTrust", + "translatorID": "31da33ad-b4d9-4e99-b9ea-3e1ddad284d8", + "target": "^https?://(catalog|babel)\\.hathitrust\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HCSP.js", + "label": "HCSP", + "translatorID": "3e375db7-5f6e-4861-ab8b-3ddb0f4accc9", + "target": "^https?://(www\\.)?hcsp\\.fr/explore\\.cgi/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Joris Muller", + "priority": 100, + "lastUpdated": "2016-10-31 19:16:45", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HeinOnline.js", + "label": "HeinOnline", + "translatorID": "3dcbb947-f7e3-4bbd-a4e5-717f3701d624", + "target": "^https?://(www\\.)?heinonline\\.org/HOL/(LuceneSearch|Page|IFLPMetaData|AuthorProfile)\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Frank Bennett", + "priority": 100, + "lastUpdated": "2026-01-09 20:36:33", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Heise.js", + "label": "Heise", + "translatorID": "54c3bec7-c1bc-4ffa-b103-53759845b6c4", + "target": "^https?://www\\.heise\\.de/(suche|select)/", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "optiprime, ApoB-100", + "priority": 100, + "lastUpdated": "2021-05-27 00:40:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Herder.js", + "label": "Herder", + "translatorID": "fb23f4a4-d1be-4c41-9f74-4a6fe964a5bf", + "target": "^https?://www\\.herder\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-06 21:21:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HighBeam.js", + "label": "HighBeam", + "translatorID": "9021ee70-1411-45c9-9dd6-f070cc80641a", + "target": "^https?://www\\.highbeam\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-01-07 09:32:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HighWire 2.0.js", + "label": "HighWire 2.0", + "translatorID": "8c1f42d5-02fa-437b-b2b2-73afc768eb07", + "target": "^[^?#]+(/content/([0-9.]+[A-Z\\-]*/|current|firstcite|early)|/search\\?.*?\\bsubmit=|/search(/results)?\\?fulltext=|/cgi/collection/.|/search/.)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Matt Burton, Sebastian Karcher", + "priority": 250, + "lastUpdated": "2022-06-13 22:14:27", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HighWire.js", + "label": "HighWire", + "translatorID": "5eacdb93-20b9-4c46-a89b-523f62935ae4", + "target": "^https?://[^/]+/(cgi/searchresults|cgi/search|cgi/content/(abstract|full|short|summary)|current\\.dtl$|content/vol[0-9]+/issue[0-9]+/(index\\.dtl)?$)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 250, + "lastUpdated": "2015-06-02 17:33:54", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Hindawi Publishers.js", + "label": "Hindawi Publishers", + "translatorID": "186efdd2-3621-4703-aac6-3b5e286bdd86", + "target": "^https?://www\\.hindawi\\.com/(journals|search)/", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-03-07 03:48:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Hispanic-American Periodical Index.js", + "label": "Hispanic-American Periodical Index", + "translatorID": "cc4b1ea4-3349-4bb4-af55-cce5e06e4669", + "target": "^https?://hapi\\.ucla\\.edu", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-09-03 18:32:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Homeland Security Digital Library.js", + "label": "Homeland Security Digital Library", + "translatorID": "d8337e3a-434c-457a-a35b-b17e6a7fdccd", + "target": "^https?://www\\.hsdl\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-26 20:12:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Hrvatska enciklopedija.js", + "label": "Hrvatska enciklopedija", + "translatorID": "6f98e6ce-f92f-4f74-beaf-499dccb5cb6c", + "target": "^https?://(?:www\\.)?enciklopedija\\.hr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ivo Pletikosi\u0107", + "priority": 100, + "lastUpdated": "2025-10-14 21:59:26", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/HUDOC.js", + "label": "HUDOC", + "translatorID": "d541622d-09c3-4e20-b010-c506b2d01151", + "target": "^https?://hudoc\\.echr\\.coe\\.int", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jonas Skorzak", + "priority": 100, + "lastUpdated": "2021-07-19 21:19:21", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Huff Post.js", + "label": "Huff Post", + "translatorID": "36e34937-2ec3-418b-8199-2c8cc3488875", + "target": "^https?://www\\.huffingtonpost\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-10-31 21:35:41", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Human Rights Watch.js", + "label": "Human Rights Watch", + "translatorID": "2bd6876f-26ce-43ec-a9af-88616a464ed0", + "target": "^https?://www\\.hrw\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-14 03:16:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/IDEA ALM.js", + "label": "IDEA ALM", + "translatorID": "af5e71a1-798f-4b46-bc79-3d6ed83ba8f1", + "target": "/((notebook(_f?ext)?)|list)\\.asp", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 200, + "lastUpdated": "2021-07-22 23:39:19", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Idref.js", + "label": "Idref", + "translatorID": "271ee1a5-da86-465b-b3a5-eafe7bd3c156", + "target": "^https?://www\\.idref\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sylvain Machefert", + "priority": 100, + "lastUpdated": "2021-06-29 09:01:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/IEEE Computer Society.js", + "label": "IEEE Computer Society", + "translatorID": "8d72adbc-376c-4a33-b6be-730bc235190f", + "target": "^https?://(www[0-9]?|search[0-9]?)\\.computer\\.org/(csdl/(mags/[0-9a-z/]+|trans/[0-9a-z/]+|letters/[0-9a-z]+|proceedings/[0-9a-z/]+|doi|abs/proceedings)|search/results|portal/web/computingnow/.*content\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-06-07 18:52:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/IEEE Xplore.js", + "label": "IEEE Xplore", + "translatorID": "92d4ed84-8d0-4d3c-941f-d4b9124cfbb", + "target": "^https?://([^/]+\\.)?ieeexplore\\.ieee\\.org/([^#]+[&?]arnumber=\\d+|(abstract/)?document/|search/(searchresult|selected)\\.jsp|xpl/(mostRecentIssue|tocresult)\\.jsp\\?|xpl/conhome/\\d+/proceeding)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith, Michael Berkowitz, Bastian Koenings, and Avram Lyon", + "priority": 100, + "lastUpdated": "2025-04-04 18:55:24", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/IETF.js", + "label": "IETF", + "translatorID": "20d5254c-edfb-4728-94be-67828cdfeee3", + "target": "^https?://(datatracker\\.ietf\\.org/|www\\.ietf\\.org/archive/id/|tools\\.ietf\\.org/pdf/|www\\.rfc-editor\\.org/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-01-14 12:11:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/IMDb.js", + "label": "IMDb", + "translatorID": "a30274ac-d3d1-4977-80f4-5320613226ec", + "target": "^https?://www\\.imdb\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstien and Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-07-29 17:25:50", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ined.js", + "label": "Ined", + "translatorID": "dd5761aa-4145-4911-b45c-16c78cfc24c8", + "target": "^https?://archined\\.ined\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Mysciencework", + "priority": 100, + "lastUpdated": "2025-12-04 18:32:52", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Informationssystem Medienpaedagogik.js", + "label": "Informationssystem Medienpaedagogik", + "translatorID": "f4469574-1d96-4a4a-a0ac-1b9f7c49654b", + "target": "^https?://www\\.ism-info\\.de/ism-info\\.html\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-01-01 16:54:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/informIT database.js", + "label": "informIT database", + "translatorID": "add79dfd-7951-4c72-af1d-ce1d50aa4fb4", + "target": "^https?://www\\.informit\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2012-10-15 10:37:49", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/InfoTrac.js", + "label": "InfoTrac", + "translatorID": "6773a9af-5375-3224-d148-d32793884dec", + "target": "^https?://[^/]+/itw/infomark/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 250, + "lastUpdated": "2021-12-28 04:42:55", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/IngentaConnect.js", + "label": "IngentaConnect", + "translatorID": "9e306d5d-193f-44ae-9dd6-ace63bf47689", + "target": "^https?://(www\\.)?ingentaconnect\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2022-07-12 05:41:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Inside Higher Ed.js", + "label": "Inside Higher Ed", + "translatorID": "ef365b99-3797-4a01-a1d8-9aea9a7e9548", + "target": "^https?://www\\.insidehighered\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-10-11 01:45:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Insignia OPAC.js", + "label": "Insignia OPAC", + "translatorID": "abd7c626-6913-42d4-a05f-acc6683c69da", + "target": "^https?://[^/]+/(library|crts)/[^/?#]+\\.aspx", + "browserSupport": "gcs", + "translatorType": 4, + "creator": "Niko", + "priority": 100, + "lastUpdated": "2017-01-01 15:21:20", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/INSPIRE.js", + "label": "INSPIRE", + "translatorID": "17b1a93f-b342-4b54-ad50-08ecc26e0ac3", + "target": "^https?://inspirehep\\.net/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-04-06 18:53:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Institute of Contemporary Art.js", + "label": "Institute of Contemporary Art", + "translatorID": "9b1a3011-af6d-47d8-ac01-ec8c42d5ac58", + "target": "^https?://www\\.icaboston\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-16 15:43:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Institute of Physics.js", + "label": "Institute of Physics", + "translatorID": "9346ddef-126b-47ec-afef-8809ed1972ab", + "target": "^https?://iopscience\\.iop\\.org/((article/10\\.[^/]+/)?[0-9-X]+/.+|n?search\\?.+)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Michael Berkowitz and Avram Lyon and Sebastian Karcher", + "priority": 99, + "lastUpdated": "2016-11-01 12:54:14", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Integrum.js", + "label": "Integrum", + "translatorID": "570d4c35-a16d-48f9-aa73-6161d067da79", + "target": "^https?://aafnet\\.integrum\\.ru/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-12-05 03:14:12", + "minVersion": "3", + "maxVersion": "" + }, + { + "path": "translators/zotero/Intellixir.js", + "label": "Intellixir", + "translatorID": "20e87da1-e1c9-410d-b400-a1c27272ae19", + "target": "/intellixir/(afficheliste\\.aspx|liste_articles\\.aspx)", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Maxime Escourbiac", + "priority": 100, + "lastUpdated": "2017-01-01 16:54:26", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Inter-Research Science Center.js", + "label": "Inter-Research Science Center", + "translatorID": "0eeb2ac0-fbaf-4994-b98f-203d273eb9fa", + "target": "^https?://www\\.int-res\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-10-22 20:07:17", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/International Nuclear Information System.js", + "label": "International Nuclear Information System", + "translatorID": "374c83fa-58ef-47cf-af23-e42630203ce7", + "target": "^https?://inis\\.iaea\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-12 23:15:14", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Internet Archive Scholar.js", + "label": "Internet Archive Scholar", + "translatorID": "41c2be3b-eb2f-441e-b987-c98f9318e841", + "target": "^https://scholar\\.archive\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-22 07:47:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Internet Archive Wayback Machine.js", + "label": "Internet Archive Wayback Machine", + "translatorID": "513a53f5-b95e-4df6-a03e-3348d9ec9f44", + "target": "^https?://web\\.archive\\.org/web/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-06-09 19:05:33", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Internet Archive.js", + "label": "Internet Archive", + "translatorID": "db0f4858-10fa-4f76-976c-2592c95f029c", + "target": "^https?://(www\\.)?archive\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2020-07-16 13:38:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/InvenioRDM.js", + "label": "InvenioRDM", + "translatorID": "a714cb93-6595-482f-b371-a4ca0be14449", + "target": "^https?://(zenodo\\.org|sandbox\\.zenodo\\.org|data\\.caltech\\.edu|repository\\.tugraz\\.at|researchdata\\.tuwien\\.at|ultraviolet\\.library\\.nyu\\.edu|adc\\.ei-basel\\.hasdai\\.org|fdat\\.uni-tuebingen\\.de|www\\.fdr\\.uni-hamburg\\.de|rodare\\.hzdr\\.de|aperta\\.ulakbim.gov\\.tr|www\\.openaccessrepository\\.it|eic-zenodo\\.sdcc\\.bnl\\.gov)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein, Sebastian Karcher and contributors", + "priority": 100, + "lastUpdated": "2025-09-18 15:10:52", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/io-port.js", + "label": "io-port", + "translatorID": "1c0c63d9-4a95-44d4-b441-173cdc1b8688", + "target": "^https?://www\\.zentralblatt-math\\.org/ioport/", + "browserSupport": "g", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2014-03-08 16:26:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/IPCC.js", + "label": "IPCC", + "translatorID": "c6efb3a8-a6c9-4ff2-b1c5-27fb4b5b2935", + "target": "^https?://www\\.ipcc\\.ch/report/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-09-18 01:10:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Isidore.js", + "label": "Isidore", + "translatorID": "43a53465-0354-42fd-aba9-dc1af8be7061", + "target": "^https?://(www\\.)?isidore\\.science/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-29 03:29:14", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ISTC.js", + "label": "ISTC", + "translatorID": "29051e64-8eba-4b26-bbf1-0c224bc59497", + "target": "^https?://data\\.cerl\\.org/istc/(_search|i[a-z]\\d{8})", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Maike Kittelmann", + "priority": 100, + "lastUpdated": "2016-12-28 14:39:45", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/J-Stage.js", + "label": "J-Stage", + "translatorID": "e40a27bc-0eef-4c50-b78b-37274808d7d2", + "target": "^https?://www\\.jstage\\.jst\\.go\\.jp/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher, Satoshi Ando", + "priority": 100, + "lastUpdated": "2023-10-06 07:23:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Jahrbuch.js", + "label": "Jahrbuch", + "translatorID": "e5e34825-1314-43bd-a9fe-f38f6ab48403", + "target": "^https?://www\\.emis\\.de/cgi-bin/jfmen/MATH/JFM/", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2017-11-04 10:50:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/JETS.js", + "label": "JETS", + "translatorID": "e7bb82b1-cebf-432c-96df-1c5211f59927", + "target": "^https?://(www\\.)?etsjets\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Luke van der Hoeven", + "priority": 100, + "lastUpdated": "2021-06-18 00:00:50", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/JISC Historical Texts.js", + "label": "JISC Historical Texts", + "translatorID": "327cacea-9603-4554-91a8-ed0587e0d83a", + "target": "^https?://(data\\.)?[^/]*historicaltexts\\.jisc\\.ac\\.uk/(view|results)\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-06-07 16:45:40", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Journal of Electronic Publishing.js", + "label": "Journal of Electronic Publishing", + "translatorID": "d93c14fb-d327-4540-b60a-327309ea512b", + "target": "^https?://quod\\.lib\\.umich\\.edu/j/jep", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2018-01-31 20:16:13", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Journal of Machine Learning Research.js", + "label": "Journal of Machine Learning Research", + "translatorID": "c5abbc55-98a1-4557-a295-841c7ae7dfea", + "target": "^https?://((www\\.)?(jmlr\\.(org|csail\\.mit\\.edu))/(papers/v|mloss/)|proceedings\\.mlr\\.press/v)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-16 20:23:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Journal of Religion and Society.js", + "label": "Journal of Religion and Society", + "translatorID": "e969da6b-30c9-4b26-8fcc-c2d78bce685f", + "target": "^https?://(www\\.)?moses\\.creighton\\.edu/JRS", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Vincent Carret", + "priority": 100, + "lastUpdated": "2021-07-14 20:06:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/JRC Publications Repository.js", + "label": "JRC Publications Repository", + "translatorID": "03df2575-dbd9-49aa-9e58-1e6edd86d562", + "target": "^https?://(www\\.)?publications\\.jrc\\.ec\\.europa\\.eu/repository/(handle/|simple-search\\?|browse\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-01 15:24:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/JSTOR.js", + "label": "JSTOR", + "translatorID": "d921155f-0186-1684-615c-ca57682ced9b", + "target": "^https?://([^/]+\\.)?jstor\\.org/(discover/|action/(showArticle|doBasicSearch|doAdvancedSearch|doLocatorSearch|doAdvancedResults|doBasicResults)|stable/|pss/|openurl\\?|sici\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith, Sean Takats, Michael Berkowitz, Eli Osherovich, czar", + "priority": 100, + "lastUpdated": "2024-03-31 15:58:08", + "minVersion": "3.0.12", + "maxVersion": "" + }, + { + "path": "translators/zotero/Juricaf.js", + "label": "Juricaf", + "translatorID": "86168097-0ce0-4c77-ba34-8bd57f47a3d3", + "target": "^https?://(www\\.)?juricaf\\.org/(arret|recherche)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guillaume Adreani and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-12 16:37:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/jurion.js", + "label": "jurion", + "translatorID": "dc78e210-31da-4fe5-99d6-1ea1a61874ca", + "target": "^https?://www\\.recht\\.jurion\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-30 20:15:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Juris.js", + "label": "Juris", + "translatorID": "bc2ec385-e60a-4899-96ae-d4f0d6574ad7", + "target": "^https?://(www\\.|testsystem\\.)?juris\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Reto Mantz", + "priority": 100, + "lastUpdated": "2018-08-27 10:42:50", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/JurPC.js", + "label": "JurPC", + "translatorID": "b662c6eb-e478-46bd- bad4-23cdfd0c9d67", + "target": "^https?://www\\.jurpc\\.de/jurpc/show\\?id=", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Oliver Vivell and Michael Berkowitz", + "priority": 100, + "lastUpdated": "2021-06-07 18:03:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/K10plus ISBN.js", + "label": "K10plus ISBN", + "translatorID": "de0eef58-cb39-4410-ada0-6b39f43383f9", + "target": "", + "translatorType": 8, + "creator": "Philipp Zumstein", + "priority": 99, + "lastUpdated": "2024-10-09 14:20:54", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Kanopy.js", + "label": "Kanopy", + "translatorID": "595f70a0-9f64-459c-a4b1-658c8193bf7f", + "target": "^https?://[^/]+\\.kanopy\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-16 23:36:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Khaama Press.js", + "label": "Khaama Press", + "translatorID": "dfb58faa-d501-4de8-8e03-ea84ef8986cd", + "target": "^https?://www\\.khaama\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-16 03:29:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/KiM.js", + "label": "KiM", + "translatorID": "429936dd-ad60-4e23-b346-569c85d17e0b", + "target": "^https?://[^/]*kimnet\\.nl/document", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ewout ter Hoeven", + "priority": 100, + "lastUpdated": "2026-01-02 16:28:12", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/KitapYurdu.com.js", + "label": "KitapYurdu.com", + "translatorID": "d3f35d5a-55da-4e07-be7d-b4d2a821279f", + "target": "^https?://www\\.kitapyurdu\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Hasan Huseyin DER", + "priority": 100, + "lastUpdated": "2022-02-08 18:18:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Korean National Library.js", + "label": "Korean National Library", + "translatorID": "b077ea16-c6d6-48f8-906a-05a193da4c2f", + "target": "^https?://www\\.nl\\.go\\.kr/(EN|NL)/contents/(eng)?[sS]earch\\.do", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-12-28 02:37:11", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/KStudy.js", + "label": "KStudy", + "translatorID": "b298ca93-0010-48f5-97fb-e9923519a380", + "target": "^https?://[^/]+\\.kstudy\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Yunwoo Song, Frank Bennett, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-01-03 13:10:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/L'Annee Philologique.js", + "label": "L'Ann\u00e9e Philologique", + "translatorID": "e04e4bab-64c2-4b9a-b6c2-7fb186281969", + "target": "^https?://cpps\\.brepolis\\.net/aph/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-13 02:22:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/La Croix.js", + "label": "La Croix", + "translatorID": "f6279abd-ab60-4aad-bdb0-20137279cd19", + "target": "^https?://www\\.la-croix\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-11-03 20:18:42", + "minVersion": "3.0.4", + "maxVersion": "" + }, + { + "path": "translators/zotero/La Nacion (Argentina).js", + "label": "La Naci\u00f3n (Argentina)", + "translatorID": "44017484-f65e-4575-9a6e-d9050c27d18e", + "target": "^https://www\\.lanacion\\.com\\.ar/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-23 03:22:23", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/La Presse.js", + "label": "La Presse", + "translatorID": "dbfcaa3e-082a-45a4-9619-9892f49399c1", + "target": "^https?://(www|recherche)\\.lapresse\\.ca/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-27 05:05:03", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/La Republica (Peru).js", + "label": "La Rep\u00fablica (Peru)", + "translatorID": "4ec51dc9-b949-497e-856b-a7624175d5c6", + "target": "^https?://larepublica\\.pe/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-07-14 18:50:45", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Landesbibliographie Baden-Wurttemberg.js", + "label": "Landesbibliographie Baden-W\u00fcrttemberg", + "translatorID": "d2c0d2f4-42c0-41e0-8021-3b87b52b27d2", + "target": "^https?://(www\\.)?(statistik\\.baden-wuerttemberg|statistik-bw)\\.de/LABI", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-07-12 18:14:55", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Lapham's Quarterly.js", + "label": "Lapham's Quarterly", + "translatorID": "e329ec79-397e-4aa5-a06e-1aa32f10a138", + "target": "^https?://www\\.laphamsquarterly\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Zo\u00eb C. Ma", + "priority": 100, + "lastUpdated": "2023-04-11 10:35:51", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Le Devoir.js", + "label": "Le Devoir", + "translatorID": "d1605270-d7dc-459f-9875-74ad8dde1f7d", + "target": "^https?://www\\.ledevoir\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-01 15:26:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Le Figaro.js", + "label": "Le Figaro", + "translatorID": "80a58db6-7353-4bfa-9f3a-4a44fc903f01", + "target": "^https?://www\\.lefigaro\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-05-29 22:56:59", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Le Maitron.js", + "label": "Le Maitron", + "translatorID": "ee016722-5f02-4362-8ffe-c96e06872b3e", + "target": "^https?://maitron\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2022-09-24 22:15:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Le monde diplomatique.js", + "label": "Le monde diplomatique", + "translatorID": "530cf18c-e80a-4e67-ae9c-9b8c08591610", + "target": "^https?://(www\\.)?monde-diplomatique\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff", + "priority": 100, + "lastUpdated": "2016-11-04 22:01:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Le Monde.js", + "label": "Le Monde", + "translatorID": "6bc635a4-6823-4f95-acaf-b43e8a158144", + "target": "^https?://(www\\.)?(abonnes\\.)?lemonde\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-11-06 22:47:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Legifrance.js", + "label": "L\u00e9gifrance", + "translatorID": "2dc0b23d-64d8-4933-b629-5c003451ccf7", + "target": "^https?://(www\\.)?legifrance\\.gouv\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guillaume Adreani", + "priority": 100, + "lastUpdated": "2021-06-07 16:46:17", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Legislative Insight.js", + "label": "Legislative Insight", + "translatorID": "2bedae3c-bab5-447f-b127-e9babc0e9cfe", + "target": "^https?://(preprod\\.)?li\\.proquest\\.com/legislativeinsight/LegHistMain\\.jsp", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Kari Hemdal", + "priority": 100, + "lastUpdated": "2021-12-28 04:36:45", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Lexis+.js", + "label": "Lexis+", + "translatorID": "419638d9-9049-44ad-ba08-fa54ed24b5e6", + "target": "^https?://plus\\.lexis\\..*/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "bfahrenfort", + "priority": 100, + "lastUpdated": "2023-05-26 04:11:53", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/LexisNexis.js", + "label": "LexisNexis", + "translatorID": "b047a13c-fe5c-6604-c997-bef15e502b09", + "target": "^https?://[^/]*lexis-?nexis\\.com", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2014-03-20 20:48:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Libraries Tasmania.js", + "label": "Libraries Tasmania", + "translatorID": "44699e59-a196-4716-ae33-141ec605e394", + "target": "^https?://librariestas\\.ent\\.sirsidynix\\.net\\.au/client/en_AU/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Sherratt (tim@timsherratt.org)", + "priority": 100, + "lastUpdated": "2026-03-04 06:44:20", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Aleph).js", + "label": "Library Catalog (Aleph)", + "translatorID": "cf87eca8-041d-b954-795a-2d86348999d5", + "target": "^https?://[^/]+/F(/?[A-Z0-9\\-]*(\\?.*)?$|\\?func=find|\\?func=scan|\\?func=short|\\?local_base=)", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Simon Kornblith, Michael Berkowitz, Ming Yeung Cheung", + "priority": 250, + "lastUpdated": "2021-05-21 03:54:32", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Amicus).js", + "label": "Library Catalog (Amicus)", + "translatorID": "a0a9a45c-cc9e-497c-962e-a366618df985", + "target": "^https?://amicus\\.collectionscanada\\.ca/aaweb-bin/aamain", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2014-08-26 03:47:57", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Aquabrowser).js", + "label": "Library Catalog (Aquabrowser)", + "translatorID": "915c326f-06c5-4833-b7b7-54c63f88b135", + "target": "/fullrecordinnerframe\\.ashx\\?.+id=|/result\\.ashx\\?", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 270, + "lastUpdated": "2014-08-26 03:51:35", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (BiblioCommons).js", + "label": "Library Catalog (BiblioCommons)", + "translatorID": "5d506fe3-dbde-4424-90e8-d219c63faf72", + "target": "^https?://[^/]+\\.bibliocommons\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon and Abe Jellinek", + "priority": 250, + "lastUpdated": "2021-05-19 21:14:05", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Blacklight).js", + "label": "Library Catalog (Blacklight)", + "translatorID": "fc54af5d-736c-4dfc-96ab-182df76b5fa3", + "target": "^https?://(catalog\\.libraries\\.psu|clio\\.columbia|searchworks\\.stanford|search\\.library\\.brown)\\.edu/(view|catalog|\\?search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2020-11-03 01:34:52", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Capita Prism).js", + "label": "Library Catalog (Capita Prism)", + "translatorID": "dc024bfc-2252-4257-b10e-cb95a0f213aa", + "target": "/items(/\\d+|\\?query=)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 260, + "lastUpdated": "2016-07-02 21:37:30", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (DRA).js", + "label": "Library Catalog (DRA)", + "translatorID": "fb12ae9e-f473-cab4-0546-27ab88c64101", + "target": "/web2/tramp2\\.exe/(see\\_record/|authority\\_hits/|do_keyword_search|form/|goto/.*\\?.*screen=(MARC)?Record\\.html)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 260, + "lastUpdated": "2016-12-04 12:47:41", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Dynix).js", + "label": "Library Catalog (Dynix)", + "translatorID": "774d7dc2-3474-2684-392c-f787789ec63d", + "target": "ipac\\.jsp\\?.*(uri=(link|full)=[0-9]|menu=search|term=)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Simon Kornblith and Sylvain Machefert", + "priority": 260, + "lastUpdated": "2014-08-26 03:59:09", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (EBSCO Locate).js", + "label": "Library Catalog (EBSCO Locate)", + "translatorID": "86c090c5-ad3f-4c54-a1f3-9870942014ac", + "target": "/search\\?|/instances/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 260, + "lastUpdated": "2025-10-16 15:04:23", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Encore).js", + "label": "Library Catalog (Encore)", + "translatorID": "446764bf-7da6-49ec-b7a7-fefcbafe317f", + "target": "/iii/encore/(record|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 270, + "lastUpdated": "2017-11-25 15:51:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (InnoPAC).js", + "label": "Library Catalog (InnoPAC)", + "translatorID": "4fd6b89b-2316-2dc4-fd87-61a97dd941e8", + "target": "(search~|/search\\?|(a|X|t|Y|w)\\?|\\?(searchtype|searchscope)|frameset&FF|record=[bi]?[0-9]+(~S[0-9])?|/search/q\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith and Michael Berkowitz", + "priority": 250, + "lastUpdated": "2021-08-04 21:15:52", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Koha).js", + "label": "Library Catalog (Koha)", + "translatorID": "8e66aa6d-5b2a-4b44-b384-a838e23b8538", + "target": "^https?://[^/]+/cgi-bin/koha/opac-(detail|search|shelves)\\.pl\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 260, + "lastUpdated": "2015-10-17 18:23:11", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Mango).js", + "label": "Library Catalog (Mango)", + "translatorID": "fa87288d-406b-48cb-a957-7defcf415a64", + "target": "\\.catalog\\.fcla\\.edu/.+\\.jsp\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 200, + "lastUpdated": "2012-09-24 12:32:34", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (OPALS).js", + "label": "Library Catalog (OPALS)", + "translatorID": "83501b8c-1033-4722-ae50-a77d67271ef7", + "target": "^https?://[^?#&]+/bin/(search|pf|rs)", + "browserSupport": "gcsib", + "translatorType": 4, + "creator": "Opals", + "priority": 250, + "lastUpdated": "2014-08-26 04:06:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (PICA).js", + "label": "Library Catalog (PICA)", + "translatorID": "1b9ed730-69c7-40b0-8a06-517a89a3a278", + "target": "^https?://[^/]+(/[^/]+)*//?DB=\\d", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Michael Berkowitz, Sylvain Machefert, Sebastian Karcher, St\u00e9phane Gully, Mathis Eon", + "priority": 248, + "lastUpdated": "2024-11-26 15:26:20", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (PICA2).js", + "label": "Library Catalog (PICA2)", + "translatorID": "5236e1d6-fcf2-4ed5-9165-cc5f345ce33e", + "target": "^https?://[^/]+/DB=[\\dA-Z]", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Sean Takats, Michael Berkowitz, Sylvain Machefert, Sebastian Karcher, Aurimas Vinckevicius", + "priority": 249, + "lastUpdated": "2014-08-26 04:07:48", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Pika).js", + "label": "Library Catalog (Pika)", + "translatorID": "9ace2311-a958-471d-a8c7-61c647c6d9ae", + "target": "/Record/\\.[a-z]|/GroupedWork/[a-z0-9-]+|/Union/Search\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 250, + "lastUpdated": "2021-08-17 23:44:24", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Polaris).js", + "label": "Library Catalog (Polaris)", + "translatorID": "12541207-ed80-4b59-9d46-fafa3aa61f7f", + "target": "/polaris/search/(searchresults|title)\\.aspx\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 250, + "lastUpdated": "2015-02-19 04:55:29", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Quolto).js", + "label": "Library Catalog (Quolto)", + "translatorID": "3fce237f-8744-4434-b448-4b79eb194ea8", + "target": "/record/-/record/|results/-/results|^https?://(www\\.)?(mokka\\.hu/|odrportal\\.hu/).+results", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2020-11-12 03:27:27", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (RERO ILS).js", + "label": "Library Catalog (RERO ILS)", + "translatorID": "91b25fbe-6083-40ef-9ad5-1defc9047a90", + "target": "^https://((ils\\.test|bib)\\.rero\\.ch|ils\\.bib\\.uclouvain\\.be)/[^/]+/(documents/\\d+|search/documents\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 250, + "lastUpdated": "2024-07-24 20:02:01", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (SIRSI eLibrary).js", + "label": "Library Catalog (SIRSI eLibrary)", + "translatorID": "23ba3be6-412d-4dde-9cc1-c4df0cc09378", + "target": "/uhtbin/(cgisirsi|quick_keyword)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Mang Sun", + "priority": 250, + "lastUpdated": "2021-12-27 20:32:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (SIRSI).js", + "label": "Library Catalog (SIRSI)", + "translatorID": "add7c71c-21f3-ee14-d188-caf9da12728b", + "target": "/uhtbin/(cgisirsi|quick_keyword)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Hicham El Kasmi", + "priority": 250, + "lastUpdated": "2021-12-27 20:16:50", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (SLIMS).js", + "label": "Library Catalog (SLIMS)", + "translatorID": "fc3ac6f7-b461-49fe-879c-dd234f9c101c", + "target": "(^https?://makassarlib\\.net|^https?://kit\\.ft\\.ugm\\.ac\\.id/ucs|/libsenayan)/index\\.php", + "browserSupport": "gcv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 250, + "lastUpdated": "2014-08-26 04:10:09", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (TIND ILS).js", + "label": "Library Catalog (TIND ILS)", + "translatorID": "3f50f41c-0a07-49f7-af14-7fcf2ed5887a", + "target": "/search.+p=|record/[0-9]+", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 260, + "lastUpdated": "2025-05-30 08:40:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (TinREAD).js", + "label": "Library Catalog (TinREAD)", + "translatorID": "78835a5b-3378-49c2-a94f-3422aab0e949", + "target": "^https?://[^/]+/opac/bibliographic_view", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Franklin Pezzuti Dyer", + "priority": 250, + "lastUpdated": "2024-08-01 14:15:46", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (TLCYouSeeMore).js", + "label": "Library Catalog (TLC/YouSeeMore)", + "translatorID": "0f9fc2fc-306e-5204-1117-25bca009dffc", + "target": "TLCScripts/interpac\\.dll\\?(.*LabelDisplay.*RecordNumber=[0-9]|Search|ItemTitles)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 260, + "lastUpdated": "2021-12-28 03:53:31", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Visual Library 2021).js", + "label": "Library Catalog (Visual Library 2021)", + "translatorID": "d23f01f1-6037-439b-87fb-23b8f3b9067f", + "target": "/search(/quick)?\\?|/nav/index/|/(content|periodical)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 250, + "lastUpdated": "2021-07-19 16:39:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Voyager 7).js", + "label": "Library Catalog (Voyager 7)", + "translatorID": "a81243b5-a9fd-4921-8441-3142a518fdb7", + "target": "/vwebv/(holdingsInfo|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats", + "priority": 250, + "lastUpdated": "2014-08-26 04:12:22", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (Voyager).js", + "label": "Library Catalog (Voyager)", + "translatorID": "88915634-1af6-c134-0171-56fd198235ed", + "target": "Pwebrecon\\.cgi", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 250, + "lastUpdated": "2021-12-28 04:30:33", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Catalog (VTLS).js", + "label": "Library Catalog (VTLS)", + "translatorID": "63a0a351-3131-18f4-21aa-f46b9ac51d87", + "target": "/chameleon(\\?|$)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 250, + "lastUpdated": "2014-08-26 04:13:58", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Genesis.js", + "label": "Library Genesis", + "translatorID": "11614156-f421-4e89-8ce0-a5e69ce3ebed", + "target": "^https?://(libgen\\.[a-z]{2}|gen\\.lib\\.rus\\.ec)/", + "browserSupport": "gcsi", + "translatorType": 4, + "creator": "Reverend Wicks Cherrycoke", + "priority": 100, + "lastUpdated": "2021-06-10 13:41:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library Hub Discover.js", + "label": "Library Hub Discover", + "translatorID": "00d5236c-ce1f-484b-9552-da8e2f10eee4", + "target": "^https?://(www\\.)?discover\\.libraryhub\\.jisc\\.ac\\.uk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Vincent Carret", + "priority": 100, + "lastUpdated": "2021-07-14 15:57:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library of Congress Digital Collections.js", + "label": "Library of Congress Digital Collections", + "translatorID": "79c14aee-b91f-46ed-8285-d83fed1f0b32", + "target": "^https?://www\\.loc\\.gov/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek and Adam Bravo", + "priority": 100, + "lastUpdated": "2024-08-22 14:22:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Library of Congress ISBN.js", + "label": "Library of Congress ISBN", + "translatorID": "c070e5a2-4bfd-44bb-9b3c-4be20c50d0d9", + "target": "", + "translatorType": 8, + "creator": "Sebastian Karcher", + "priority": 97, + "lastUpdated": "2023-08-25 05:06:07", + "minVersion": "3.0.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/LIBRIS ISBN.js", + "label": "LIBRIS ISBN", + "translatorID": "5f506a9a-8076-4e1e-950c-f55d32003aae", + "target": "", + "translatorType": 8, + "creator": "Sebastian Berlin", + "priority": 98, + "lastUpdated": "2024-04-23 18:44:30", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/LingBuzz.js", + "label": "LingBuzz", + "translatorID": "e048e70e-8fea-43e9-ac8e-940bc3d71b0b", + "target": "^https://(ling\\.auf|lingbuzz)\\.net/lingbuzz/(repo/semanticsArchive/article/)?(\\d+|_search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "G\u00f6ktu\u011f Kayaalp and Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-05-04 01:00:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Lippincott Williams and Wilkins.js", + "label": "Lippincott Williams and Wilkins", + "translatorID": "97930de6-8709-409a-a80c-ed64421a842e", + "target": "^https?://(www\\.)?journals\\.lww\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-09-01 17:23:56", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Literary Hub.js", + "label": "Literary Hub", + "translatorID": "f1aaf4bf-f344-41ee-b960-905255d40d53", + "target": "^https?://lithub\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Zo\u00eb C. Ma", + "priority": 100, + "lastUpdated": "2023-04-22 01:23:39", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Litres.js", + "label": "Litres", + "translatorID": "02bde528-c86d-42d5-904b-e74f85bd45f9", + "target": "^https://(www\\.)?litres\\.ru/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ilya Zonov", + "priority": 100, + "lastUpdated": "2025-05-21 14:38:11", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/LIVIVO.js", + "label": "LIVIVO", + "translatorID": "485cd5f3-9c36-473e-80a7-b36a9c367515", + "target": "^https?://www\\.livivo\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-31 17:55:33", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/London Review of Books.js", + "label": "London Review of Books", + "translatorID": "8a00461c-5b42-4632-8048-339b221ac3a2", + "target": "^https?://(www\\.)?lrb\\.co\\.uk", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-09-21 16:56:33", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/LookUs.js", + "label": "LookUs", + "translatorID": "f08fe747-e042-49a0-87b3-7bdbbfec1219", + "target": "/jvi.aspx[^#]*[?&](volume|issue|un)=", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 250, + "lastUpdated": "2021-09-14 19:35:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Lulu.js", + "label": "Lulu", + "translatorID": "9a0ecbda-c0e9-4a19-84a9-fc8e7c845afa", + "target": "^https?://www\\.lulu\\.com/shop/", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Aurimas Vinckevicius", + "priority": 101, + "lastUpdated": "2024-10-24 19:22:51", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/LWN.net.js", + "label": "LWN.net", + "translatorID": "57517a91-b881-4da3-b205-751f6c7e2cae", + "target": "^https?://lwn\\.net/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Hollmann", + "priority": 100, + "lastUpdated": "2025-08-28 14:37:28", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MAB2.js", + "label": "MAB2", + "translatorID": "91acf493-0de7-4473-8b62-89fd141e6c74", + "target": "mab2", + "browserSupport": "gcs", + "translatorType": 1, + "creator": "Simon Kornblith. Adaptions for MAB2: Leon Krauthausen (FUB)", + "priority": 100, + "lastUpdated": "2014-05-20 17:57:47", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/magazines.russ.ru.js", + "label": "magazines.russ.ru", + "translatorID": "0db1c2d0-eaae-4f3d-94ef-d4b3aa61de16", + "target": "^https?://magazines\\.russ\\.ru/[a-zA-Z -_]+/[0-9]+/[0-9]+/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon", + "priority": 100, + "lastUpdated": "2016-12-31 10:22:19", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Mailman.js", + "label": "Mailman", + "translatorID": "6cb92652-6a2b-473e-b976-434f50b15069", + "target": "/(pipermail|archives)/[A-Za-z0-9_-]*/[0-9]{4}-(January|February|March|April|May|June|July|August|September|October|November|December)/[0-9]{6}\\.html", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Robin Paulson", + "priority": 260, + "lastUpdated": "2017-01-01 16:55:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Mainichi Daily News.js", + "label": "Mainichi Daily News", + "translatorID": "b56f856e-934e-4b46-bc58-d61dccc9f32f", + "target": "^https?://mainichi\\.jp/(?:english/)?(articles/|search\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-12-17 20:25:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MARC.js", + "label": "MARC", + "translatorID": "a6ee60df-1ddc-4aae-bb25-45e0537be973", + "target": "marc", + "translatorType": 1, + "creator": "Simon Kornblith, Sylvain Machefert", + "priority": 100, + "lastUpdated": "2025-03-28 15:43:42", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/MARCXML.js", + "label": "MARCXML", + "translatorID": "edd87d07-9194-42f8-b2ad-997c4c7deefd", + "target": "xml", + "translatorType": 1, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-03-28 15:11:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Mastodon.js", + "label": "Mastodon", + "translatorID": "98878eeb-84b7-4945-86dd-3d61258ecc1b", + "target": "/@.+/\\d{10}", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 300, + "lastUpdated": "2022-12-09 02:38:35", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Max Planck Institute for the History of Science Virtual Laboratory Library.js", + "label": "Max Planck Institute for the History of Science: Virtual Laboratory Library", + "translatorID": "66928fe3-1e93-45a7-8e11-9df6de0a11b3", + "target": "^https?://vlp\\.mpiwg-berlin\\.mpg\\.de/library/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-01-31 23:20:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MCV.js", + "label": "MCV", + "translatorID": "b51ac026-ed35-4c68-89bb-b42b1e1ce8f2", + "target": "^https?://(www\\.)?mcvuk\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-12 00:34:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MDPI Journals.js", + "label": "MDPI Journals", + "translatorID": "acf93a17-a83b-482b-a45e-0c64cfd49bee", + "target": "^https?://www\\.mdpi\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-01-24 13:33:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/medes.js", + "label": "medes", + "translatorID": "96a92909-f23c-4f16-ae93-1948c2459932", + "target": "^https?://(www\\.)?medes\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-12-27 13:01:58", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Medium.js", + "label": "Medium", + "translatorID": "6c957d6b-a554-474f-81a9-91c178fef65d", + "target": "^https?://([^.]+\\.)?medium\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-07-20 01:55:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MEDLINEnbib.js", + "label": "MEDLINE/nbib", + "translatorID": "9ec64cfd-bea7-472a-9557-493c0c26b0fb", + "target": "txt", + "translatorType": 1, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/mEDRA.js", + "label": "mEDRA", + "translatorID": "d9b57cd5-5a9c-4946-8616-3bdf8edfcbb5", + "target": "^https?://www\\.medra\\.org/servlet/view\\?", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Aurimas Vinckevicius", + "priority": 105, + "lastUpdated": "2025-07-14 17:55:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MetaLib.js", + "label": "MetaLib", + "translatorID": "b06d2609-ebca-4125-ac67-6d7a0dba274e", + "target": "^https?://[^/]*/V/", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 250, + "lastUpdated": "2017-01-01 15:26:24", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/METS.js", + "label": "METS", + "translatorID": "5c6895a1-b6a9-4939-9c65-43f8ae0ef096", + "target": "xml", + "translatorType": 1, + "creator": "Abe Jellinek", + "priority": 50, + "lastUpdated": "2021-07-13 20:44:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Microbiology Society Journals.js", + "label": "Microbiology Society Journals", + "translatorID": "ce5f2849-4500-47cc-8d7d-3fc0a1de9848", + "target": "^https?://(www\\.)?(\\w)+\\.microbiologyresearch\\.org/(content/journal/|search?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2023-01-14 04:26:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Microsoft Academic.js", + "label": "Microsoft Academic", + "translatorID": "91c7b393-af05-476c-ae72-ae244d2347f4", + "target": "^https?://academic\\.microsoft\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-03-04 19:36:45", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MIDAS Journals.js", + "label": "MIDAS Journals", + "translatorID": "86c35e86-3f97-4e80-9356-8209c97737c2", + "target": "^https?://(www\\.)?(insight-journal|midasjournal|vtkjournal)\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Rupert Brooks", + "priority": 100, + "lastUpdated": "2018-04-16 11:27:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Mikromarc.js", + "label": "Mikromarc", + "translatorID": "b937ee25-6686-4975-a5ce-95dcfc01b545", + "target": "^https?://[^/]+\\.mikromarc\\.no/mikromarc3/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-03-07 21:18:01", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Milli Kutuphane.js", + "label": "Milli K\u00fct\u00fcphane", + "translatorID": "a5998785-222b-4459-9ce8-9c081d599af7", + "target": "^https?://(www\\.)?kasif\\.mkutup\\.gov\\.tr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-03-15 18:16:49", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MIT Press Books.js", + "label": "MIT Press Books", + "translatorID": "ac277fbe-000c-46da-b145-fbe799d17eda", + "target": "https://(www\\.)?mitpress\\.mit\\.edu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guy Aglionby", + "priority": 100, + "lastUpdated": "2025-08-05 20:50:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/MODS.js", + "label": "MODS", + "translatorID": "0e2235e7-babf-413c-9acf-f27cce5f059c", + "target": "xml", + "translatorType": 3, + "creator": "Simon Kornblith, Richard Karnesky, and Abe Jellinek", + "priority": 50, + "lastUpdated": "2022-10-31 14:01:52", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/MPG PuRe.js", + "label": "MPG PuRe", + "translatorID": "9d0b3532-f3ee-4096-87e6-5c5759a3e9dc", + "target": "^https?://pure\\.mpg\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-07 20:00:26", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Musee du Louvre.js", + "label": "Mus\u00e9e du Louvre", + "translatorID": "22d17fb9-ae32-412e-bcc4-7650ed3359bc", + "target": "^https?://collections\\.louvre\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-11 13:07:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Nagoya University OPAC.js", + "label": "Nagoya University OPAC", + "translatorID": "b56d756e-814e-4b46-bc58-d61dccc9f32f", + "target": "^https?://opac\\.nul\\.nagoya-u\\.ac\\.jp/webopac/(catdbl\\.do|ctlsrh\\.do)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Frank Bennett", + "priority": 100, + "lastUpdated": "2021-12-28 04:47:51", + "minVersion": "2.0b7", + "maxVersion": "" + }, + { + "path": "translators/zotero/NASA ADS.js", + "label": "NASA ADS", + "translatorID": "7987b420-e8cb-4bea-8ef7-61c2377cd686", + "target": "^(https://ui\\.adsabs\\.harvard\\.edu/(search|abs)/)|(^https://scixplorer\\.org/(search|abs/))", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Hostetler, Abe Jellinek, Zo\u00eb C. Ma, Jennifer Chen", + "priority": 100, + "lastUpdated": "2025-07-25 19:49:19", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NASA NTRS.js", + "label": "NASA NTRS", + "translatorID": "5a697ab5-913a-478a-b4ec-98d019aa5dc6", + "target": "^https?://ntrs\\.nasa\\.gov/(citations/|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Andrew Bergan and Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-03-21 20:00:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Academies Press.js", + "label": "National Academies Press", + "translatorID": "f76afa52-0524-440e-98ba-7c0c10a7b693", + "target": "^https?://nap\\.nationalacademies\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-12-12 19:59:23", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Agriculture Library.js", + "label": "National Agriculture Library", + "translatorID": "e391620a-0a33-415b-b08b-521fdbb2c257", + "target": "^https?://(pubag|naldc)\\.nal\\.usda\\.gov/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-11 22:01:59", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Archives of Australia.js", + "label": "National Archives of Australia", + "translatorID": "50a4cf3f-92ef-4e9f-ab15-815229159b16", + "target": "^https?://recordsearch\\.naa\\.gov\\.au/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Sherratt, Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2021-02-13 11:39:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Archives of South Africa.js", + "label": "National Archives of South Africa", + "translatorID": "5b02e8d4-d8fb-4143-af3d-3576d4c1b49c", + "target": "^https?://www\\.national\\.archsrch\\.gov\\.za", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Adam Crymble", + "priority": 100, + "lastUpdated": "2014-03-12 22:00:51", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Archives UK Case Law.js", + "label": "National Archives UK Case Law", + "translatorID": "be076b36-b2ef-41e3-afd9-3ab9da626ff1", + "target": "^https?://caselaw\\.nationalarchives\\.gov\\.uk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Veale", + "priority": 100, + "lastUpdated": "2026-02-03 19:39:24", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Bureau of Economic Research.js", + "label": "National Bureau of Economic Research", + "translatorID": "99f958ab-0732-483d-833f-6bd8e42f6277", + "target": "^https?://(papers\\.|www2?\\.)?nber\\.org/(system/files/)?(papers|s|new|custom|books-and-chapters|chapters)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz, Philipp Zumstein, Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-04-04 18:13:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Diet Library Catalogue.js", + "label": "National Diet Library Catalogue", + "translatorID": "5978580d-c58c-46c8-9755-9481a3e20f3f", + "target": "^https?://iss\\.ndl\\.go\\.jp/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2015-08-15 16:07:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Gallery of Art - USA.js", + "label": "National Gallery of Art - USA", + "translatorID": "ed28758b-9c39-4e1c-af89-ce1c9202b70f", + "target": "^https?://www\\.nga\\.gov/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-08 03:45:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Gallery of Australia.js", + "label": "National Gallery of Australia", + "translatorID": "ac9c95f6-7692-47fb-b231-4cc36d1d67f5", + "target": "^https?://searchthecollection\\.nga\\.gov\\.au/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ben Swift", + "priority": 100, + "lastUpdated": "2021-08-25 17:02:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Library of Australia (new catalog).js", + "label": "National Library of Australia (new catalog)", + "translatorID": "54ac4ec1-9d07-45d3-9d96-48bed3411fb6", + "target": "^https?://catalogue\\.nla\\.gov\\.au", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein and Tim Sherratt", + "priority": 100, + "lastUpdated": "2022-08-02 21:35:50", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Library of Belarus.js", + "label": "National Library of Belarus", + "translatorID": "89592f50-6ae8-491e-8988-969002012b1b", + "target": "^https?://www\\.nlb\\.by/portal/page/portal/index/resources/(basicsearch|expandedsearch|anothersearch|authoritet|newdoc|top100)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-01 15:28:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Library of Norway.js", + "label": "National Library of Norway", + "translatorID": "7bd82b70-1ed7-4aaf-bea2-bcbe6429a3ee", + "target": "^https?://(www\\.)?nb\\.no/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Dan Michael O. Hegg\u00f8", + "priority": 100, + "lastUpdated": "2021-07-14 15:58:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Library of Poland ISBN.js", + "label": "National Library of Poland ISBN", + "translatorID": "aa7f310e-10d3-4209-91dc-88301e7070c6", + "target": "", + "translatorType": 8, + "creator": "Maciej Nux Jaros", + "priority": 98, + "lastUpdated": "2023-06-15 02:45:16", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Post.js", + "label": "National Post", + "translatorID": "1c5b122c-7e58-4cd5-932b-93f5ca0b7e1a", + "target": "^https://(www\\.)?(national|financial)post\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-12 02:31:11", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Technical Reports Library.js", + "label": "National Technical Reports Library", + "translatorID": "5b9511cd-9b0b-4816-812a-6cbb2b685046", + "target": "^https?://ntrl\\.ntis\\.gov/NTRL/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-31 19:24:13", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/National Transportation Library ROSA P.js", + "label": "National Transportation Library ROSA P", + "translatorID": "47cbb10a-d6d6-4957-96de-e8b6424c7708", + "target": "^https?://rosap\\.ntl\\.bts\\.gov/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-11 21:32:59", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Nature Publishing Group.js", + "label": "Nature Publishing Group", + "translatorID": "6614a99-479a-4524-8e30-686e4d66663e", + "target": "^https?://(www\\.)?nature\\.com/([^?/]+/)?(journal|archive|research|topten|search|full|abs|current_issue\\.htm|most\\.htm|articles/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2025-06-12 16:23:14", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NCBI Nucleotide.js", + "label": "NCBI Nucleotide", + "translatorID": "5e385e77-2f51-41b4-a29b-908e23d5d3e8", + "target": "^https?://(www\\.)?ncbi\\.nlm\\.nih\\.gov/nuccore/", + "browserSupport": "gcs", + "translatorType": 4, + "creator": "Martin Fenner", + "priority": 100, + "lastUpdated": "2021-06-07 11:25:19", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Neural Information Processing Systems.js", + "label": "Neural Information Processing Systems", + "translatorID": "c816f8ad-4c73-4f6d-914e-a6e7212746cf", + "target": "^https?://(papers|proceedings)\\.n(eur)?ips\\.cc/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Fei Qi, Sebastian Karcher, Guy Aglionby, and Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-03-28 18:01:24", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/New Left Review.js", + "label": "New Left Review", + "translatorID": "b97af278-52c1-4fc4-9c8b-5175c83941f2", + "target": "^https?://(www\\.)?newleftreview\\.org/issues/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bo An", + "priority": 100, + "lastUpdated": "2021-06-16 21:17:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/New Zealand Herald.js", + "label": "New Zealand Herald", + "translatorID": "c7830593-807e-48cb-99f2-c3bed2b148c2", + "target": "^https?://www\\.nzherald\\.co\\.nz", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-13 22:55:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Newlines Magazine.js", + "label": "Newlines Magazine", + "translatorID": "33ad4fed-9a2f-4bf6-85a6-7c09a022b573", + "target": "^https?://newlinesmag\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-17 03:23:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/News Corp Australia.js", + "label": "News Corp Australia", + "translatorID": "393afc28-212d-47dd-be87-ec51bc7a58a4", + "target": "^https?://(www\\.)?(news|theaustralian|couriermail|adelaidenow|heraldsun|dailytelegraph|goldcoastbulletin|themercury|dailymercury|ntnews|northshoretimes|geelongadvertiser|townsvillebulletin|cairnspost|themorningbulletin|gladstoneobserver|sunshinecoastdaily|qt|thechronicle)\\.com\\.au/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz and Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-07-14 10:46:05", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/NewsBank.js", + "label": "NewsBank", + "translatorID": "7fc76bfc-3a1a-47e7-93cc-4deed69bee5f", + "target": "^https?://infoweb\\.newsbank\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Reuben Peterkin", + "priority": 100, + "lastUpdated": "2021-12-12 02:50:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/newshub.co.nz.js", + "label": "newshub.co.nz", + "translatorID": "a9f7b277-e134-4d1d-ada6-8f7942be71a6", + "target": "^https?://www\\.newshub\\.co\\.nz/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-12-28 20:22:36", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NewsnetTamedia.js", + "label": "Newsnet/Tamedia", + "translatorID": "caecaea0-5d06-11df-a08a-0800200c9a66", + "target": "^https?://((www\\.)?(tagesanzeiger|(bo\\.)?bernerzeitung|bazonline|derbund|lematin|24heures|landbote|zuonline|zsz|tdg|letemps)\\.ch/.)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-04-29 11:03:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/newspapers.com.js", + "label": "newspapers.com", + "translatorID": "22dd8e35-02da-4968-b306-6efe0779a48d", + "target": "^https?://[^/]+\\.newspapers\\.com/(article|image)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Peter Binkley", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Noor Digital Library.js", + "label": "Noor Digital Library", + "translatorID": "91170c85-7547-4716-b3ae-b82a68d8b19f", + "target": "^https?://noorlib\\.ir/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-03 19:35:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Note HTML.js", + "label": "Note HTML", + "translatorID": "897a81c2-9f60-4bec-ae6b-85a5030b8be5", + "target": "html", + "translatorType": 2, + "creator": "Martynas Bagdonas", + "priority": 50, + "lastUpdated": "2024-07-10 15:30:00", + "minVersion": "5.0.97", + "maxVersion": "" + }, + { + "path": "translators/zotero/Note Markdown.js", + "label": "Note Markdown", + "translatorID": "1412e9e2-51e1-42ec-aa35-e036a895534b", + "target": "md", + "translatorType": 2, + "creator": "Martynas Bagdonas", + "priority": 50, + "lastUpdated": "2024-07-10 16:00:00", + "minVersion": "5.0.97", + "maxVersion": "" + }, + { + "path": "translators/zotero/Notre Dame Philosophical Reviews.js", + "label": "Notre Dame Philosophical Reviews", + "translatorID": "a823550b-6475-4b20-8539-a3c416906228", + "target": "^https?://ndpr\\.nd\\.edu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Emiliano Heyns and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-31 17:03:45", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/NPR.js", + "label": "NPR", + "translatorID": "bc2fbf38-3061-4335-8644-69ce68580b20", + "target": "^https?://www\\.npr\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-13 21:08:15", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NRC Research Press.js", + "label": "NRC Research Press", + "translatorID": "fc08c878-ac92-40dc-9105-ca36ca20665d", + "target": "^https?://www\\.nrcresearchpress\\.com", + "browserSupport": "gcbv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2016-05-24 13:18:11", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NRC.nl.js", + "label": "NRC.nl", + "translatorID": "8e708ceb-ce42-446f-bffd-21e2bdeb0742", + "target": "^https?://www\\.nrc\\.nl", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martijn Staal", + "priority": 100, + "lastUpdated": "2023-06-20 08:03:28", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NTSB Accident Reports.js", + "label": "NTSB Accident Reports", + "translatorID": "fef8575b-da80-40ec-8084-631a08cae2bd", + "target": "^https?://(www\\.)?ntsb\\.gov/investigations/AccidentReports/Pages/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-26 18:39:23", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NYPL Menus.js", + "label": "NYPL Menus", + "translatorID": "df9dca51-1f66-4dc6-a3e1-09b4c416db23", + "target": "^https?://menus\\.nypl\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-23 00:03:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NYPL Research Catalog.js", + "label": "NYPL Research Catalog", + "translatorID": "dcf75e09-7f8a-4d4d-ad6f-363b46f79b13", + "target": "^https://www\\.nypl\\.org/research/research-catalog/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-01-26 23:24:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NYTimes.com.js", + "label": "NYTimes.com", + "translatorID": "ce7a3727-d184-407f-ac12-52837f3361ff", + "target": "^https?://(query\\.nytimes\\.com/(search|gst)/|(select\\.|www\\.|mobile\\.|[^\\/.]*\\.blogs\\.)?nytimes\\.com/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2026-01-20 19:13:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/NZZ.ch.js", + "label": "NZZ.ch", + "translatorID": "61ffe600-55e0-11df-bed9-0002a5d5c51b", + "target": "^https?://(www\\.)?nzz\\.ch/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2022-04-05 17:23:30", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/OAPEN.js", + "label": "OAPEN", + "translatorID": "2100cedb-0a7d-4166-ab97-5e84e516cd81", + "target": "^https?://library\\.oapen\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-22 00:17:40", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OCLC WorldCat FirstSearch.js", + "label": "OCLC WorldCat FirstSearch", + "translatorID": "838d8849-4ffb-9f44-3d0d-aa8a0a079afe", + "target": "^https?://[^/]*firstsearch\\.oclc\\.org[^/]*/WebZ/", + "browserSupport": "g", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 100, + "lastUpdated": "2017-01-01 15:28:35", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/OECD.js", + "label": "OECD", + "translatorID": "8cf74360-e772-4818-8cf1-eda0481c7dfb", + "target": "^https?://(www\\.)?oecd-ilibrary\\.org/", + "browserSupport": "gcs", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-08 04:15:50", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/OhioLINK.js", + "label": "OhioLINK", + "translatorID": "17c974e6-7c4f-4ac8-93af-8d74debca110", + "target": "^https?://journals\\.ohiolink\\.edu/ejc/article\\.cgi\\?", + "browserSupport": "gcs", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2017-01-01 15:28:48", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Old Bailey Online.js", + "label": "Old Bailey Online", + "translatorID": "b10bf941-12e9-4188-be04-f6357fa594a0", + "target": "^https?://www\\.oldbaileyonline\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sharon Howard and Adam Crymble", + "priority": 100, + "lastUpdated": "2024-09-15 13:03:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Open Conf.js", + "label": "Open Conf", + "translatorID": "3d180fcf-8005-4a2b-a0cd-1fe31ba1f996", + "target": "^https?://(www\\.)?openconf\\.(com|org)/.+/request\\.php", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-05-26 15:41:56", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Open Knowledge Repository.js", + "label": "Open Knowledge Repository", + "translatorID": "010e68d1-2794-4e73-b182-40f36768951b", + "target": "^https?://openknowledge\\.worldbank\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-20 19:05:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Open WorldCat.js", + "label": "Open WorldCat", + "translatorID": "c73a4a8c-3ef1-4ec8-8229-7531ee384cc4", + "target": "^https?://([^/]+\\.)?worldcat\\.org/", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Simon Kornblith, Sebastian Karcher, Abe Jellinek", + "priority": 100, + "lastUpdated": "2026-02-12 16:29:52", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OpenAlex JSON.js", + "label": "OpenAlex JSON", + "translatorID": "faa53754-fb55-4658-9094-ae8a7e0409a2", + "target": "json", + "translatorType": 1, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-07-29 14:16:09", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OpenAlex.js", + "label": "OpenAlex", + "translatorID": "432d79fe-79e1-4791-b3e1-baf700710163", + "target": "^https://openalex\\.org/works", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-07-29 14:16:50", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OpenEdition Books.js", + "label": "OpenEdition Books", + "translatorID": "4c6b4c5f-7286-45bb-8e99-0c518d177fa7", + "target": "^https?://books\\.openedition\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "C\u00e9dric Chatelain", + "priority": 100, + "lastUpdated": "2017-01-03 11:17:56", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OpenEdition Journals.js", + "label": "OpenEdition Journals", + "translatorID": "87766765-919e-4d3b-9071-3dd7efe984c8", + "target": "^https?://journals\\.openedition\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius, Pierre-Alain Mignot, Michael Berkowitz, H\u00e9l\u00e8ne Prieto, Jean-Fran\u00e7ois Rivi\u00e8re", + "priority": 100, + "lastUpdated": "2021-07-02 00:22:25", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/openJur.js", + "label": "openJur", + "translatorID": "a078c90c-c016-4a15-9b1f-40989b1d153e", + "target": "^https?://openjur\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-10-18 20:30:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Optical Society of America.js", + "label": "Optical Society of America", + "translatorID": "a1a97ad4-493a-45f2-bd46-016069de4162", + "target": "^https?://((www\\.)?osapublishing|opg\\.optica)\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2022-11-22 16:05:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Optimization Online.js", + "label": "Optimization Online", + "translatorID": "0ee623f9-0a5c-4f6a-a5e1-10e2feaa16a7", + "target": "^https?://optimization-online\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Pascal Quach", + "priority": 100, + "lastUpdated": "2023-07-15 13:50:06", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ORCID.js", + "label": "ORCID", + "translatorID": "e83248bb-caa4-4dd2-a470-11f4cd164083", + "target": "^https?://orcid\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-10-12 18:52:49", + "minVersion": "4.0.29.11", + "maxVersion": "" + }, + { + "path": "translators/zotero/OSF Preprints.js", + "label": "OSF Preprints", + "translatorID": "3b978207-5d5c-416f-b15e-2d9da4aa75e9", + "target": "^https://osf\\.io/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-10-28 14:51:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OSTI Energy Citations.js", + "label": "OSTI Energy Citations", + "translatorID": "0cdc6a07-38cf-4ec1-b9d5-7a3c0cc89b15", + "target": "^https?://www\\.osti\\.gov/(energycitations|scitech)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2017-07-27 10:41:29", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ovid OCE.js", + "label": "Ovid OCE", + "translatorID": "b2285ec2-e454-49dc-b9ce-115035b55325", + "target": "^https://oce\\.ovid\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-09-03 16:42:47", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OVID Tagged.js", + "label": "OVID Tagged", + "translatorID": "59e7e93e-4ef0-4777-8388-d6eddb3261bf", + "target": "txt", + "translatorType": 1, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-03-03 21:50:09", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ovid.js", + "label": "Ovid", + "translatorID": "cde4428-5434-437f-9cd9-2281d14dbf9", + "target": "(gw2|asinghal|sp|ovid)[^/]+/ovidweb\\.cgi", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Simon Kornblith, Michael Berkowitz, and Ovid Technologies", + "priority": 100, + "lastUpdated": "2025-03-03 21:51:19", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Oxford Dictionaries Premium.js", + "label": "Oxford Dictionaries Premium", + "translatorID": "b55076f2-0c40-4195-9f7d-cc08806178d9", + "target": "^https?://premium\\.oxforddictionaries\\.com/(translate|definition)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-13 22:07:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Oxford English Dictionary.js", + "label": "Oxford English Dictionary", + "translatorID": "d3ee2368-04d7-4b4d-a8f3-c20c3f5234a9", + "target": "^https?://(www\\.)?oed\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Emiliano Heyns", + "priority": 100, + "lastUpdated": "2021-06-14 21:23:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Oxford Music and Art Online.js", + "label": "Oxford Music and Art Online", + "translatorID": "f203db7f-7b7b-4dc4-b018-115b7885fe3b", + "target": "^https?://([^/]+\\.)?www\\.oxford(music|art)online\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2015-06-02 21:05:15", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Oxford Reference.js", + "label": "Oxford Reference", + "translatorID": "62415874-b53c-4afd-86e8-814e18a986f6", + "target": "^https?://www\\.oxfordreference\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sonali Gupta", + "priority": 100, + "lastUpdated": "2017-06-22 13:47:01", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Oxford University Press.js", + "label": "Oxford University Press", + "translatorID": "e9989043-fcdf-4f33-93b6-0381828aeb41", + "target": "^https?://global\\.oup\\.com/academic/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jingjing Yin and Qiang Fang", + "priority": 100, + "lastUpdated": "2022-10-05 01:20:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/OZON.ru.js", + "label": "OZON.ru", + "translatorID": "73be930f-5773-41b2-a7a1-37c0eeade92f", + "target": "^https?://www\\.ozon\\.ru/(context/detail/id/|\\?context=search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Mikhail Akimov", + "priority": 100, + "lastUpdated": "2017-01-04 20:51:33", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Pajhwok Afghan News.js", + "label": "Pajhwok Afghan News", + "translatorID": "db10fe28-b545-408f-a932-5873532f58fc", + "target": "^https?://pajhwok\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-16 03:38:53", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Papers Past.js", + "label": "Papers Past", + "translatorID": "1b052690-16dd-431d-9828-9dc675eb55f6", + "target": "^https?://(www\\.)?paperspast\\.natlib\\.govt\\.nz/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein, Abe Jellinek, and Jason Murphy", + "priority": 100, + "lastUpdated": "2025-10-21 16:34:21", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Paris Review.js", + "label": "Paris Review", + "translatorID": "b24ee183-58a6-443d-b8f9-c5cd5a3a0f73", + "target": "^https?://www\\.theparisreview\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-22 12:19:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Pastebin.js", + "label": "Pastebin", + "translatorID": "1d1a51d4-60bf-44b8-ae28-8b154d1ed721", + "target": "^https?://pastebin\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "febrezo", + "priority": 100, + "lastUpdated": "2017-01-22 12:41:39", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Patents - USPTO.js", + "label": "Patents - USPTO", + "translatorID": "232e24fe-2f68-44fc-9366-ecd45720ee9e", + "target": "^https?://(patft|appft1)\\.uspto\\.gov/netacgi/nph-Parser.+", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Bill McKinney", + "priority": 100, + "lastUpdated": "2014-04-04 10:11:27", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PC Gamer.js", + "label": "PC Gamer", + "translatorID": "274284a8-fc91-4f54-be77-bfcb7f9c3d6f", + "target": "^https?://(www\\.)?pcgamer\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar, Bao Trinh", + "priority": 100, + "lastUpdated": "2021-08-15 21:10:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PC Games.js", + "label": "PC Games", + "translatorID": "e3e57ecd-b278-4b27-b49e-5aa2c76b25fd", + "target": "^https?://(www\\.)?pcgames\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Matthias Mail\u00e4nder", + "priority": 100, + "lastUpdated": "2021-04-06 11:16:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Peeters.js", + "label": "Peeters", + "translatorID": "c216ae06-da95-4fd0-bce8-38de1f6cf17c", + "target": "^https?://(www\\.)?poj\\.peeters-leuven\\.be/content\\.php", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Timotheus Kim", + "priority": 100, + "lastUpdated": "2018-03-27 05:23:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PEI Archival Information Network.js", + "label": "PEI Archival Information Network", + "translatorID": "6871e8c5-f935-4ba1-8305-0ba563ce3941", + "target": "^https?://www\\.archives\\.pe\\.ca/atom/index\\.php/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-22 15:45:20", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PEP Web.js", + "label": "PEP Web", + "translatorID": "32ad4782-b106-4ccb-8ae1-ff102ba93eef", + "target": "^https?://www\\.pep-web\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Akilesh Ayyar", + "priority": 100, + "lastUpdated": "2015-03-20 06:07:35", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Perceiving Systems.js", + "label": "Perceiving Systems", + "translatorID": "ab077e98-50bd-4fa2-9843-33f28b4b5e2e", + "target": "^https?://ps\\.is\\.tuebingen\\.mpg\\.de/publications", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-09 04:00:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Perlego.js", + "label": "Perlego", + "translatorID": "4fbb8dfd-459d-445e-bd2a-5ea89814b0c0", + "target": "^https?://(www\\.)?perlego\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Brendan O'Connell", + "priority": 100, + "lastUpdated": "2023-04-26 14:52:00", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Philosopher's Imprint.js", + "label": "Philosopher's Imprint", + "translatorID": "b0abb562-218c-4bf6-af66-c320fdb8ddd3", + "target": "^https?://quod\\.lib\\.umich\\.edu/p/phimp", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-09-01 04:27:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PhilPapers.js", + "label": "PhilPapers", + "translatorID": "8df4f61b-0881-4c85-9186-05f457edb4d3", + "target": "^https?://phil(papers|archive)\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-08-19 15:22:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PKP Catalog Systems.js", + "label": "PKP Catalog Systems", + "translatorID": "99b62ba4-065c-4e83-a5c0-d8cc0c75d388", + "target": "/(article|preprint|issue)/view/|/catalog/book/|/search/search|/index\\.php/default", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius and Abe Jellinek", + "priority": 200, + "lastUpdated": "2024-03-21 19:10:24", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Pleade.js", + "label": "Pleade", + "translatorID": "ce68b0ed-3137-4e38-b691-f3bc49bc1497", + "target": "(list-results|results|ead)\\.html\\?.*(base=ead|mode=|id=)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "DIA Modou", + "priority": 100, + "lastUpdated": "2015-01-30 15:32:05", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PLoS Journals.js", + "label": "PLoS Journals", + "translatorID": "9575e804-219e-4cd6-813d-9b690cbfc0fc", + "target": "^https?://(www\\.plos(one|ntds|compbiol|pathogens|genetics|medicine|biology)\\.org|journals\\.plos\\.org(/\\w+)?)/(search|\\w+/article)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz, Rintze Zelle, and Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-01-22 19:28:36", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Polygon.js", + "label": "Polygon", + "translatorID": "fa7c37b1-fda4-418a-a8b8-2491929411ab", + "target": "^https?://(www\\.)?(polygon|heroesneverdie|riftherald|theflyingcourier)\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2021-05-26 20:04:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Potsdamer Neueste Nachrichten.js", + "label": "Potsdamer Neueste Nachrichten", + "translatorID": "9405db4b-be7f-42ab-86ca-430226be9b35", + "target": "^https?://www\\.pnn\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff", + "priority": 100, + "lastUpdated": "2014-04-06 16:15:15", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PRC History Review.js", + "label": "PRC History Review", + "translatorID": "56854750-868a-4de0-bfe5-fe075344a121", + "target": "^https?://(www\\.)?prchistory\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bo An", + "priority": 100, + "lastUpdated": "2021-12-30 18:33:59", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Premium Times.js", + "label": "Premium Times", + "translatorID": "59c1a13f-79ec-463e-bb07-a3e74926d211", + "target": "^https?://(www\\.)?premiumtimesng\\.com/", + "translatorType": 4, + "creator": "VWF", + "priority": 100, + "lastUpdated": "2025-08-12 17:42:24", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Preprints.org.js", + "label": "Preprints.org", + "translatorID": "88473358-39ab-4d08-9873-1ad72cc626c7", + "target": "^https://www\\.preprints\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2023-08-23 07:21:42", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Prime 9ja Online.js", + "label": "Prime 9ja Online", + "translatorID": "eb0bbbf8-7f57-40fa-aec2-45480d396e93", + "target": "^https?://(www\\.|pidgin\\.)?prime9ja\\.com\\.ng/", + "translatorType": 4, + "creator": "VWF", + "priority": 100, + "lastUpdated": "2025-10-17 16:00:00", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Primo 2018.js", + "label": "Primo 2018", + "translatorID": "cd669d1f-96b8-4040-aa36-48f843248399", + "target": "(/primo-explore/|/(discovery|nde)/(search|fulldisplay|jsearch|dbsearch|npsearch|openurl|jfulldisplay|dbfulldisplay|npfulldisplay|collectionDiscovery)\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-05-20 15:10:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Primo Normalized XML.js", + "label": "Primo Normalized XML", + "translatorID": "efd737c9-a227-4113-866e-d57fbc0684ca", + "target": "xml", + "translatorType": 1, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2026-01-16 14:30:48", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Primo.js", + "label": "Primo", + "translatorID": "1300cd65-d23a-4bbf-93e5-a3c9e00d1066", + "target": "/primo_library/|/nebis/|^https?://www\\.recherche-portal\\.ch/zbz/", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Matt Burton, Avram Lyon, Etienne Cavali\u00e9, Rintze Zelle, Philipp Zumstein, Sebastian Karcher, Aurimas Vinckevicius", + "priority": 101, + "lastUpdated": "2020-02-04 01:29:32", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Probing the Past.js", + "label": "Probing the Past", + "translatorID": "095239e7-c18c-4f45-a932-bcf4a9e48c08", + "target": "^https?://chnm\\.gmu\\.edu/probateinventory/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-01-28 20:46:55", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Project Gutenberg.js", + "label": "Project Gutenberg", + "translatorID": "d770e7d2-106c-4396-8c32-b35cdc46376c", + "target": "^https?://www\\.gutenberg\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble, Avram Lyon", + "priority": 100, + "lastUpdated": "2014-04-03 18:55:01", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Project MUSE.js", + "label": "Project MUSE", + "translatorID": "c54d1932-73ce-dfd4-a943-109380e06574", + "target": "^https?://[^/]*muse\\.jhu\\.edu/(book/|pub/|article/|issue/|search\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-12-08 13:34:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ProMED.js", + "label": "ProMED", + "translatorID": "3e9dbe21-10f2-40be-a921-f6ec82760927", + "target": "^https?://www\\.promedmail\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Brandon Minich", + "priority": 100, + "lastUpdated": "2013-11-19 00:12:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ProQuest Ebook Central.js", + "label": "ProQuest Ebook Central", + "translatorID": "f2d965fa-5acb-4ba7-90a4-8ecb6cf0c795", + "target": "^https?://ebookcentral\\.proquest\\.com/(ebc/)?lib/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-07-03 17:15:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ProQuest.js", + "label": "ProQuest", + "translatorID": "fce388a6-a847-4777-87fb-6595e710b7e7", + "target": "^https?://(www|search)\\.proquest\\.com/(.*/)?(docview|pagepdf|results|publicationissue|browseterms|browsetitles|browseresults|myresearch/(figtables|documents))", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon", + "priority": 100, + "lastUpdated": "2025-07-31 17:15:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Protein Data Bank.js", + "label": "Protein Data Bank", + "translatorID": "e16095ae-986c-4117-9cb6-20f3b7a52f64", + "target": "^https?://www\\.(pdb|rcsb)\\.org/pdb/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-06-03 18:51:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PubFactory Journals.js", + "label": "PubFactory Journals", + "translatorID": "8d1fb775-df6d-4069-8830-1dfe8e8387dd", + "target": "^https://([^/]+/view/journals/.+\\.xml|[^.]*journals\\.[^/]+/search)\\b", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Brendan O'Connell", + "priority": 200, + "lastUpdated": "2024-06-13 17:11:59", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Public Record Office Victoria.js", + "label": "Public Record Office Victoria", + "translatorID": "99592877-f698-4e14-b541-b6181f6c577f", + "target": "^https?://prov\\.vic\\.gov\\.au/(archive|search_journey)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Sherratt (tim@timsherratt.au)", + "priority": 100, + "lastUpdated": "2024-08-21 01:51:41", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Publications du Quebec.js", + "label": "Publications du Qu\u00e9bec", + "translatorID": "22d0bede-8db5-4656-9b9a-7d682ec1335d", + "target": "^https?://(www\\.)?legisquebec\\.gouv\\.qc\\.ca/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Marc Lajoie", + "priority": 100, + "lastUpdated": "2017-06-03 15:38:52", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Publications Office of the European Union.js", + "label": "Publications Office of the European Union", + "translatorID": "7d8e6337-3f52-4e8c-8915-95a2ec755b6c", + "target": "^https?://op\\.europa\\.eu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-03-08 17:58:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PubMed Central.js", + "label": "PubMed Central", + "translatorID": "27ee5b2c-2a5a-4afc-a0aa-d386642d4eed", + "target": "^https://(www\\.)?(pmc\\.ncbi\\.nlm\\.nih\\.gov/|ncbi\\.nlm\\.nih\\.gov/pmc)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz and Rintze Zelle", + "priority": 100, + "lastUpdated": "2025-11-06 20:33:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PubMed XML.js", + "label": "PubMed XML", + "translatorID": "fcf41bed-0cbc-3704-85c7-8062a0068a7a", + "target": "xml", + "translatorType": 1, + "creator": "Simon Kornblith, Michael Berkowitz, Avram Lyon, and Rintze Zelle", + "priority": 100, + "lastUpdated": "2026-01-22 17:48:12", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/PubMed.js", + "label": "PubMed", + "translatorID": "3d0231ce-fd4b-478c-b1d3-840389e5b68c", + "target": "^https?://([^/]+\\.)?(www|preview)\\.ncbi\\.nlm\\.nih\\.gov[^/]*/(m/)?(books|pubmed|labs/pubmed|myncbi|sites/pubmed|sites/entrez|entrez/query\\.fcgi\\?.*db=PubMed|myncbi/browse/collection/?|myncbi/collections/)|^https?://pubmed\\.ncbi\\.nlm\\.nih\\.gov/(\\d|\\?|searches/|clipboard|collections/)", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2023-01-10 14:01:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PubPub.js", + "label": "PubPub", + "translatorID": "25f28dc9-901f-4920-8b9a-5baefad91493", + "target": "/pub/[^/]+/release/\\d+|^https?://[^/]+\\.pubpub\\.org/search\\?", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 270, + "lastUpdated": "2021-09-14 20:35:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/PyPI.js", + "label": "PyPI", + "translatorID": "94a8328a-ec87-4ba0-82b6-cf3000ea1dee", + "target": "^https?://pypi\\.org/(project|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2018-11-03 08:21:27", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Qatar Digital Library.js", + "label": "Qatar Digital Library", + "translatorID": "f8c30c62-89a3-45d6-9c48-16c48ad6ba3c", + "target": "^https?://(www\\.)?qdl\\.qa/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-08 23:32:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Queensland State Archives.js", + "label": "Queensland State Archives", + "translatorID": "214505fc-fa92-4b35-b323-5f12a4b157cb", + "target": "^https?://www\\.archivessearch\\.qld\\.gov\\.au/(items|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Sherratt (tim@timsherratt.au)", + "priority": 100, + "lastUpdated": "2024-08-28 06:00:51", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/R-Packages.js", + "label": "R-Packages", + "translatorID": "24a10ebf-ada1-4b8d-8f76-5a29e24d3e78", + "target": "(cran\\..+|cloud\\.r-project\\.org|/CRAN)/web/packages/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 150, + "lastUpdated": "2021-06-11 17:26:25", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Radio Free Europe Radio Liberty.js", + "label": "Radio Free Europe / Radio Liberty", + "translatorID": "b1c90b99-2e1a-4374-a03b-92e45f1afc55", + "target": "^https?://((www|gandhara)\\.rferl\\.org/|www\\.azatliq\\.org/|www\\.azattyq\\.org/|rus\\.azattyq\\.org/|da\\.azadiradio\\.com/|pa\\.azadiradio\\.com/|www\\.azattyk\\.org/|www\\.ozodi\\.org/|www\\.ozodlik\\.org/|www\\.evropaelire\\.org/|www\\.slobodnaevropa\\.org/|www\\.makdenes\\.org/|www\\.iraqhurr\\.org/|www\\.radiofarda\\.com/|www\\.azatutyun\\.am/|www\\.azadliq\\.org/|www\\.svaboda\\.org/|www\\.svoboda\\.org/|www\\.tavisupleba\\.org/|www\\.azathabar\\.com/|www\\.svobodanews\\.ru/|(romania|moldova)\\.europalibera\\.org/|www\\.radiosvoboda\\.org/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-09-02 00:12:35", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/RAND.js", + "label": "RAND", + "translatorID": "4a49257a-035f-4b8b-ba26-6ddfe3b9008d", + "target": "^https://www\\.rand\\.org/(pubs/|search\\.html)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-10 16:23:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/RDF.js", + "label": "RDF", + "translatorID": "5e3ad958-ac79-463d-812b-a86a9235c28f", + "target": "rdf", + "translatorType": 1, + "creator": "Simon Kornblith", + "priority": 100, + "lastUpdated": "2026-03-06 21:44:09", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Rechtspraak.nl.js", + "label": "Rechtspraak.nl", + "translatorID": "aede3fda-1894-4dfc-8bca-1c3463f11076", + "target": "^https?://(uitspraken\\.rechtspraak|linkeddata\\.overheid)\\.nl/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Pieter van der Wees", + "priority": 100, + "lastUpdated": "2024-01-09 03:25:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/REDALYC.js", + "label": "REDALYC", + "translatorID": "d1ac3b4f-1aa7-4a76-a97e-cf3580a41c37", + "target": "^https?://(www\\.)?redalyc\\.(uaemex\\.mx|org)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-12-23 04:12:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/reddit.js", + "label": "reddit", + "translatorID": "23bacc11-98e3-4b78-b1ef-cc2c9a04b893", + "target": "^https?://[^/]+\\.reddit\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Lukas Kawerau", + "priority": 100, + "lastUpdated": "2025-05-01 14:44:26", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ReferBibIX.js", + "label": "Refer/BibIX", + "translatorID": "881f60f2-0802-411a-9228-ce5f47b64c7d", + "target": "txt", + "translatorType": 3, + "creator": "Simon Kornblith", + "priority": 100, + "lastUpdated": "2023-10-27 09:03:42", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/RefWorks Tagged.js", + "label": "RefWorks Tagged", + "translatorID": "1a3506da-a303-4b0a-a1cd-f216e6138d86", + "target": "txt", + "browserSupport": "gcsv", + "translatorType": 3, + "creator": "Simon Kornblith, Aurimas Vinckevicius, and Sebastian Karcher", + "priority": 100, + "lastUpdated": "2016-06-21 08:45:20", + "minVersion": "3.0.4", + "maxVersion": "" + }, + { + "path": "translators/zotero/RePEc - Econpapers.js", + "label": "RePEc - Econpapers", + "translatorID": "411f9a8b-64f3-4465-b7df-a3c988b602f3", + "target": "^https?://econpapers\\.repec\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-04-29 03:02:00", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/RePEc - IDEAS.js", + "label": "RePEc - IDEAS", + "translatorID": "bd2e6136-d8e5-4f76-906b-0fbcd888dd63", + "target": "^https?://ideas\\.repec\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-06-05 07:38:26", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Research Square.js", + "label": "Research Square", + "translatorID": "f8f24699-a23f-4355-8d03-4f03a1112ec4", + "target": "^https?://www\\.researchsquare\\.com/(article|browse)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-04-01 19:07:11", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ResearchGate.js", + "label": "ResearchGate", + "translatorID": "89ae6297-c0c4-45f7-943d-5174cf06339c", + "target": "^https?://www\\.researchgate\\.net/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2020-10-18 04:03:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Retsinformation.js", + "label": "Retsinformation", + "translatorID": "feef66bf-4b52-498f-a586-8e9a99dc07a0", + "target": "^https?://(www\\.)?retsinformation\\.dk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Roald Fr\u00f8sig and Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-01-15 18:52:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Reuters.js", + "label": "Reuters", + "translatorID": "83979786-44af-494a-9ddb-46654e0486ef", + "target": "^https?://\\w+\\.reuters\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon, Michael Berkowitz, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-07-05 16:50:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/RIS.js", + "label": "RIS", + "translatorID": "32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7", + "target": "ris", + "translatorType": 3, + "creator": "Simon Kornblith and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2026-01-05 18:52:35", + "minVersion": "3.0.4", + "maxVersion": "" + }, + { + "path": "translators/zotero/Rock, Paper, Shotgun.js", + "label": "Rock, Paper, Shotgun", + "translatorID": "5a5b1fcd-8491-4c56-84a7-5dba19fe2c02", + "target": "^https?://(www\\.)?rockpapershotgun\\.(com|de)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar, Bao Trinh", + "priority": 100, + "lastUpdated": "2021-08-15 21:00:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Roll Call.js", + "label": "Roll Call", + "translatorID": "d522149f-b776-413f-8aa4-ced13f59c759", + "target": "^https?://(www\\.|blogs\\.)?rollcall\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-06-04 17:53:19", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/RSC Publishing.js", + "label": "RSC Publishing", + "translatorID": "ca0e7488-ef20-4485-8499-9c47e60dcfa7", + "target": "^https?://(:?www\\.|google\\.)?pubs\\.rsc\\.org/", + "browserSupport": "gcsb", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-06-22 14:44:14", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Russian State Library.js", + "label": "Russian State Library", + "translatorID": "26ce1cb2-07ec-4d0e-9975-ce2ab35c8343", + "target": "^https?://(search|favorites|aleph)\\.rsl\\.ru/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "PChemGuy", + "priority": 100, + "lastUpdated": "2025-05-01 14:50:41", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Sacramento Bee.js", + "label": "Sacramento Bee", + "translatorID": "82b534ea-abf0-4527-9d5d-48cd98a89ba5", + "target": "^https?://(www\\.)?sacbee\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2017-07-09 05:05:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SAE Papers.js", + "label": "SAE Papers", + "translatorID": "2c98b8e6-6138-4b60-a999-15e3a7c8cb4b", + "target": "^https?://(www|papers)\\.sae\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-07-07 05:40:25", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Safari Books Online.js", + "label": "Safari Books Online", + "translatorID": "ec491fc2-10b1-11e3-99d7-1bd4dc830245", + "target": "^https?://([^/]+\\.)?safaribooksonline\\.[a-zA-Z]+/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Jeffrey Jones", + "priority": 150, + "lastUpdated": "2017-06-24 09:40:05", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SAGE Journals.js", + "label": "SAGE Journals", + "translatorID": "908c1ca2-59b6-4ad8-b026-709b7b927bda", + "target": "^https?://journals\\.sagepub\\.com(/doi/((abs|full|pdf)/)?10\\.|/action/doSearch\\?|/toc/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2026-02-24 16:20:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SAGE Knowledge.js", + "label": "SAGE Knowledge", + "translatorID": "d21dcd90-c997-4e14-8fe0-353b8e19a47a", + "target": "^https?://sk\\.sagepub\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "ProQuest, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2022-11-11 14:54:48", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SAILDART.js", + "label": "SAILDART", + "translatorID": "78c29166-3326-4660-92e7-eb1fb1aacda0", + "target": "^https?://(www\\.)?saildart\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-26 17:34:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SALT Research Archives.js", + "label": "SALT Research Archives", + "translatorID": "954ac3a8-73ab-43e3-88db-9949817ed1e6", + "target": "^https?://archives\\.saltresearch\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-13 22:05:16", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/sbn.it.js", + "label": "sbn.it", + "translatorID": "4c272290-7ac4-433e-862d-244884ed285a", + "target": "^https?://(www|opac)\\.sbn\\.it/opacsbn/opaclib", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-12-27 16:51:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Scholars Portal Journals.js", + "label": "Scholars Portal Journals", + "translatorID": "5ac0fd37-5578-4f82-8340-0e135b6336ee", + "target": "^https?://journals\\.scholarsportal\\.info/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bartek Kawula", + "priority": 100, + "lastUpdated": "2021-02-05 18:25:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Scholia.js", + "label": "Scholia", + "translatorID": "877acbe4-5d71-4de6-8dd7-367a2dcc4c0d", + "target": "^https?://scholia\\.toolforge\\.org/work/Q", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-29 16:59:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Schweizer Radio und Fernsehen SRF.js", + "label": "Schweizer Radio und Fernsehen SRF", + "translatorID": "a8e51f4e-0372-42ad-81a8-bc3dcea6dc03", + "target": "^https?://(www\\.)?srf\\.ch/sendungen/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "ibex, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-06-24 22:06:07", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SciELO.js", + "label": "SciELO", + "translatorID": "3eabecf9-663a-4774-a3e6-0790d2732eed", + "target": "^https?://(www\\.)?(socialscience\\.|proceedings\\.|biodiversidade\\.|caribbean\\.|comciencia\\.|inovacao\\.|search\\.)?(scielo|scielosp)\\.", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-12-06 18:29:19", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/ScienceDirect.js", + "label": "ScienceDirect", + "translatorID": "b6d0a7a-d076-48ae-b2f0-b6de28b194e", + "target": "^https?://[^/]*science-?direct\\.com[^/]*/((science/)?(article/|(journal|bookseries|book|handbook)/\\d)|search[?/]|journal/[^/]+/vol)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2025-12-02 18:01:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/scinapse.js", + "label": "scinapse", + "translatorID": "42680c5e-1ae8-4171-ab53-afe1d8e840d4", + "target": "^https?://(www\\.)?scinapse\\.io/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Vincent Carret", + "priority": 100, + "lastUpdated": "2021-06-14 21:01:40", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Scopus.js", + "label": "Scopus", + "translatorID": "a14ac3eb-64a0-4179-970c-92ecc2fec992", + "target": "^https?://www\\.scopus\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz, Rintze Zelle and Avram Lyon", + "priority": 100, + "lastUpdated": "2025-07-29 16:11:13", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Semantic Scholar.js", + "label": "Semantic Scholar", + "translatorID": "276cb34c-6861-4de7-a11d-c2e46fb8af28", + "target": "^https?://(www\\.semanticscholar\\.org/(paper/.+|search\\?|reader/.+)|pdfs\\.semanticscholar\\.org/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Guy Aglionby", + "priority": 100, + "lastUpdated": "2022-11-18 01:12:22", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/semantics Visual Library.js", + "label": "semantics Visual Library", + "translatorID": "fe85e97b-5e2a-4d9e-976e-c336c5350ce9", + "target": "^https?://www\\.(blldb-online\\.de/blldb|bdsl-online\\.de/BDSL-DB)/suche/", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 150, + "lastUpdated": "2014-12-29 11:56:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SFU IPinCH.js", + "label": "SFU IPinCH", + "translatorID": "7448d1d7-57e4-4685-b6e4-d4d9f7046fc2", + "target": "^https?://[^/]*sfu\\.ca/kbipinch/(records|browse|search)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2013-06-19 10:30:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Silverchair.js", + "label": "Silverchair", + "translatorID": "3bae3a55-f021-4b59-8a14-43701f336adf", + "target": "/(article|fullarticle|advance-article|advance-article-abstract|article-abstract|book|edited-volume)(/|\\.aspx)|search-results?|\\/issue(/|s\\.aspx|$)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 280, + "lastUpdated": "2025-07-29 16:31:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SIPRI.js", + "label": "SIPRI", + "translatorID": "3a92a47b-a532-40b8-8e69-c40b4edf56ec", + "target": "^https?://(www\\.)?sipri\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-16 23:05:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SIRS Knowledge Source.js", + "label": "SIRS Knowledge Source", + "translatorID": "d4cccbd1-a92f-4dd8-b636-74eb9e344441", + "target": "^https?://([^/]+\\.)?sks\\.sirs\\.com/", + "browserSupport": "gcsib", + "translatorType": 4, + "creator": "ProQuest PME Team", + "priority": 100, + "lastUpdated": "2015-02-02 23:47:53", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Slate.js", + "label": "Slate", + "translatorID": "a667ae9e-186f-46d2-b824-d70064614668", + "target": "^https?://slate\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-09-13 21:28:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SlideShare.js", + "label": "SlideShare", + "translatorID": "0cc8e259-106e-4793-8c26-6ec8114a9160", + "target": "^https?://[^/]*slideshare\\.net/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2017-01-01 15:33:29", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SLUB Dresden.js", + "label": "SLUB Dresden", + "translatorID": "eda36b1d-2395-432d-9780-0e7d2e6cf0de", + "target": "^https://katalog\\.slub-dresden\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-29 00:22:54", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SORA.js", + "label": "SORA", + "translatorID": "83d2ed27-40a5-4dc7-bd87-baddc8fb35da", + "target": "^https?://sora\\.unm\\.edu/(node/|search/node/|advancedsearch\\?)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-06-24 15:08:40", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Springer Link.js", + "label": "Springer Link", + "translatorID": "d6c6210a-297c-4b2c-8c43-48cb503cc49e", + "target": "^https?://link\\.springer\\.com/(search(/page/\\d+)?\\?|(article|chapter|book|referenceworkentry|protocol|journal|referencework)/.+)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2024-07-22 20:08:47", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SSOAR.js", + "label": "SSOAR", + "translatorID": "d2959995-d0a2-4fb7-990f-16b671690e99", + "target": "^https?://www\\.ssoar\\.info/", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-06-15 21:48:00", + "minVersion": "3", + "maxVersion": "" + }, + { + "path": "translators/zotero/SSRN.js", + "label": "SSRN", + "translatorID": "b61c224b-34b6-4bfd-8a76-a476e7092d43", + "target": "^https?://(www|papers|hq)\\.ssrn\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2022-04-04 18:26:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Stack Exchange.js", + "label": "Stack Exchange", + "translatorID": "26ecfee6-535d-4044-89a8-fbda31883642", + "target": "^https://([^/]+\\.)?(((stack(overflow|exchange)|serverfault|askubuntu|superuser|stackapps)\\.com)|mathoverflow\\.net)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-04-03 13:21:00", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Standard Ebooks.js", + "label": "Standard Ebooks", + "translatorID": "cc27d642-eab0-4c85-aba8-7a01a9b4e779", + "target": "^https?://standardebooks\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Brendan O'Connell", + "priority": 100, + "lastUpdated": "2023-02-24 09:12:54", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Stanford Encyclopedia of Philosophy.js", + "label": "Stanford Encyclopedia of Philosophy", + "translatorID": "5aabfa6e-79e6-4791-a9d2-46c9cb137561", + "target": "^https?://plato\\.stanford\\.edu/(archives/[a-z]{3}\\d{4}/)?(entries|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-05-04 15:33:21", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Stanford University Press.js", + "label": "Stanford University Press", + "translatorID": "df9c409a-132e-4c9d-8c24-8e3eeee98bf0", + "target": "^https://www\\.sup\\.org/(books|search)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-01 17:49:50", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/State Records Office of Western Australia.js", + "label": "State Records Office of Western Australia", + "translatorID": "2b62db1e-1d49-4e2b-a409-a3f9f1870a41", + "target": "^https://archive\\.sro\\.wa\\.gov\\.au/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Mike O'Connor", + "priority": 100, + "lastUpdated": "2018-10-09 15:42:45", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Stitcher.js", + "label": "Stitcher", + "translatorID": "406d8800-17b2-498c-8e79-49311caedc5f", + "target": "^https?://(www\\.)?stitcher\\.com/(search|show)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-03-10 04:41:29", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Store norske leksikon.js", + "label": "Store norske leksikon", + "translatorID": "439c869c-c605-47b4-b330-157a23a4b4f3", + "target": "^https?://((sml|nbl|nkl)\\.)?snl\\.no/[^.]", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "H\u00e5kon Malmedal", + "priority": 100, + "lastUpdated": "2017-06-24 20:57:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Stuff.co.nz.js", + "label": "Stuff.co.nz", + "translatorID": "631ff0c7-2e64-4279-a9c9-ad9518d40f2b", + "target": "^https?://(www\\.)?stuff\\.co\\.nz/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sopheak Hean (University of Waikato, Faculty of Education)", + "priority": 100, + "lastUpdated": "2014-08-23 05:56:33", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Substack.js", + "label": "Substack", + "translatorID": "ac3b958f-0581-4117-bebc-44af3b876545", + "target": "^https://([^.]+\\.)?substack\\.com/(p/|archive|home/post/)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-02-03 19:52:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Sud Ouest.js", + "label": "Sud Ouest", + "translatorID": "1f530308-ce67-4b87-a079-e4a8e2a9c623", + "target": "^https?://www\\.sudouest\\.fr/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sylvain Machefert", + "priority": 100, + "lastUpdated": "2021-07-06 17:27:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Sueddeutsche.de.js", + "label": "Sueddeutsche.de", + "translatorID": "2e4ebd19-83ab-4a56-8fa6-bcd52b576470", + "target": "^https?://www\\.sueddeutsche\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff", + "priority": 100, + "lastUpdated": "2017-06-24 21:03:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Summon 2.js", + "label": "Summon 2", + "translatorID": "6c61897b-ca44-4ce6-87c1-2da68b44e6f7", + "target": "^https?://([^/]+\\.)?summon\\.serialssolutions\\.com/", + "browserSupport": "gcsib", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 150, + "lastUpdated": "2021-07-20 21:07:15", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Superlib.js", + "label": "Superlib", + "translatorID": "33553736-4ea9-4b1a-b1e1-d43b2a918156", + "target": "^https?://(book|jour)\\.ucdrs\\.superlib\\.net/(search|views/specific)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "018", + "priority": 100, + "lastUpdated": "2021-08-18 19:44:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Svenska Dagbladet.js", + "label": "Svenska Dagbladet", + "translatorID": "7adba17c-7e98-4a13-8325-e19383b09eab", + "target": "^https://www\\.svd\\.se/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Berlin", + "priority": 100, + "lastUpdated": "2018-08-31 11:59:13", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Sveriges radio.js", + "label": "Sveriges radio", + "translatorID": "caa8f42c-9dbf-446e-963b-6ee18e3133d2", + "target": "^https?://sverigesradio\\.se/(artikel|sok\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Berlin", + "priority": 100, + "lastUpdated": "2021-06-11 19:10:14", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/SVT Nyheter.js", + "label": "SVT Nyheter", + "translatorID": "4c6d887e-341d-4edb-b651-ea702a8918d7", + "target": "^https?://www\\.svt\\.se/nyheter/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Berlin", + "priority": 100, + "lastUpdated": "2024-06-27 15:32:02", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Tagesspiegel.js", + "label": "Tagesspiegel", + "translatorID": "374ac2a5-dd45-461e-bf1f-bf90c2eb7085", + "target": "^https?://www\\.tagesspiegel\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff, Sebastian Karcher, Jaco L\u00fcken", + "priority": 100, + "lastUpdated": "2021-08-18 12:46:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Talis Aspire.js", + "label": "Talis Aspire", + "translatorID": "f16931f0-372e-4197-8927-05d2ba7599d8", + "target": "^https?://([^/]+\\.)?(((my)?reading|resource|lib|cyprus|)lists|aspire\\.surrey|rl\\.talis)\\..+/(lists|items)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 270, + "lastUpdated": "2021-07-08 16:59:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/TalisPrism.js", + "label": "TalisPrism", + "translatorID": "53f8d182-4edc-4eab-b5a1-141698a20202", + "target": "/TalisPrism/(browseResults|doSearch|doOpenURLSearch)", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "William Smith and Emma Reisz", + "priority": 100, + "lastUpdated": "2014-02-27 23:48:15", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/Tatknigafund.js", + "label": "Tatknigafund", + "translatorID": "f909cbda-2fac-4700-965f-6c0783b77eeb", + "target": "^https?://www\\.tatknigafund\\.ru/books/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Avram Lyon", + "priority": 100, + "lastUpdated": "2012-08-06 19:23:07", + "minVersion": "1.0.0b4.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Taylor & Francis eBooks.js", + "label": "Taylor & Francis eBooks", + "translatorID": "71f28f90-764a-42a8-8107-d87252da9b50", + "target": "^https?://(www\\.)?taylorfrancis\\.com/(books|chapters|search)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2024-02-27 13:57:59", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Taylor and Francis+NEJM.js", + "label": "Taylor and Francis+NEJM", + "translatorID": "dac476e4-401d-430a-8571-a97c31c3b65e", + "target": "^https?://(www\\.)?(tandfonline\\.com|nejm\\.org)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-12-03 15:37:21", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/taz.de.js", + "label": "taz.de", + "translatorID": "d84574f1-e4d6-4337-934f-bf9d01173bf0", + "target": "^https?://(www\\.)?taz\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-07-10 16:55:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/TEI.js", + "label": "TEI", + "translatorID": "032ae9b7-ab90-9205-a479-baf81f49184a", + "target": "xml", + "translatorType": 2, + "creator": "Stefan Majewski", + "priority": 25, + "lastUpdated": "2022-09-30 10:56:50", + "minVersion": "4.0.27" + }, + { + "path": "translators/zotero/Tesis Doctorals en Xarxa.js", + "label": "Tesis Doctorals en Xarxa", + "translatorID": "dd2d7c63-0c4b-4da4-b1d8-e72c7445c1e0", + "target": "^https?://(www\\.)?(tdx\\.cat|tesisenred\\.net)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "CSUC", + "priority": 100, + "lastUpdated": "2017-03-11 20:42:11", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Art Newspaper.js", + "label": "The Art Newspaper", + "translatorID": "7ae2681a-185b-4724-8754-f046d96884c8", + "target": "^https?://(www\\.)?theartnewspaper\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2021-08-13 20:38:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Atlantic.js", + "label": "The Atlantic", + "translatorID": "575ba37f-c871-4ee8-8bdb-3e7f954e4e6a", + "target": "^https://www\\.theatlantic\\.com/.+", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2023-09-16 01:54:13", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Boston Globe.js", + "label": "The Boston Globe", + "translatorID": "1f245496-4c1b-406a-8641-d286b3888231", + "target": "^https?://(www|search|articles|archive)\\.boston\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Adam Crymble, Frank Bennett, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2025-05-01 14:47:55", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Chronicle of Higher Education.js", + "label": "The Chronicle of Higher Education", + "translatorID": "1e6d1529-246f-4429-84e2-1f1b180b250d", + "target": "^https?://(www\\.)?chronicle\\.com/", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Simon Kornblith, Avram Lyon", + "priority": 100, + "lastUpdated": "2017-06-30 05:37:23", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Daily Beast.js", + "label": "The Daily Beast", + "translatorID": "3bdaeab1-2200-4e18-a68a-430d1cd50d21", + "target": "^https?://(.*)thedailybeast\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-06-30 06:10:12", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Economic Times - The Times of India.js", + "label": "The Economic Times - The Times of India", + "translatorID": "1a9a7ecf-01e9-4d5d-aa19-a7aa4010da83", + "target": "^https?://(economictimes|timesofindia)\\.indiatimes\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sonali Gupta, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-10-12 19:47:11", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Economist.js", + "label": "The Economist", + "translatorID": "6ec8008d-b206-4a4c-8d0a-8ef33807703b", + "target": "^https?://(www\\.)?economist\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2020-10-31 11:08:32", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Free Dictionary.js", + "label": "The Free Dictionary", + "translatorID": "0c661209-5ec8-402b-8f18-7dec6ae37d95", + "target": "^https?://(.*\\.)?thefreedictionary\\.com/\\w+$", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2017-07-10 15:21:32", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Globe and Mail.js", + "label": "The Globe and Mail", + "translatorID": "e0234bcf-bc56-4577-aa94-fe86a27f6fd6", + "target": "^https?://www\\.theglobeandmail\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sonali Gupta and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-14 21:43:14", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Guardian.js", + "label": "The Guardian", + "translatorID": "8e11559d-60f0-4a7f-bb91-99ac0c5a2d63", + "target": "^https?://(www\\.)?(guardian\\.co\\.uk|theguardian\\.com)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein, Bao Trinh", + "priority": 100, + "lastUpdated": "2021-09-13 21:32:27", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Hamilton Spectator.js", + "label": "The Hamilton Spectator", + "translatorID": "c9338ed5-b512-4967-8ffe-ab9c973559ef", + "target": "^https?://www\\.thespec\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-07-10 15:23:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Hindu.js", + "label": "The Hindu", + "translatorID": "06142d59-fa9c-48c3-982b-6e7c67d3d6b8", + "target": "^https?://www\\.thehindu\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-07-05 10:59:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Independent.js", + "label": "The Independent", + "translatorID": "274f2f78-82d6-40d9-a441-ec3935edc0a9", + "target": "https?://(www\\.)?independent\\.co\\.uk", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Laurence Stevens", + "priority": 100, + "lastUpdated": "2024-03-05 08:09:46", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Intercept.js", + "label": "The Intercept", + "translatorID": "455fe24a-f7e8-4546-81d2-ad4f9aa10487", + "target": "^https?://(www\\.)?theintercept\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2021-06-11 16:49:43", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Met.js", + "label": "The Met", + "translatorID": "72dbad15-cd1a-4d52-b2ed-7d67f909cada", + "target": "^https?://(?:www\\.)?metmuseum\\.org/art/collection", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius, Philipp Zumstein and contributors", + "priority": 100, + "lastUpdated": "2025-11-06 16:00:28", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Microfinance Gateway.js", + "label": "The Microfinance Gateway", + "translatorID": "2cd7d362-5fba-423a-887f-579ed343e751", + "target": "^https?://(www\\.)?microfinancegateway\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-07-10 15:27:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Nation.js", + "label": "The Nation", + "translatorID": "0d6f8450-72e8-4d8f-bdc2-b7fa03e6f2c5", + "target": "^https?://www\\.thenation\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-07-01 20:37:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The National Archives (UK).js", + "label": "The National Archives (UK)", + "translatorID": "229d4678-4fa0-44f8-95c4-f4cfdb9b254c", + "target": "^https?://discovery\\.nationalarchives\\.gov\\.uk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-12 20:12:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The New York Review of Books.js", + "label": "The New York Review of Books", + "translatorID": "4c164cc8-be7b-4d02-bfbf-37a5622dfd56", + "target": "^https?://www\\.nybooks\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2023-08-03 11:23:30", + "minVersion": "6.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The New Yorker.js", + "label": "The New Yorker", + "translatorID": "0fba73bf-f113-4d36-810f-2c654fa985fb", + "target": "^https?://www\\.newyorker\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein and Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-01-20 11:53:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Open Library.js", + "label": "The Open Library", + "translatorID": "96b54986-16c7-45ea-b296-fde962d658b2", + "target": "^https?://openlibrary\\.org", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-05-25 13:52:51", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Straits Times.js", + "label": "The Straits Times", + "translatorID": "2de01dfe-9572-4775-bf7e-6b55c95d60b0", + "target": "^https?:\\/\\/(www.)?straitstimes.com\\/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Robert Sim", + "priority": 100, + "lastUpdated": "2022-01-23 22:08:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Telegraph.js", + "label": "The Telegraph", + "translatorID": "40b9ca22-8df4-4f3b-9cb6-8f9b55486d30", + "target": "^https?://[^/]*telegraph\\.co\\.uk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-10 22:56:17", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Times and Sunday Times.js", + "label": "The Times and Sunday Times", + "translatorID": "53f8d182-4edc-4eab-b5a1-141698a10101", + "target": "^https?://www\\.thetimes\\.co\\.uk/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-10 22:58:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/The Times of Israel.js", + "label": "The Times of Israel", + "translatorID": "bd3fc4f7-e8ed-49b5-a243-f3c3ab514a5e", + "target": "https?://(www\\.)?timesofisrael\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bardi Harborow", + "priority": 100, + "lastUpdated": "2025-05-08 16:30:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/TheMarker.js", + "label": "TheMarker", + "translatorID": "b2d61bb5-5b21-41b7-9c83-1abcbf14639b", + "target": "^https?://www\\.themarker\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Eran Rosenthal", + "priority": 100, + "lastUpdated": "2017-07-03 10:47:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Theory of Computing.js", + "label": "Theory of Computing", + "translatorID": "558babe7-5fca-47ea-af0f-2d9bb5bc5e53", + "target": "^https?://(theoryofcomputing\\.org|toc\\.cse\\.iitk\\.ac\\.in|www\\.cims\\.nyu\\.edu/~regev/toc|toc\\.ilab\\.sztaki\\.hu|toc\\.nada\\.kth\\.se|tocmirror\\.cs\\.tau\\.ac\\.il)/articles/[vg].*(/|html?)$", + "browserSupport": "gcv", + "translatorType": 4, + "creator": "Piyush Srivastava", + "priority": 100, + "lastUpdated": "2019-06-10 22:52:50", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ThesesFR.js", + "label": "ThesesFR", + "translatorID": "3f73f0aa-f91c-4192-b0d5-907312876cb9", + "target": "^https?://(www\\.)?theses\\.fr/([a-z]{2}/)?((s\\d+|\\d{4}.{8}|\\d{8}X|\\d{9})(?!\\.(rdf|xml)$)|resultats)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "TFU, Mathis EON", + "priority": 100, + "lastUpdated": "2025-09-11 15:43:56", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Thieme.js", + "label": "Thieme", + "translatorID": "abb72b5b-f807-4ff5-a324-ae1afea8a95a", + "target": "^https?://(www\\.)?thieme-connect\\.com/products/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-10 22:59:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Time.com.js", + "label": "Time.com", + "translatorID": "d9be934c-edb9-490c-a88d-34e2ee106cd7", + "target": "^https?://([^/]*\\.)?time\\.com/", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Michael Berkowitz", + "priority": 100, + "lastUpdated": "2019-10-06 18:12:01", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/TimesMachine.js", + "label": "TimesMachine", + "translatorID": "86c3832a-ccc6-40ab-b5e9-83892423df11", + "target": "^https?://timesmachine\\.nytimes\\.com/timesmachine/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek, Sebastian Karcher", + "priority": 100, + "lastUpdated": "2024-03-26 18:04:55", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Tony Blair Institute for Global Change.js", + "label": "Tony Blair Institute for Global Change", + "translatorID": "0b79daa9-96c3-4c75-9e5b-359d02e8f07d", + "target": "^https://institute\\.global/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-08-02 22:24:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Toronto Star.js", + "label": "Toronto Star", + "translatorID": "6b0b11a6-9b77-4b49-b768-6b715792aa37", + "target": "^https?://www\\.thestar\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein, Bao Trinh", + "priority": 100, + "lastUpdated": "2025-10-07 15:39:05", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Transportation Research Board.js", + "label": "Transportation Research Board", + "translatorID": "a1a5a46b-62e1-49ef-8874-ca07ada35c3a", + "target": "^https?://(www|trid)\\.trb\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-12-12 20:11:41", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Treesearch.js", + "label": "Treesearch", + "translatorID": "4ee9dc8f-66d3-4c18-984b-6335408a24af", + "target": "^https?://([^/]+\\.)?treesearch\\.fs\\.fed\\.us/(pubs/\\d+$|search\\.php)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2021-06-07 23:05:56", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Trove.js", + "label": "Trove", + "translatorID": "8efcb7cb-4180-4555-969a-08e8b34066c4", + "target": "^https?://trove\\.nla\\.gov\\.au/(?:newspaper|gazette|work|book|article|picture|music|map|collection|search)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Sherratt and Abe Jellinek", + "priority": 100, + "lastUpdated": "2025-01-27 20:40:35", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Tumblr.js", + "label": "Tumblr", + "translatorID": "552cdac3-f130-4763-a88e-8e74b92dcb1b", + "target": "^https?://[^/]+\\.tumblr\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "febrezo", + "priority": 100, + "lastUpdated": "2021-06-01 23:04:10", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/TV by the Numbers.js", + "label": "TV by the Numbers", + "translatorID": "180a62bf-efdd-4d38-8d85-8971af04dd85", + "target": "^https?://tvbythenumbers\\.zap2it\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sonali Gupta", + "priority": 100, + "lastUpdated": "2019-04-07 20:02:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/TVNZ.js", + "label": "TVNZ", + "translatorID": "649c2836-a94d-4bbe-8e28-6771f283702f", + "target": "^https?://(www\\.)?tvnz\\.co\\.nz/one-news/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-04-07 18:10:37", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Twitter.js", + "label": "Twitter", + "translatorID": "31659710-d04e-45d0-84ba-8e3f5afc4a54", + "target": "^https?://([^/]+\\.)?(twitter|x)\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bo An, Dan Stillman", + "priority": 100, + "lastUpdated": "2024-05-24 17:08:12", + "minVersion": "4.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ubiquity Journals.js", + "label": "Ubiquity Journals", + "translatorID": "5c11e3bd-caf5-4da6-95d8-e67c57929098", + "target": "^https?://[^/]+(/articles/10\\.\\d{4,9}/[-._;()/:a-z0-9A-Z]+|/articles/?$|/\\d+/volume/\\d+/issue/\\d+)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 250, + "lastUpdated": "2021-07-12 18:01:40", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/UChicago VuFind.js", + "label": "UChicago VuFind", + "translatorID": "f9052879-ab4c-4056-84b4-e963dd98cb5d", + "target": "^https?://([^/]+\\.)?lib\\.uchicago\\.edu/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Matt Teichman", + "priority": 100, + "lastUpdated": "2022-08-17 20:16:09", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/unAPI.js", + "label": "unAPI", + "translatorID": "e7e01cac-1e37-4da6-b078-a0e8343b0e98", + "target": "", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Simon Kornblith", + "priority": 300, + "lastUpdated": "2019-06-10 23:11:21", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/University of California Press Books.js", + "label": "University of California Press Books", + "translatorID": "f27b5031-01fb-4f14-8829-6748f819eac4", + "target": "^https://www\\.ucpress\\.edu/(book/|search\\.php\\?)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-29 06:45:51", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/University of Chicago Press Books.js", + "label": "University of Chicago Press Books", + "translatorID": "2f22b2a9-91c4-4555-8480-792b6551a381", + "target": "^https?://(www\\.)?press\\.uchicago\\.edu/(ucp/books/|press/search.html)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-12-07 08:14:56", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/University of Wisconsin-Madison Libraries Catalog.js", + "label": "University of Wisconsin-Madison Libraries Catalog", + "translatorID": "66782e6a-a8db-4ed2-9a4f-ce4b30372e22", + "target": "^https://search\\.library\\.wisc\\.edu/(catalog|search)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2022-05-31 01:20:34", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/University Press Scholarship.js", + "label": "University Press Scholarship", + "translatorID": "f098a2db-6bfc-49ef-a6d7-9fc84f3c868c", + "target": "^https?://[^/]+\\.universitypressscholarship\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-06 21:55:30", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Unqualified Dublin Core RDF.js", + "label": "Unqualified Dublin Core RDF", + "translatorID": "6e372642-ed9d-4934-b5d1-c11ac758ebb7", + "target": "rdf", + "translatorType": 2, + "creator": "Simon Kornblith", + "priority": 100, + "lastUpdated": "2019-06-11 13:33:25", + "minVersion": "1.0.0b3.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/UNZ Print Archive.js", + "label": "UNZ Print Archive", + "translatorID": "0754db60-3ad1-49e0-8e3f-f4e1210c756c", + "target": "^https?://(www\\.)?unz\\.com/print", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2021-07-23 03:39:49", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/UPCommons.js", + "label": "UPCommons", + "translatorID": "0abd577b-ec45-4e9f-9081-448737e2fd34", + "target": "^https?://upcommons\\.upc\\.edu", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-11 13:35:57", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/UpToDate References.js", + "label": "UpToDate References", + "translatorID": "70dc2609-d6fd-415a-822c-a2c04293cb5a", + "target": "^https?://www\\.uptodate\\.com/contents/", + "browserSupport": "gcv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2019-06-11 13:44:39", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/US National Archives Research Catalog.js", + "label": "US National Archives Research Catalog", + "translatorID": "f8b5501a-1acc-4ffa-a0a5-594add5e6bd3", + "target": "^https?://catalog\\.archives\\.gov/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-03-20 15:44:13", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/USENIX.js", + "label": "USENIX", + "translatorID": "b97462fa-f20b-4a1e-8a73-3a434a81518b", + "target": "^https://www\\.usenix\\.org/conference/.*/presentation", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Tim Leonhard Storm", + "priority": 100, + "lastUpdated": "2025-07-29 16:45:18", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Vanity Fair.js", + "label": "Vanity Fair", + "translatorID": "62f46e1a-4c40-4dbb-82aa-71cdeb14f1bc", + "target": "^https?://www\\.vanityfair\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2021-08-13 22:24:07", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Verniana-Jules Verne Studies.js", + "label": "Verniana-Jules Verne Studies", + "translatorID": "cdf8269c-86b9-4039-9bc4-9d998c67740e", + "target": "^https?://[^/]*verniana\\.org(:\\d+)?/volumes/\\d+/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius, Emiliano Heyns", + "priority": 100, + "lastUpdated": "2019-06-17 13:39:01", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Verso Books.js", + "label": "Verso Books", + "translatorID": "bc517bd2-4835-4621-b775-917253bec93a", + "target": "^https?://(www\\.)?versobooks\\.com/books/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Bo An", + "priority": 100, + "lastUpdated": "2021-06-30 18:30:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Vice.js", + "label": "Vice", + "translatorID": "131310dc-854c-4629-acad-521319ab9f19", + "target": "^https?://(.+?\\.)?vice\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2022-01-03 23:13:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Victoria & Albert Museum.js", + "label": "Victoria & Albert Museum", + "translatorID": "56fc13bf-411f-4409-9a61-3d334d76763b", + "target": "^https?://collections\\.vam\\.ac\\.uk", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Richard Palmer - V&A Digital Media & Publishing", + "priority": 100, + "lastUpdated": "2022-04-29 19:15:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Vimeo.js", + "label": "Vimeo", + "translatorID": "1b0ffe71-1c2f-4a79-b894-40b990b3e491", + "target": "^https?://(www\\.)?vimeo\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2019-06-11 13:37:31", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/VoxEU.js", + "label": "VoxEU", + "translatorID": "508e8fb9-8a33-4095-844f-133cba7e7b54", + "target": "^https?://(www\\.)?voxeu\\.org", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2019-06-12 14:39:41", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wall Street Journal.js", + "label": "Wall Street Journal", + "translatorID": "53f8d182-4edc-4eab-b5a1-141698a1303b", + "target": "^https?://(online|blogs|www)?\\.wsj\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-10-07 13:31:42", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wanfang Data.js", + "label": "Wanfang Data", + "translatorID": "eb876bd2-644c-458e-8d05-bf54b10176f3", + "target": "^https?://[ds]\\.(g\\.)?wanfangdata\\.com\\.cn", + "browserSupport": "gcs", + "translatorType": 4, + "creator": "Ace Strong ", + "priority": 100, + "lastUpdated": "2019-06-10 22:46:01", + "minVersion": "2.0rc1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Washington Monthly.js", + "label": "Washington Monthly", + "translatorID": "e623eec7-ad54-4201-b709-654bf3fd7f70", + "target": "^https?://(www\\.)?washingtonmonthly\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-10 22:51:06", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Washington Post.js", + "label": "Washington Post", + "translatorID": "d1bf1c29-4432-4ada-8893-2e29fc88fd9e", + "target": "^https?://www\\.washingtonpost\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2025-01-27 20:23:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Web of Science Nextgen.js", + "label": "Web of Science Nextgen", + "translatorID": "4a3820a3-a7bd-44a1-8711-acf7b57d2c37", + "target": "^https://(www\\.webofscience\\.com|webofscience\\.clarivate\\.cn)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2026-01-05 17:45:40", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Web of Science Tagged.js", + "label": "Web of Science Tagged", + "translatorID": "594ebe3c-90a0-4830-83bc-9502825a6810", + "target": "txt", + "translatorType": 1, + "creator": "Michael Berkowitz, Avram Lyon, and contributors", + "priority": 100, + "lastUpdated": "2025-08-18 17:06:42", + "minVersion": "2.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Web of Science.js", + "label": "Web of Science", + "translatorID": "88e11bcb-464d-4b6d-a446-8994e3b865c9", + "target": "^https?://([^/]+\\.)?webofknowledge\\.com/", + "browserSupport": "gcsib", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2015-06-04 04:20:22", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Welt Online.js", + "label": "Welt Online", + "translatorID": "f61beec2-1431-4218-a9d3-68063ede6ecd", + "target": "^https?://www\\.welt\\.de", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Martin Meyerhoff, Philipp Zumstein", + "priority": 100, + "lastUpdated": "2019-06-11 13:27:17", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/WestLaw UK.js", + "label": "WestLaw UK", + "translatorID": "e6d9cf77-53e4-47f5-98ae-a69eba6d985f", + "target": "^https://uk\\.westlaw\\.com/Document/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "George Gebbett", + "priority": 100, + "lastUpdated": "2022-02-13 15:15:03", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/WHO.js", + "label": "WHO", + "translatorID": "cd587058-6125-4b33-a876-8c6aae48b5e8", + "target": "^https?://apps\\.who\\.int/iris/", + "browserSupport": "gcsibv", + "translatorType": 12, + "creator": "Mario Trojan, Philipp Zumstein, and Abe Jellinek", + "priority": 96, + "lastUpdated": "2022-12-06 12:21:28", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wikidata QuickStatements.js", + "label": "Wikidata QuickStatements", + "translatorID": "51e5355d-9974-484f-80b9-f84d2b55782e", + "target": "txt", + "translatorType": 2, + "creator": "Philipp Zumstein with contributors", + "priority": 100, + "lastUpdated": "2025-08-11 00:00:00", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wikidata.js", + "label": "Wikidata", + "translatorID": "eaef8d43-2f17-45b3-a5cb-affb49bc5e81", + "target": "^https?://(www\\.)?wikidata\\.org/wiki/Q", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2023-08-19 09:56:11", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/WikiLeaks PlusD.js", + "label": "WikiLeaks PlusD", + "translatorID": "8b73dd9c-b873-4d13-b36a-45922b9f04a1", + "target": "^https?://(search\\.|www\\.)?wikileaks\\.org/plusd/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-06-17 20:49:34", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wikipedia Citation Templates.js", + "label": "Wikipedia Citation Templates", + "translatorID": "3f50aaac-7acc-4350-acd0-59cb77faf620", + "target": "txt", + "translatorType": 2, + "creator": "Simon Kornblith", + "priority": 100, + "lastUpdated": "2023-11-05 21:29:00", + "minVersion": "1.0.0b4.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wikipedia.js", + "label": "Wikipedia", + "translatorID": "e5dc9733-f8fc-4c00-8c40-e53e0bb14664", + "target": "^https?://[^/]*wikipedia\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2023-01-01 04:28:03", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wikisource.js", + "label": "Wikisource", + "translatorID": "076bd26a-1517-469d-85e9-31316a6f6cb0", + "target": "^https?://en\\.wikisource\\.org/w", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2022-12-06 00:17:12", + "minVersion": "2.1.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wikiwand.js", + "label": "Wikiwand", + "translatorID": "ce093a19-cc6b-4106-b17c-b810dba56daa", + "target": "^https?://www\\.wikiwand\\.com/[^/?]+/[^/?]+", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-13 22:38:44", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wiktionary.js", + "label": "Wiktionary", + "translatorID": "f5c15662-1501-4336-8aa5-bd7dc3cc2a68", + "target": "^https?://[^/]*\\.wiktionary\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-12-05 20:28:20", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wildlife Biology in Practice.js", + "label": "Wildlife Biology in Practice", + "translatorID": "b33af0e1-d122-45b2-b144-4b4eedd12d5d", + "target": "^https?://[^/]*socpvs\\.org/journals/index\\.php/wbp", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Michael Berkowitz and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2017-01-01 15:47:15", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wiley Online Library.js", + "label": "Wiley Online Library", + "translatorID": "fe728bc9-595a-4f03-98fc-766f1d8d0936", + "target": "^https?://([\\w-]+\\.)?onlinelibrary\\.wiley\\.com[^/]*/(book|doi|toc|advanced/search|search-web/cochrane|cochranelibrary/search|o/cochrane/(clcentral|cldare|clcmr|clhta|cleed|clabout)/articles/.+/sect0\\.html)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Michael Berkowitz, Avram Lyon and Aurimas Vinckevicius", + "priority": 100, + "lastUpdated": "2025-06-11 15:32:23", + "minVersion": "3.1", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wilson Center Digital Archive.js", + "label": "Wilson Center Digital Archive", + "translatorID": "c4b00da8-420d-4029-9286-0afd766991c1", + "target": "^https?://digitalarchive\\.wilsoncenter\\.org/(document|search-results)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-05-11 21:19:38", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Winnipeg Free Press.js", + "label": "Winnipeg Free Press", + "translatorID": "1d82cbdf-703d-4f96-9ae2-246af21bb96e", + "target": "^https?://www\\.winnipegfreepress\\.com", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-06-17 17:27:13", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/WIPO.js", + "label": "WIPO", + "translatorID": "039338fc-d84f-44bf-99e4-693cc91b569f", + "target": "^https?://patentscope\\.wipo\\.int", + "browserSupport": "gcsbv", + "translatorType": 4, + "creator": "Sebastian Karcher", + "priority": 100, + "lastUpdated": "2017-07-27 10:44:58", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Wired.js", + "label": "Wired", + "translatorID": "f054a3d9-d705-4d2e-a96a-258508bebba3", + "target": "^https?://(www\\.)?wired\\.(com|co\\.uk)", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "czar", + "priority": 100, + "lastUpdated": "2026-01-23 16:11:56", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/wiso.js", + "label": "wiso", + "translatorID": "136d5c30-d8b1-476f-9564-702a41b6126e", + "target": "^https?://www\\.wiso-net\\.de/(document/|dosearch\\?)", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2016-06-26 18:54:53", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Womennews.js", + "label": "Womennews", + "translatorID": "c1f99315-2257-4a32-af1e-68cd8b7bc838", + "target": "^https?://www\\.womennews\\.co\\.kr", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Kagami Sascha Rosylight", + "priority": 100, + "lastUpdated": "2021-06-07 16:47:08", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/World Digital Library.js", + "label": "World Digital Library", + "translatorID": "54d6d465-159b-4631-92fe-4ff0d4664e22", + "target": "^https?://www\\.wdl\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-07-09 17:07:18", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/World History Connected.js", + "label": "World History Connected", + "translatorID": "0507797c-9bc4-4374-92ca-9e3763b6922b", + "target": "worldhistoryconnected\\.press|historycooperative.*/whc/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Frederick Gibbs", + "priority": 100, + "lastUpdated": "2014-02-27 23:05:02", + "minVersion": "1.0.0b4.r5", + "maxVersion": "" + }, + { + "path": "translators/zotero/World Shakespeare Bibliography Online.js", + "label": "World Shakespeare Bibliography Online", + "translatorID": "bf6b49e3-9198-4fbc-a559-a81fcfcce908", + "target": "^https?://(www\\.)?worldshakesbib\\.org", + "browserSupport": "gcs", + "translatorType": 4, + "creator": "Matthias Heim", + "priority": 100, + "lastUpdated": "2014-06-11 22:48:03", + "minVersion": "1.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/WorldCat Discovery Service.js", + "label": "WorldCat Discovery Service", + "translatorID": "fd8dc5f6-a6dd-42b2-948f-600f5da844ea", + "target": "^https?://[^/]+\\.worldcat\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sebastian Karcher and Abe Jellinek", + "priority": 100, + "lastUpdated": "2022-11-25 18:53:10", + "minVersion": "3.0.9", + "maxVersion": "" + }, + { + "path": "translators/zotero/XML ContextObject.js", + "label": "XML ContextObject", + "translatorID": "24d9f058-3eb3-4d70-b78f-1ba1aef2128d", + "target": "ctx", + "browserSupport": "gcsv", + "translatorType": 1, + "creator": "Avram Lyon and Simon Kornblith", + "priority": 100, + "lastUpdated": "2015-05-20 00:05:55", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Yandex Books.js", + "label": "Yandex Books", + "translatorID": "6b4bf64d-2894-48ac-a7cb-d1da7fae7271", + "target": "^https://books\\.yandex\\.ru/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Ilya Zonov", + "priority": 100, + "lastUpdated": "2025-05-06 18:15:23", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Ynet.js", + "label": "Ynet", + "translatorID": "7f45c3f9-e387-4589-9679-225ddcf6f00e", + "target": "^https?://www\\.ynet(\\.co\\.il|news\\.com)/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Eran Rosenthal and Abe Jellinek", + "priority": 100, + "lastUpdated": "2021-06-03 20:46:38", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/YouTube.js", + "label": "YouTube", + "translatorID": "d3b1d34c-f8a1-43bb-9dd6-27aa6403b217", + "target": "^https?://([^/]+\\.)?youtube\\.com/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Sean Takats, Michael Berkowitz, Matt Burton, Rintze Zelle, and Geoff Banh", + "priority": 100, + "lastUpdated": "2025-06-12 16:10:09", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/YPSF.js", + "label": "YPFS", + "translatorID": "5e1f3e08-ca5f-4196-a662-6cf46b3cdaa7", + "target": "^https?://ypfs\\.som\\.yale\\.edu", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Corey Runkel", + "priority": 100, + "lastUpdated": "2021-03-24 13:06:04", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/zbMATH.js", + "label": "zbMATH", + "translatorID": "1d84c107-9dbb-4b87-8208-e3632b87889f", + "target": "^https?://(www\\.)?zbmath\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2021-09-10 18:47:46", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ZIPonline.js", + "label": "ZIPonline", + "translatorID": "5ccc4cf7-8863-4ee2-9772-c9d0b422f028", + "target": "^https?://(www)?\\.zip-online\\.de/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Philipp Zumstein", + "priority": 100, + "lastUpdated": "2017-01-27 16:22:25", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ZOBODAT.js", + "label": "ZOBODAT", + "translatorID": "e94ffd1c-0ff8-4fbc-8b2a-8391ab5a7288", + "target": "^https?://(www\\.)?zobodat\\.at/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Lars Willighagen", + "priority": 100, + "lastUpdated": "2023-10-17 11:17:19", + "minVersion": "5.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/Zotero RDF.js", + "label": "Zotero RDF", + "translatorID": "14763d24-8ba0-45df-8f52-b8d1108e7ac9", + "target": "rdf", + "translatorType": 2, + "creator": "Simon Kornblith", + "priority": 25, + "lastUpdated": "2026-03-06 21:33:15", + "minVersion": "1.0.0b4.r1", + "maxVersion": "" + }, + { + "path": "translators/zotero/zotero.org.js", + "label": "zotero.org", + "translatorID": "c82c574d-7fe8-49ca-a360-a05d6e34fec0", + "target": "^https?://[^/]*zotero\\.org(:\\d+)?/.+/(items|collections|library|publications|trash|search|item-list|item-details)(/|$)", + "browserSupport": "gcsv", + "translatorType": 4, + "creator": "Dan Stillman, Aurimas Vinckevicius, Tomasz Najdek", + "priority": 100, + "lastUpdated": "2021-07-18 22:33:42", + "minVersion": "3.0", + "maxVersion": "" + }, + { + "path": "translators/zotero/ZoteroBib.js", + "label": "ZoteroBib", + "translatorID": "b7c665ba-173c-4dea-b28e-e866580002a2", + "target": "^https://zbib\\.org/", + "browserSupport": "gcsibv", + "translatorType": 4, + "creator": "Dan Stillman", + "priority": 100, + "lastUpdated": "2021-06-23 02:34:46", + "minVersion": "4.0", + "maxVersion": "" + } +] diff --git a/translators/zotero b/translators/zotero new file mode 160000 index 00000000..b975c93a --- /dev/null +++ b/translators/zotero @@ -0,0 +1 @@ +Subproject commit b975c93a9077b087a117edd79a15d29415da3265 diff --git a/utilities/resource/dateFormats.json b/utilities/resource/dateFormats.json deleted file mode 100644 index 66d972d2..00000000 --- a/utilities/resource/dateFormats.json +++ /dev/null @@ -1,1322 +0,0 @@ -{ - "en-US": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ], - "long": [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" - ] - }, - "af-ZA": { - "short": [ - "Jan", - "Feb", - "Mrt", - "Apr", - "Mei", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Des" - ], - "long": [ - "Januarie", - "Februarie", - "Maart", - "April", - "Mei", - "Junie", - "Julie", - "Augustus", - "September", - "Oktober", - "November", - "Desember" - ] - }, - "ar": { - "short": [ - "ÙÙ†Ø§ÙØ±", - "ÙØ¨Ø±Ø§Ùر", - "مارس", - "أبرÙÙ„", - "ماÙÙˆ", - "ÙونÙÙˆ", - "ÙولÙÙˆ", - "أغسطس", - "سبتمبر", - "أكتوبر", - "نوÙمبر", - "Ø¯ÙØ³Ù…بر" - ], - "long": [ - "ÙÙ†Ø§ÙØ±", - "ÙØ¨Ø±Ø§Ùر", - "مارس", - "أبرÙÙ„", - "ماÙÙˆ", - "ÙونÙÙˆ", - "ÙولÙÙˆ", - "أغسطس", - "سبتمبر", - "أكتوبر", - "نوÙمبر", - "Ø¯ÙØ³Ù…بر" - ] - }, - "bg-BG": { - "short": [ - "Đ¯Đ½Ñƒ", - "Đ¤ĐµĐ²", - "ĐœĐ°Ñ€", - "ĐĐ¿Ñ€", - "ĐœĐ°Đ¹", - "Đ®Đ½Đ¸", - "Юли", - "ĐĐ²Đ³", - "Đ¡ĐµĐ¿", - "ĐĐºÑ‚", - "ĐĐ¾Đµ", - "Đ”ĐµĐº" - ], - "long": [ - "Đ¯Đ½ÑƒĐ°Ñ€Đ¸", - "Đ¤ĐµĐ²Ñ€ÑƒĐ°Ñ€Đ¸", - "ĐœĐ°Ñ€Ñ‚", - "ĐĐ¿Ñ€Đ¸Đ»", - "ĐœĐ°Đ¹", - "Đ®Đ½Đ¸", - "Юли", - "ĐĐ²Đ³ÑƒÑÑ‚", - "Đ¡ĐµĐ¿Ñ‚ĐµĐ¼Đ²Ñ€Đ¸", - "ĐĐºÑ‚Đ¾Đ¼Đ²Ñ€Đ¸", - "ĐĐ¾ĐµĐ¼Đ²Ñ€Đ¸", - "Đ”ĐµĐºĐµĐ¼Đ²Ñ€Đ¸" - ] - }, - "ca-AD": { - "short": [ - "gen", - "febr", - "març", - "abr", - "maig", - "juny", - "jul", - "ag", - "set", - "oct", - "nov", - "des" - ], - "long": [ - "gener", - "febrer", - "març", - "abril", - "maig", - "juny", - "juliol", - "agost", - "setembre", - "octubre", - "novembre", - "desembre" - ] - }, - "cs-CZ": { - "short": [ - "Led", - "Ăno", - "BÅ™e", - "Dub", - "KvÄ›", - "ÄŒvn", - "ÄŒnc", - "Srp", - "ZĂ¡Å™", - "Å˜Ă­j", - "Lis", - "Pro" - ], - "long": [ - "leden", - "Ăºnor", - "bÅ™ezen", - "duben", - "kvÄ›ten", - "Äerven", - "Äervenec", - "srpen", - "zĂ¡Å™Ă­", - "Å™Ă­jen", - "listopad", - "prosinec" - ] - }, - "da-DK": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "Maj", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Dec" - ], - "long": [ - "Januar", - "Februar", - "Marts", - "April", - "Maj", - "Juni", - "Juli", - "August", - "September", - "Oktober", - "November", - "December" - ] - }, - "de": { - "short": [ - "Jan", - "Feb", - "Mär", - "Apr", - "Mai", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Dez" - ], - "long": [ - "Januar", - "Februar", - "März", - "April", - "Mai", - "Juni", - "Juli", - "August", - "September", - "Oktober", - "November", - "Dezember" - ] - }, - "el-GR": { - "short": [ - "Ιαν", - "Φεβ", - "ΜαÏ", - "ΑπÏ", - "Ιουν", - "Ιουλ", - "Αυγ", - "Σεπ", - "Οκτ", - "Îοε", - "Δεκ", - "May" - ], - "long": [ - "January", - "October", - "November", - "December", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September" - ] - }, - "en-GB": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ], - "long": [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" - ] - }, - "es-ES": { - "short": [ - "Ene", - "Feb", - "Mar", - "Abr", - "May", - "Jun", - "Jul", - "Ago", - "Sep", - "Oct", - "Nov", - "Dic" - ], - "long": [ - "Enero", - "Febrero", - "Marzo", - "Abril", - "Mayo", - "Junio", - "Julio", - "Agosto", - "Septiembre", - "Octubre", - "Noviembre", - "Diciembre" - ] - }, - "fr-FR": { - "short": [ - "jan", - "fĂ©v", - "mar", - "avr", - "mai", - "juin", - "juil", - "aoĂ»", - "sep", - "oct", - "nov", - "dĂ©c" - ], - "long": [ - "janvier", - "fĂ©vrier", - "mars", - "avril", - "mai", - "juin", - "juillet", - "aoĂ»t", - "septembre", - "octobre", - "novembre", - "dĂ©cembre" - ] - }, - "et-EE": { - "short": [ - "jaan", - "veebr", - "märts", - "apr", - "mai", - "juun", - "juul", - "aug", - "sept", - "okt", - "nov", - "dets" - ], - "long": [ - "jaanuar", - "veebruar", - "märts", - "aprill", - "mai", - "juuni", - "juuli", - "august", - "september", - "oktoober", - "november", - "detsember" - ] - }, - "eu-ES": { - "short": [ - "urt", - "ots", - "mar", - "api", - "mai", - "eka", - "uzt", - "abu", - "ira", - "urr", - "aza", - "abe" - ], - "long": [ - "urtarrila", - "otsaila", - "martxoa", - "apirila", - "maiatza", - "ekaina", - "uztaila", - "abuztua", - "iraila", - "urria", - "azaroa", - "abendua" - ] - }, - "fa": { - "short": [ - "ژانویه", - "Ùوریه", - "مارس", - "آوریل", - "مه", - "ژوئن", - "ژوئیه", - "اوت", - "سپتامبر", - "اکتبر", - "نوامبر", - "دسامبر" - ], - "long": [ - "ژانویه", - "Ùوریه", - "مارس", - "آوریل", - "مه", - "ژوئن", - "ژوئیه", - "اوت", - "سپتامبر", - "اکتبر", - "نوامبر", - "دسامبر" - ] - }, - "fi-FI": { - "short": [ - "tammi", - "helmi", - "maalis", - "huhti", - "touko", - "kesä", - "heinä", - "elo", - "syys", - "loka", - "marras", - "joulu" - ], - "long": [ - "tammikuu", - "helmikuu", - "maaliskuu", - "huhtikuu", - "toukokuu", - "kesäkuu", - "heinäkuu", - "elokuu", - "syyskuu", - "lokakuu", - "marraskuu", - "joulukuu" - ] - }, - "he-IL": { - "short": [ - "×™× '", - "פב'", - "×רץ", - "×פ'", - "×××™", - "יוני", - "יולי", - "×וג'", - "ספט'", - "×וק'", - "נוב'", - "דצ'" - ], - "long": [ - "ינו×ר", - "פברו×ר", - "×רץ", - "×פריל", - "×××™", - "יוני", - "יולי", - "×וגוסט", - "ספט×בר", - "×וקטובר", - "נוב×בר", - "דצ×בר" - ] - }, - "hr-HR": { - "short": [ - "Sij", - "Vel", - "Ožu", - "Tra", - "Svi", - "Lip", - "Srp", - "Kol", - "Ruj", - "Lis", - "Stu", - "Pro" - ], - "long": [ - "SijeÄanj", - "VeljaÄa", - "Ožujak", - "Travanj", - "Svibanj", - "Lipanj", - "Srpanj", - "Kolovoz", - "Rujan", - "Listopad", - "Studeni", - "Prosinac" - ] - }, - "hu-HU": { - "short": [ - "Jan.", - "Febr.", - "MĂ¡rc.", - "Ăpr.", - "MĂ¡j.", - "JĂºn.", - "JĂºl.", - "Aug.", - "Szept.", - "Okt.", - "Nov.", - "Dec." - ], - "long": [ - "JanuĂ¡r", - "FebruĂ¡r", - "MĂ¡rcius", - "Ăprilis", - "MĂ¡jus", - "JĂºnius", - "JĂºlius", - "Augusztus", - "Szeptember", - "OktĂ³ber", - "November", - "December" - ] - }, - "id-ID": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "Mei", - "Jun", - "Jul", - "Agu", - "Sep", - "Okt", - "Nov", - "Des" - ], - "long": [ - "Januari", - "Februari", - "Maret", - "April", - "Mei", - "Juni", - "Juli", - "Agustus", - "September", - "Oktober", - "November", - "Desember" - ] - }, - "is-IS": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "MaĂ­", - "JĂºn", - "JĂºl", - "ĂgĂº", - "Sep", - "Okt", - "NĂ³v", - "Des" - ], - "long": [ - "JanĂºar", - "FebrĂºar", - "Mars", - "AprĂ­l", - "MaĂ­", - "JĂºnĂ­", - "JĂºlĂ­", - "ĂgĂºst", - "September", - "OktĂ³ber", - "NĂ³vember", - "Desember" - ] - }, - "it-IT": { - "short": [ - "Gen", - "Feb", - "Mar", - "Apr", - "Mag", - "Giu", - "Lug", - "Ago", - "Set", - "Ott", - "Nov", - "Dic" - ], - "long": [ - "Gennaio", - "Febbraio", - "Marzo", - "Aprile", - "Maggio", - "Giugno", - "Luglio", - "Agosto", - "Settembre", - "Ottobre", - "Novembre", - "Dicembre" - ] - }, - "ja-JP": { - "short": [ - "(1月)", - "(2月)", - "(3月)", - "(4月)", - "(5月)", - "(6月)", - "(7月)", - "(8月)", - "(9月)", - "(10月)", - "(11月)", - "(12月)" - ], - "long": [ - "1月", - "2月", - "3月", - "4月", - "5月", - "6月", - "7月", - "8月", - "9月", - "10月", - "11月", - "12月" - ] - }, - "km": { - "short": [ - "á˜á€áá¶", - "á€á»á˜áŸ’á—ៈ", - "á˜á¸á“á¶", - "á˜áŸáŸá¶", - "á§áŸá—á¶", - "á˜á·áá»á“á¶", - "á€á€áŸ’á€áá¶", - "áŸá¸á á¶", - "á€á‰áŸ’á‰á¶", - "áá»á›á¶", - "áœá·á…្á†á·á€á¶", - "á’្á“á¼" - ], - "long": [ - "á˜á€áá¶", - "á€á»á˜áŸ’á—ៈ", - "á˜á¸á“á¶", - "á˜áŸáŸá¶", - "á§áŸá—á¶", - "á˜á·áá»á“á¶", - "á€á€áŸ’á€áá¶", - "áŸá¸á á¶", - "á€á‰áŸ’á‰á¶", - "áá»á›á¶", - "áœá·á…្á†á·á€á¶", - "á’្á“á¼" - ] - }, - "ko-KR": { - "short": [ - "1́›”", - "2́›”", - "3́›”", - "4́›”", - "5́›”", - "6́›”", - "7́›”", - "8́›”", - "9́›”", - "10́›”", - "11́›”", - "12́›”" - ], - "long": [ - "1́›”", - "2́›”", - "3́›”", - "4́›”", - "5́›”", - "6́›”", - "7́›”", - "8́›”", - "9́›”", - "10́›”", - "11́›”", - "12́›”" - ] - }, - "lt-LT": { - "short": [ - "Sau", - "Vas", - "Kov", - "Bal", - "Geg", - "Bir", - "Lie", - "Rgp", - "Rgs", - "Spl", - "Lap", - "Grd" - ], - "long": [ - "sausio", - "vasario", - "kovo", - "balandžio", - "gegužės", - "birželio", - "liepos", - "rugpjÅ«Äio", - "rugsÄ—jo", - "spalio", - "lapkriÄio", - "gruodžio" - ] - }, - "nb-NO": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "Mai", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Des" - ], - "long": [ - "Januar", - "Februar", - "Mars", - "April", - "Mai", - "Juni", - "Juli", - "August", - "September", - "Oktober", - "November", - "Desember" - ] - }, - "nn-NO": { - "short": [ - "jan", - "feb", - "mar", - "apr", - "mai", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "des" - ], - "long": [ - "Januar", - "Februar", - "Mars", - "April", - "Mai", - "Juni", - "Juli", - "August", - "September", - "Oktober", - "November", - "Desember" - ] - }, - "nl-NL": { - "short": [ - "jan", - "feb", - "mrt", - "apr", - "mei", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "dec" - ], - "long": [ - "januari", - "februari", - "maart", - "april", - "mei", - "juni", - "juli", - "augustus", - "september", - "oktober", - "november", - "december" - ] - }, - "pl-PL": { - "short": [ - "Sty", - "Lut", - "Mar", - "Kwi", - "Maj", - "Cze", - "Lip", - "Sie", - "Wrz", - "Paź", - "Lis", - "Gru" - ], - "long": [ - "StyczeÅ„", - "Luty", - "Marzec", - "KwiecieÅ„", - "Maj", - "Czerwiec", - "Lipiec", - "SierpieÅ„", - "WrzesieÅ„", - "Październik", - "Listopad", - "GrudzieÅ„" - ] - }, - "pt-BR": { - "short": [ - "Jan", - "Fev", - "Mar", - "Abr", - "Mai", - "Jun", - "Jul", - "Ago", - "Set", - "Out", - "Nov", - "Dez" - ], - "long": [ - "Janeiro", - "Fevereiro", - "Março", - "Abril", - "Maio", - "Junho", - "Julho", - "Agosto", - "Setembro", - "Outubro", - "Novembro", - "Dezembro" - ] - }, - "pt-PT": { - "short": [ - "Jan", - "Fev", - "Mar", - "Abr", - "Mai", - "Jun", - "Jul", - "Ago", - "Set", - "Out", - "Nov", - "Dez" - ], - "long": [ - "janeiro", - "fevereiro", - "março", - "abril", - "maio", - "junho", - "julho", - "agosto", - "setembro", - "outubro", - "novembro", - "dezembro" - ] - }, - "ro-RO": { - "short": [ - "Ian", - "Feb", - "Mar", - "Apr", - "Mai", - "Iun", - "Iul", - "Aug", - "Sep", - "Oct", - "Noi", - "Dec" - ], - "long": [ - "Ianuarie", - "Februarie", - "Martie", - "Aprilie", - "Mai", - "Iunie", - "Iulie", - "August", - "Septembrie", - "Octombrie", - "Noiembrie", - "Decembrie" - ] - }, - "ru-RU": { - "short": [ - "Đ¯Đ½Đ²Đ°Ñ€ÑŒ", - "Đ¤ĐµĐ²Ñ€Đ°Đ»ÑŒ", - "ĐœĐ°Ñ€Ñ‚", - "ĐĐ¿Ñ€ĐµĐ»ÑŒ", - "ĐœĐ°Đ¹", - "Đ˜ÑĐ½ÑŒ", - "Đ˜ÑĐ»ÑŒ", - "ĐĐ²Đ³ÑƒÑÑ‚", - "Đ¡ĐµĐ½Ñ‚ÑĐ±Ñ€ÑŒ", - "ĐĐºÑ‚ÑĐ±Ñ€ÑŒ", - "ĐĐ¾ÑĐ±Ñ€ÑŒ", - "Đ”ĐµĐºĐ°Đ±Ñ€ÑŒ" - ], - "long": [ - "Đ¯Đ½Đ²Đ°Ñ€ÑŒ", - "Đ¤ĐµĐ²Ñ€Đ°Đ»ÑŒ", - "ĐœĐ°Ñ€Ñ‚", - "ĐĐ¿Ñ€ĐµĐ»ÑŒ", - "ĐœĐ°Đ¹", - "Đ˜ÑĐ½ÑŒ", - "Đ˜ÑĐ»ÑŒ", - "ĐĐ²Đ³ÑƒÑÑ‚", - "Đ¡ĐµĐ½Ñ‚ÑĐ±Ñ€ÑŒ", - "ĐĐºÑ‚ÑĐ±Ñ€ÑŒ", - "ĐĐ¾ÑĐ±Ñ€ÑŒ", - "Đ”ĐµĐºĐ°Đ±Ñ€ÑŒ" - ] - }, - "sk-SK": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "MĂ¡j", - "JĂºn", - "JĂºl", - "Aug", - "Sep", - "Okt", - "Nov", - "Dec" - ], - "long": [ - "JanuĂ¡r", - "FebruĂ¡r", - "Marec", - "AprĂ­l", - "MĂ¡j", - "JĂºn", - "JĂºl", - "August", - "September", - "OktĂ³ber", - "November", - "December" - ] - }, - "sl-SI": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "Maj", - "Jun", - "Jul", - "Avg", - "Sep", - "Okt", - "Nov", - "Dec" - ], - "long": [ - "Januar", - "Februar", - "Marec", - "April", - "Maj", - "Junij", - "Julij", - "Avgust", - "September", - "Oktober", - "November", - "December" - ] - }, - "sr-RS": { - "short": [ - "ĐˆĐ°Đ½", - "Феб", - "ĐœĐ°Ñ€", - "ĐĐ¿Ñ€", - "ĐœĐ°Ñ˜", - "ĐˆÑƒĐ½", - "ĐˆÑƒĐ»", - "ĐĐ²Đ³", - "Đ¡ĐµĐ¿", - "ĐĐºÑ‚", - "ĐĐ¾Đ²", - "Đ”ĐµÑ†" - ], - "long": [ - "ĐˆĐ°Đ½ÑƒĐ°Ñ€", - "Đ¤ĐµĐ±Ñ€ÑƒĐ°Ñ€", - "ĐœĐ°Ñ€Ñ‚", - "ĐĐ¿Ñ€Đ¸Đ»", - "ĐœĐ°Ñ˜", - "ĐˆÑƒĐ½", - "ĐˆÑƒĐ»", - "ĐĐ²Đ³ÑƒÑÑ‚", - "Đ¡ĐµĐ¿Ñ‚ĐµĐ¼Đ±Đ°Ñ€", - "ĐĐºÑ‚Đ¾Đ±Đ°Ñ€", - "ĐĐ¾Đ²ĐµĐ¼Đ±Đ°Ñ€", - "Đ”ĐµÑ†ĐµĐ¼Đ±Đ°Ñ€" - ] - }, - "sv-SE": { - "short": [ - "Jan", - "Feb", - "Mar", - "Apr", - "Maj", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Dec" - ], - "long": [ - "Januari", - "Februari", - "Mars", - "April", - "Maj", - "Juni", - "Juli", - "Augusti", - "September", - "Oktober", - "November", - "December" - ] - }, - "th-TH": { - "short": [ - "ม.ค.", - "à¸.à¸.", - "มี.ค.", - "เม.ย.", - "à¸.ค.", - "มิ.ย.", - "à¸.ค.", - "ส.ค.", - "à¸.ย.", - "ต.ค.", - "à¸.ย.", - "ธ.ค." - ], - "long": [ - "มà¸à¸£à¸²à¸„ม", - "à¸à¸¸à¸¡à¸ à¸²à¸à¸±à¸™à¸˜à¹Œ", - "มีนาคม", - "เมษายน", - "à¸à¸¤à¸©à¸ à¸²à¸„ม", - "มิถุนายน", - "à¸à¸£à¸à¸à¸²à¸„ม", - "สิงหาคม", - "à¸à¸±à¸™à¸¢à¸²à¸¢à¸™", - "ตุลาคม", - "à¸à¸¤à¸¨à¸ˆà¸´à¸à¸²à¸¢à¸™", - "ธันวาคม" - ] - }, - "tr-TR": { - "short": [ - "Oca", - "Åub", - "Mar", - "Nis", - "May", - "Haz", - "Tem", - "AÄŸu", - "Eyl", - "Eki", - "Kas", - "Ara" - ], - "long": [ - "Ocak", - "Åubat", - "Mart", - "Nisan", - "Mayıs", - "Haziran", - "Temmuz", - "AÄŸustos", - "EylĂ¼l", - "Ekim", - "Kasım", - "Aralık" - ] - }, - "uk-UA": { - "short": [ - "Đ¡Ñ–Ñ‡", - "Đ›ÑÑ‚", - "Đ‘ĐµÑ€", - "ĐĐ²Ñ–", - "Đ¢Ñ€Đ°", - "Đ§ĐµÑ€", - "Đ›Đ¸Đ¿", - "Đ¡ĐµÑ€", - "Đ’ĐµÑ€", - "Đ–Đ¾Đ²", - "ЛиÑ", - "Đ“Ñ€Ñƒ" - ], - "long": [ - "Đ¡Ñ–Ñ‡ĐµĐ½ÑŒ", - "Đ›ÑÑ‚Đ¸Đ¹", - "Đ‘ĐµÑ€ĐµĐ·ĐµĐ½ÑŒ", - "ĐĐ²Ñ–Ñ‚ĐµĐ½ÑŒ", - "Đ¢Ñ€Đ°Đ²ĐµĐ½ÑŒ", - "Đ§ĐµÑ€Đ²ĐµĐ½ÑŒ", - "Đ›Đ¸Đ¿ĐµĐ½ÑŒ", - "Đ¡ĐµÑ€Đ¿ĐµĐ½ÑŒ", - "Đ’ĐµÑ€ĐµÑĐµĐ½ÑŒ", - "Đ–Đ¾Đ²Ñ‚ĐµĐ½ÑŒ", - "ЛиÑÑ‚Đ¾Đ¿Đ°Đ´", - "Đ“Ñ€ÑƒĐ´ĐµĐ½ÑŒ" - ] - }, - "vi-VN": { - "short": [ - "Thg01", - "Thg02", - "Thg03", - "Thg04", - "Thg05", - "Thg06", - "Thg07", - "Thg08", - "Thg09", - "Thg10", - "Thg11", - "Thg12" - ], - "long": [ - "ThĂ¡ng Má»™t", - "ThĂ¡ng Hai", - "ThĂ¡ng Ba", - "ThĂ¡ng Tư", - "ThĂ¡ng Năm", - "ThĂ¡ng SĂ¡u", - "ThĂ¡ng Bảy", - "ThĂ¡ng TĂ¡m", - "ThĂ¡ng ChĂ­n", - "ThĂ¡ng Mưá»i", - "ThĂ¡ng Mưá»i Má»™t", - "ThĂ¡ng Mưá»i Hai" - ] - }, - "zh-CN": { - "short": [ - "一月", - "二月", - "三月", - "四月", - "五月", - "六月", - "七月", - "八月", - "乿œˆ", - "åæœˆ", - "å一月", - "å二月" - ], - "long": [ - "一月", - "二月", - "三月", - "四月", - "五月", - "六月", - "七月", - "八月", - "乿œˆ", - "åæœˆ", - "å一月", - "å二月" - ] - }, - "zh-TW": { - "short": [ - "1 月", - "2 月", - "3 月", - "4 月", - "5 月", - "6 月", - "7 月", - "8 月", - "9 月", - "10 月", - "11 月", - "12 月" - ], - "long": [ - "1 月", - "2 月", - "3 月", - "4 月", - "5 月", - "6 月", - "7 月", - "8 月", - "9 月", - "10 月", - "11 月", - "12 月" - ] - } -} \ No newline at end of file diff --git a/web-ext-config.js b/web-ext-config.js deleted file mode 100644 index 133b9d0e..00000000 --- a/web-ext-config.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - ignoreFiles: [ - 'zotero-connectors', - 'circle.yml', - 'gulpfile.js', - 'package-lock.json', - 'install_linux.sh', - 'zotero-scholar-citations', - '.idea', - 'workspace.code-workspace', - ], - run: { - startUrl: [ - 'about:debugging', - 'https://ieeexplore.ieee.org/abstract/document/893874', - 'https://arxiv.org/a/diez_t_1.html', - ], - browserConsole: true, - }, - build: { - overwriteDest: true, - }, -} diff --git a/web-ext-config.mjs b/web-ext-config.mjs new file mode 100644 index 00000000..ab94a780 --- /dev/null +++ b/web-ext-config.mjs @@ -0,0 +1,23 @@ +export default { + ignoreFiles: [ + "circle.yml", + "package-lock.json", + "install_linux.sh", + "translators", + ".idea", + "workspace.code-workspace", + "test.js", + "scripts/**", + ], + run: { + startUrl: [ + "about:debugging", + "https://ieeexplore.ieee.org/abstract/document/893874", + "https://arxiv.org/a/diez_t_1.html", + ], + browserConsole: true, + }, + build: { + overwriteDest: true, + }, +}; diff --git a/workspace.code-workspace b/workspace.code-workspace index 876a1499..e529cc2c 100644 --- a/workspace.code-workspace +++ b/workspace.code-workspace @@ -1,8 +1,8 @@ { - "folders": [ - { - "path": "." - } - ], - "settings": {} -} \ No newline at end of file + "folders": [ + { + "path": ".", + }, + ], + "settings": {}, +} diff --git a/wsClient.js b/wsClient.js deleted file mode 100644 index 1411675d..00000000 --- a/wsClient.js +++ /dev/null @@ -1,339 +0,0 @@ -'use strict'; - -/* - * A simple, robust websocket client implementation for the JabRef-Browser-Extension for bidirectional communication with JabRef. - */ -let wsClient = { - WebSocketAction: { - // receive only - HEARTBEAT: "heartbeat", - INFO_CONFIGURATION: "info.configuration", - CMD_FETCH_GOOGLE_SCHOLAR_CITATION_COUNTS: "cmd.fetchGoogleScholarCitationCounts", - - // send only - CMD_REGISTER: "cmd.register", - INFO_GOOGLE_SCHOLAR_CITATION_COUNTS: "info.googleScholarCitationCounts", - - // send and receive - INFO_MESSAGE: "info.message" - }, - - WebSocketClientType: { - UNKNOWN: "unknown", - JABREF_BROWSER_EXTENSION: "JabRefBrowserExtension" - }, - - // internals - connection: null, // socket - heartbeatTimeout: null, // timeout instance - tryReconnectFlag: false, - - // client state - clientStarted: false, - - // configuration (must be configured before starting the client) - configuration: { - showVerboseDebugOutput: false, - websocketScheme: "ws", // "ws" or "wss" - websocketHost: "localhost", // "localhost", "127.0.0.1", ... - websocketPort: 8855, // default port: 8855 - - heartbeatEnabled: true, - heartbeatInterval: 6000, // [ms] should be an even number - heartbeatToleranceFactor: 0.5, - - tryReconnect: true, // true: tries to reconnect, if not connected - wsReconnectInterval: 6000 // [ms] - }, - - getConfiguration: function () { - return wsClient.configuration; - }, - - /** - * should be called before starting the websocket client - * - * @param configuration - */ - setConfiguration: function (configuration) { - wsClient.configuration = configuration; - }, - - /** - * - * @returns {number} - * -1 ... n/a
    - * 0 ... WebSocket.CONNECTING
    - * 1 ... WebSocket.OPEN
    - * 2 ... WebSocket.CLOSING
    - * 3 ... WebSocket.CLOSED - */ - getConnectionState: function () { - if (wsClient.connection) { - return wsClient.connection.readyState; - } else { - return -1; - } - }, - - getConnectionStateAsText: function () { - let readyStateText; - - switch (wsClient.getConnectionState()) { - case WebSocket.CONNECTING: - readyStateText = "connecting"; - break; - case WebSocket.OPEN: - readyStateText = "open"; - break; - case WebSocket.CLOSING: - readyStateText = "closing"; - break; - case WebSocket.CLOSED: - readyStateText = "closed"; - break; - default: - readyStateText = "n/a"; - } - - return readyStateText; - }, - - heartbeat: function () { - if (wsClient.configuration.showVerboseDebugOutput) { - console.debug("[ws] heartbeat called..."); - } - - clearTimeout(wsClient.heartbeatTimeout); - - if (wsClient.configuration.heartbeatEnabled) { - wsClient.heartbeatTimeout = setTimeout(() => { - console.log("[ws] closing websocket (reason: no heartbeat received in time)"); - wsClient.closeConnection(); - }, wsClient.configuration.heartbeatInterval * (1 + wsClient.configuration.heartbeatToleranceFactor)); - } - }, - - sendMessage: function (webSocketAction, messagePayload) { - if (!wsClient.clientStarted) { - return false; - } - - if (!webSocketAction || !messagePayload) { - return false; - } - - if (wsClient.connection && wsClient.getConnectionState() === WebSocket.OPEN) { - let messageContainer = {}; - messageContainer.action = webSocketAction; - messageContainer.payload = messagePayload; - - wsClient.connection.send(JSON.stringify(messageContainer)); - - return true; - } else { - return false; - } - }, - - startClient: function () { - if (wsClient.clientStarted) { - console.log("[ws] wsClient has already been started"); - - return false; - } else { - if (!("WebSocket" in window)) { - console.log("[ws] wsClient could not be started, since WebSockets are not supported by this browser. Please use another browser."); - - return; - } - - console.log("[ws] wsClient is starting up..."); - - wsClient.clientStarted = true; - wsClient.openConnection(); - - return true; - } - }, - - stopClient: function () { - if (wsClient.clientStarted) { - console.log("[ws] stopping wsClient..."); - - wsClient.tryReconnectFlag = false; // disable trying to reconnect - wsClient.closeConnection(); - wsClient.clientStarted = false; - - return true; - } else { - console.log("[ws] wsClient is not started"); - - return false; - } - }, - - stopClientForcefully: function () { - console.log("[ws] wsClient will stop forcefully..."); - - wsClient.tryReconnectFlag = false; // disable trying to reconnect - wsClient.closeConnection(); - wsClient.clientStarted = false; - - return true; - }, - - isClientStarted: function () { - return wsClient.clientStarted; - }, - - /** - * closes the connection; if tryReconnect is true, then a new connection will be established - * - * @returns {boolean} - */ - closeConnection: function () { - if (wsClient.clientStarted && wsClient.connection) { - wsClient.connection.close(); - - return true; - } else { - return false; - } - }, - - openConnection: function () { - if (!wsClient.clientStarted) { - console.log("[ws] wsClient must be started before opening a connection"); - - return false; - } - - wsClient.tryReconnectFlag = wsClient.configuration.tryReconnect; - - wsClient.connection = new WebSocket(wsClient.configuration.websocketScheme + "://" + wsClient.configuration.websocketHost + ":" + wsClient.configuration.websocketPort); - - wsClient.connection.onopen = function (event) { - console.debug("[ws] @onOpen: connection established"); - - if (wsClient.configuration.heartbeatEnabled) { - wsClient.heartbeat(); - } - - let messagePayload = {}; - messagePayload.webSocketClientType = wsClient.WebSocketClientType.JABREF_BROWSER_EXTENSION; - - wsClient.sendMessage(wsClient.WebSocketAction.CMD_REGISTER, messagePayload); - }; - - wsClient.connection.onerror = function (event) { - console.error(`[ws] @onError`); - }; - - wsClient.connection.onclose = function (event) { - // onclose() will be called: - // - in case the connection gets closed properly - // - after onerror() [if the underlying websocket is implemented properly] - // - after unsuccessful connection attempt - // - see: - // - https://stackoverflow.com/questions/40084398/is-onclose-always-called-after-onerror-for-websocket - // - https://html.spec.whatwg.org/multipage/web-sockets.html - - if (event.wasClean) { - console.debug(`[ws] @onClose: connection closed cleanly (code="${event.code}", reason="${event.reason}")`); - } else { - // e.g. server process killed or network down - // event.code is usually 1006 in this case - console.debug(`[ws] @onClose: connection died (code="${event.code}", reason="${event.reason}")`); - } - - clearTimeout(wsClient.heartbeatTimeout); - - if (wsClient.tryReconnectFlag) { - setTimeout(() => { - console.debug("[ws] trying to connect..."); - wsClient.openConnection(); - }, wsClient.configuration.wsReconnectInterval); - } else { - wsClient.clientStarted = false; - } - }; - - wsClient.connection.onmessage = function (event) { - if (wsClient.configuration.showVerboseDebugOutput) { - console.debug(`[ws] @onMessage: ${event.data}`); - } - - let messageContainer = JSON.parse(event.data); - - let action = messageContainer.action; - let messagePayload = messageContainer.payload; - - if (!Object.values(wsClient.WebSocketAction).includes(action)) { - console.warn("[ws] unknown WebSocketAction received: " + action); - return; - } - - if (action === wsClient.WebSocketAction.HEARTBEAT) { - wsClient.handlerHeartbeat(messagePayload); - } else if (action === wsClient.WebSocketAction.INFO_CONFIGURATION) { - wsClient.handlerInfoConfiguration(messagePayload); - } else if (action === wsClient.WebSocketAction.INFO_MESSAGE) { - wsClient.handlerInfoMessage(messagePayload); - } else if (action === wsClient.WebSocketAction.CMD_FETCH_GOOGLE_SCHOLAR_CITATION_COUNTS) { - wsClient.handlerCmdFetchGoogleScholarCitationCounts(messagePayload); - } else { - console.warn("[ws] unimplemented WebSocketAction received: " + action); - } - }; - - return true; - }, - - handlerHeartbeat: function (messagePayload) { - if (wsClient.configuration.heartbeatEnabled) { - wsClient.heartbeat(); - } - }, - - /** - * synchronizes the server configuration with the client configuration - * - * @param messagePayload - */ - handlerInfoConfiguration: function (messagePayload) { - wsClient.configuration.heartbeatEnabled = messagePayload.heartbeatEnabled; - wsClient.configuration.heartbeatInterval = messagePayload.heartbeatInterval; - wsClient.configuration.heartbeatToleranceFactor = messagePayload.heartbeatToleranceFactor; - - if (wsClient.configuration.heartbeatEnabled) { - wsClient.heartbeat(); - } else { - clearTimeout(wsClient.heartbeatTimeout); - } - - console.log("[ws] wsClient configuration has been synchronized with server configuration"); - }, - - handlerInfoMessage: function (messagePayload) { - console.log("[ws] " + messagePayload.messageType + ": " + messagePayload.message); - }, - - handlerCmdFetchGoogleScholarCitationCounts: function (messagePayload) { - let updatedMessagePayload = JSON.parse(JSON.stringify(messagePayload)); // deeply clone json object - let items = updatedMessagePayload.entries; - - // create zsc compatible items - for (let i = 0; i < items.length; i++) { - items[i] = new ZscItem(items[i]); - // add internal metadata - items[i].setField('_externalRequest', true); // false: triggered from browser; true: triggered from JabRef - items[i].setStatus(false, true, false, false); // init: no success, item complete (initial assumption), no captcha, not too many requests - } - - // get citations counts for all items - zsc.processItems(items); - - wsClient.sendMessage(wsClient.WebSocketAction.INFO_GOOGLE_SCHOLAR_CITATION_COUNTS, updatedMessagePayload); - } -}; diff --git a/zotero-connectors/.github/ISSUE_TEMPLATE.md b/zotero-connectors/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 446b3dbc..00000000 --- a/zotero-connectors/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ -**READ THIS BEFORE CREATING AN ISSUE** - -Zotero does not use GitHub Issues for bug reports or feature requests. - -Please post all such requests to the Zotero Forums at https://forums.zotero.org, where Zotero developers and many others can help. For confirmed bugs or agreed-upon changes, Zotero developers will create new issues in the relevant repositories. - -See https://www.zotero.org/support/zotero_support for more information on how Zotero support works. diff --git a/zotero-connectors/.gitignore b/zotero-connectors/.gitignore deleted file mode 100644 index 5d6230fd..00000000 --- a/zotero-connectors/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -build.log -build -cert -config.sh -dist -node_modules diff --git a/zotero-connectors/.gitmodules b/zotero-connectors/.gitmodules deleted file mode 100644 index 856987be..00000000 --- a/zotero-connectors/.gitmodules +++ /dev/null @@ -1,15 +0,0 @@ -[submodule "src/zotero"] - path = src/zotero - url = git://github.com/zotero/zotero.git - branch = master - -[submodule "src/zotero-google-docs-integration"] - path = src/zotero-google-docs-integration - url = git://github.com/zotero/zotero-google-docs-integration.git - branch = master -[submodule "src/translate"] - path = src/translate - url = https://github.com/zotero/translate.git -[submodule "src/utilities"] - path = src/utilities - url = https://github.com/zotero/utilities.git diff --git a/zotero-connectors/.travis.yml b/zotero-connectors/.travis.yml deleted file mode 100644 index 30f3a908..00000000 --- a/zotero-connectors/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -dist: trusty -sudo: false -language: node_js -node_js: - - "node" -services: - - xvfb -cache: - directories: - - "node_modules" -matrix: - include: - - addons: - chrome: stable - env: TEST_CHROME="1" - # Work-around for https://github.com/travis-ci/travis-ci/issues/8836 - sudo: required - - addons: - firefox: latest-unsigned - env: TEST_FX="1" -notifications: - email: false -script: - - ./test/run_tests \ No newline at end of file diff --git a/zotero-connectors/CONTRIBUTING.md b/zotero-connectors/CONTRIBUTING.md deleted file mode 100644 index 20217a7d..00000000 --- a/zotero-connectors/CONTRIBUTING.md +++ /dev/null @@ -1,12 +0,0 @@ -# Contributing to Zotero - -## Bug Reports and Feature Requests - -In order to keep product discussions open to as many people as possible, Zotero does not use GitHub Issues for bug reports or feature requests. Please use the [Zotero Forums](https://forums.zotero.org) to report problems and suggest changes. - -For confirmed bugs or agreed-upon changes, new issues will be created in the relevant repositories on GitHub by Zotero developers. - -## Working with Zotero Code - -See [Zotero Source Code](https://www.zotero.org/support/dev/source_code). - diff --git a/zotero-connectors/COPYING b/zotero-connectors/COPYING deleted file mode 100644 index debfd834..00000000 --- a/zotero-connectors/COPYING +++ /dev/null @@ -1,681 +0,0 @@ -Copyright © 2018 Corporation for Digital Scholarship, -Vienna, Virginia, USA http://digitalscholar.org - -Copyright © 2011-2017 Roy Rosenzweig Center for History and New Media -George Mason University, Fairfax, Virginia, USA -https://www.zotero.org - -The Center for History and New Media distributes the Zotero source code under -the GNU Affero General Public License, version 3 (AGPLv3). The full text of -this license is given below. - -The Zotero name is a registered trademark of the Corporation for Digital -Scholarship. See https://www.zotero.org/trademark for more information. - -Third-party copyright in this distribution is noted where applicable. - -All rights not expressly granted are reserved. - -========================================================================= - - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/zotero-connectors/README.md b/zotero-connectors/README.md deleted file mode 100644 index 42c00c6f..00000000 --- a/zotero-connectors/README.md +++ /dev/null @@ -1,201 +0,0 @@ -# Zotero Connectors - -[![Build Status](https://travis-ci.org/zotero/zotero-connectors.svg?branch=master)](https://travis-ci.org/zotero/zotero-connectors) - -## Building - -1. `git clone --recursive https://github.com/zotero/zotero-connectors.git` -1. `cd zotero-connectors` -1. `npm install` -1. `./build.sh -d` - -The connectors are built in `build/`. - -## Running from the build directory - -### Chrome - -1. Go to chrome://extensions/ -1. Enable "Developer Mode". -1. Click "Load unpacked extension…" and select the `build/browserExt` directory. - -### Firefox - -1. Go to about:debugging -1. Click "Load Temporary Add-on" and select the `build/browserExt/manifest.json` file. - -OR - -1. Get and install the [Mozilla web-ext tool](https://github.com/mozilla/web-ext) -1. `cd` to project root -1. `./scripts/firefox/run_xpi` - -### Safari - -See https://github.com/zotero/safari-app-extension - -## Automatic rebuilding/reloading - -### Chrome on MacOS - -1. `brew install chrome-cli` -1. `npm install -g gulp` -1. `cd` to project root -1. `npm install` -1. `build.sh -d` -1. `gulp watch-chrome` - -As files are changed, the connectors will be rebuilt automatically and Chrome will reload the extension. - -### Firefox - -1. Get and install the [Mozilla web-ext tool](https://github.com/mozilla/web-ext) -1. `cd` to project root -1. `npm install` -1. `build.sh -d` -1. `gulp watch` -1. `./scripts/firefox/run_xpi` (in a different terminal window) - -As files are changed, the connectors will be rebuilt automatically and Firefox will reload the extension. - -### Others - -1. `cd` to project root -1. `npm install` -1. `build.sh -d` -1. `gulp watch` - -As files are changed, the connectors will be rebuilt automatically. You will need to manually reload the extension -in the browser being developed for. - -## Requirements for packaging extensions from the command line - -* Copy `config.sh-sample` to `config.sh` and modify as necessary -* Safari/Chrome extension certificates -* [Google Chrome](https://www.google.com/intl/en/chrome/browser/) or [Chromium](http://www.chromium.org/) -* xar with [patch for building Safari extensions](https://code.google.com/p/xar/issues/detail?id=76) - -# Tests - -To run tests locally, build the extension with the -d flag, and then run - -```$bash -$ ./test/run_tests -p c -``` - -Test files are located at `src/common/test`. See `src/common/test/testSetup.js` for -test framework documentation - -# Developing - -Zotero Connectors are built with standard tools, such as browser extension APIs, but the architecture is quite complex. -This section is a short overview of some of the complexities, to make it more accessible for newcomers. - -## Technologies - -##### Chrome/Firefox Browser Extension Framework - -The functionality exposed on Chrome and Firefox is provided by the Chrome extension framework, -which has also been adopted by Firefox. See [Chrome Extension docs](https://developer.chrome.com/extensions) -and [Firefox Extension docs](https://developer.mozilla.org/en-US/Add-ons/WebExtensions) for more information. - -##### Safari Extension Framework - -For Safari specifics see https://github.com/zotero/safari-app-extension - -##### Zotero Translator Framework - -The Connectors share code with [Zotero desktop application](https://github.com/zotero/zotero), to support translation. -A basic understanding of how translation works or at least the handlers it exposes in Zotero will be highly useful in -understanding the codebase. - -## Components - -Saving resources to Zotero library is facilitated by two major components: the Zotero Connector running in the browser -and either the Zotero client or zotero.org web api. The Zotero Connector itself is split into two components: -code running on the webpage and a background process. - - - - -##### a) Injected scripts for individual webpages - -Each webpage is injected ([Chrome](https://developer.chrome.com/extensions/content_scripts)/[Firefox](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts)/[Safari](https://developer.apple.com/library/content/documentation/Tools/Conceptual/SafariExtensionGuide/InjectingScripts/InjectingScripts.html)) -with a full Zotero [translation framework](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/gulpfile.js#L45-L79). -A [*Zotero.Translate.Web*](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/inject/inject.jsx#L314-L314) -instance orchestrates running individual translators for detection and translation. - -The translation framework shares some code with the Zotero codebase and provides custom classes concerning -[translator retrieval](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/translators.js) -and [item saving](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/translate_item.js). -These custom classes talk to the background process (b) of the Zotero Connector for functionality outside the translation -framework, such as retrieving translator code and sending translated items either to Zotero (c) or zotero.org (d). - -##### b) Background process - -The Connector runs a [background process](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/gulpfile.js#L95-L125) -([Chrome](https://developer.chrome.com/extensions/event_pages)/[Firefox](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Background_scripts)/[Safari](https://developer.apple.com/library/content/documentation/Tools/Conceptual/SafariExtensionGuide/AddingaGlobalHTMLPage/AddingaGlobalHTMLPage.html)) -which works as a middle-layer between the translation framework running in inject scripts (a) and Zotero (c) or zotero.org (d). - -The background process maintains a cache of translators and performs the initial [translator detection using URL matching](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/translators.js#L140-L196). -Translators whose target regexp matches the URL of a given webpage are then further tested by running `detectWeb()` -in injected scripts. A list of translators and their code is -fetched either from [Zotero (c) or zotero.org (d)](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/repo.js#L140-L155). - -The background process is also responsible for updating the extension UI, kicking off translations, storing and -retrieving connector preferences and sending translated items to Zotero or zotero.org. Browser specific scripts are -available for [BrowserExt](https://github.com/zotero/zotero-connectors/blob/master/src/browserExt/background.js) -and [Safari](https://github.com/zotero/zotero-connectors/blob/master/src/safari/global.html). - -##### c) Connector server in Zotero - -When Zotero is open it runs a [connector HTTP server](https://www.zotero.org/support/dev/client_coding/connector_http_server) -on port 23119. The HTTP server API accommodates interactions between the Connectors and Zotero client. Calls to -[*Zotero.Connector.callMethod(endpoint)*](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/connector.js#L150) -in this codebase are translated to HTTP requests to the connector server. - -Note that Zotero cannot interact with the connectors on its own accord. All communication is Connector initiated. - -##### d) zotero.org API - -When Zotero is not available item saving falls back to -using [zotero.org API](https://www.zotero.org/support/dev/web_api/v3/start). -The interactions with zotero.org API are defined in [api.js](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/api.js) - -## Message passing - -The only way for the background extension process and injected scripts to communicate is using the message passing -protocol provided by the browsers ([Chrome](https://developer.chrome.com/extensions/messaging)/[Firefox](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#Communicating_with_background_scripts)/[Safari](https://developer.apple.com/library/content/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html)). -Injected scripts often need to communicate to background scripts. To simplify -these interactions, calls to functions in background scripts are monkey-patched in injected scripts. These calls are -asynchronous and if a return value is required, it is provided either to a callback function as the last argument of -the call or as a resolving value of a promise returned. - -[*messages.js*](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/messages.js) -contains the list of the monkey-patched methods. If the method value is false no response is expected, otherwise -the calls provide a response. An optional pre-send processing on the background end and post-receive processing -on the injected end is possible to treat values that cannot be sent as-is via the messaging protocol. - -The background process registers message listeners in [*messaging.js*](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/common/messaging.js). -`Zotero.Messaging` class also provides a way to send messages to injected scripts and add custom message listeners. - -The injected scripts monkey-patch methods in *messaging_injected.js*([BrowserExt](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/browserExt/messaging_inject.js)/[Safari](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/src/safari/messaging_inject.js)) -`Zotero.Messaging` class also provides a way to send messages to the background process and add message listeners. - - -## Build process - -The build process combines files from the Zotero codebase, common files to all connectors and specific files for -Chrome/Firefox/Safari connectors. At the moment the build process is awkward and uses a SH script and gulp procedures. -This will be reconciled in the future to only use gulp. - -1. `build.sh` [copies images](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/build.sh#L183-L223) - and [extension files](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/build.sh#L226-L277) -1. `gulp process-custom-files` [initiated by](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/build.sh#L281-L286) - `build.sh` performs [post-processing](https://github.com/zotero/zotero-connectors/blob/e1a16c8ad2e17c6893554c3f376384e18182202d/gulpfile.js#L157-L241) - on copied files - -## Contact - -If you have any questions about developing Zotero Connectors you can join the discussion in the -[zotero-dev mailing list](https://groups.google.com/forum/#!forum/zotero-dev). diff --git a/zotero-connectors/build.sh b/zotero-connectors/build.sh deleted file mode 100755 index 8d76adf2..00000000 --- a/zotero-connectors/build.sh +++ /dev/null @@ -1,392 +0,0 @@ -#!/bin/bash -e - -# Copyright (c) 2012 Zotero -# Center for History and New Media -# George Mason University, Fairfax, Virginia, USA -# http://zotero.org -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -case "$(uname -s)" in - CYGWIN*) IS_CYGWIN=1 ;; -esac -if [ -f "$CWD/config.sh" ]; then - . "$CWD/config.sh" -fi - -function usage { - cat >&2 < "$browser_builddir/browser-polyfill.js" - fi - - # Copy google docs integration code - cp -r "$SRCDIR/zotero-google-docs-integration/src/connector" \ - "$browser_builddir/zotero-google-docs-integration" - cp -r "$SRCDIR/zotero-google-docs-integration/package.json" \ - "$browser_builddir/zotero-google-docs-integration" - - # Copy locales - mkdir -p "$browser_builddir/_locales/en" - # Get English strings from this repo - cp "$SRCDIR/messages.json" "$browser_builddir/_locales/en" - # And other locales from the Zotero submodule - pushd "$SRCDIR/zotero/chrome/locale" > /dev/null - for code in ?? ??-??; do - if [ $code = 'en-US' ]; then - continue - fi - - lang=${code:0:2} - # Keep in sync with i18n.js in Safari connector - if [[ $code = 'pt-PT' ]] || [[ $code = 'zh-TW' ]]; then - target_dir="$browser_builddir/_locales/$code" - - else - target_dir="$browser_builddir/_locales/$lang" - fi - - if [ -f $code/zotero/connector.json ]; then - mkdir -p $target_dir - cp $code/zotero/connector.json "$target_dir/messages.json" - fi - done - popd > /dev/null - - # Copy node_modules libs - mkdir "$browser_builddir/lib" - - if [ ${#LIBS[@]} -gt 0 ]; then - cp "${LIBS[@]}" "$browser_builddir/lib" - fi - # TODO: Allow renaming to be specified in library list above - cp "$NODE_MODULES_DIR/react/umd/react.production.min.js" "$browser_builddir/lib/react.js" - cp "$NODE_MODULES_DIR/react-dom/umd/react-dom.production.min.js" "$browser_builddir/lib/react-dom.js" - cp "$NODE_MODULES_DIR/prop-types/prop-types.min.js" "$browser_builddir/lib/prop-types.js" - cp "$NODE_MODULES_DIR/react-dom-factories/index.js" "$browser_builddir/lib/react-dom-factories.js" - - # Remove .jsx files - we'll deal with those in gulp - find "$browser_builddir" -type f -name "*.jsx" -delete - - # Copy SingleFile submodule code - mkdir -p "$browser_builddir/lib/SingleFile/dist" - cp -r "$SRCDIR/zotero/resource/SingleFile/dist/extension-core.js" \ - "$SRCDIR/zotero/resource/SingleFile/dist/single-file-background.js" \ - "$SRCDIR/zotero/resource/SingleFile/dist/single-file.js" \ - "$SRCDIR/zotero/resource/SingleFile/dist/single-file-frames.js" \ - "$SRCDIR/zotero/resource/SingleFile/dist/chrome-browser-polyfill.js" \ - "$SRCDIR/zotero/resource/SingleFile/dist/web/hooks" \ - "$browser_builddir/lib/SingleFile/dist" - # Copy SingleFile config object from client code - cp "$SRCDIR/zotero/chrome/content/zotero/xpcom/singlefile.js" "$browser_builddir/singlefile-config.js" - - if [ ! -z $DEBUG ]; then - cp "$EXTENSION_TRANSLATE_DIR/testTranslators"/*.js \ - "$EXTENSION_TRANSLATE_DIR/testTranslators"/*.css \ - "$browser_builddir/tools/testTranslators" - else - rm -rf "$browser_builddir/tools" - rm -rf "$browser_builddir/tests" - fi -} - -if [[ $BUILD_BROWSER_EXT == 1 ]]; then - # Copy images for Chrome - rm -rf "$BUILD_DIR/browserExt/images" - mkdir "$BUILD_DIR/browserExt/images" - cp $ICONS $IMAGES $PREFS_IMAGES "$BUILD_DIR/browserExt/images" - cp "$CWD/icons/Icon-16.png" "$CWD/icons/Icon-48.png" "$CWD/icons/Icon-96.png" "$CWD/icons/Icon-128.png" "$BUILD_DIR/browserExt" - - copyResources 'browserExt' -fi - -if [[ $BUILD_SAFARI == 1 ]]; then - # - # Make alpha images - # - # ImageMagick 7 changes how channels work, so the same command doesn't work properly. Until we - # figure out an equivalent command for ImageMagick 7, continue using version 6 from homebrew. - IMAGEMAGICK_CONVERT=/usr/local/opt/imagemagick@6/bin/convert - rm -rf "$BUILD_DIR/safari/images" - mkdir "$BUILD_DIR/safari/images" - mkdir "$BUILD_DIR/safari/images/toolbar" - set +e - $IMAGEMAGICK_CONVERT -version | grep "ImageMagick 6" > /dev/null 2>&1 - RETVAL=$? - set -e - if [ $RETVAL == 0 ]; then - cp $ICONS $IMAGES $PREFS_IMAGES "$BUILD_DIR/safari/images" - for f in $ICONS - do - $IMAGEMAGICK_CONVERT $f -background white -flatten -negate -alpha Background -alpha Copy -channel \ - Opacity -contrast-stretch 50 "$BUILD_DIR/safari/images/toolbar/"`basename $f` - done - else - echo - echo "ImageMagick 6 not installed; not creating monochrome Safari icons" - cp $ICONS "$BUILD_DIR/safari/images" - cp $ICONS "$BUILD_DIR/safari/images/toolbar" - cp $IMAGES $PREFS_IMAGES "$BUILD_DIR/safari/images" - fi - cp "$CWD/icons/Icon-32.png" "$CWD/icons/Icon-48.png" "$CWD/icons/Icon-64.png" \ - "$BUILD_DIR/safari" - - copyResources 'safari' -fi - -# Make separate Chrome and Firefox directories -if [[ $BUILD_BROWSER_EXT == 1 ]]; then - rsync -a $BUILD_DIR/browserExt/ $BUILD_DIR/chrome/ - mv $BUILD_DIR/browserExt $BUILD_DIR/firefox -fi - -if [[ $BUILD_BROWSER_EXT == 1 ]] || [[ $BUILD_SAFARI == 1 ]]; then - "$GULP" -v >/dev/null 2>&1 || { echo >&2 "gulp not found -- aborting"; exit 1; } - - # Update scripts - if [ ! -z $DEBUG ]; then - "$GULP" process-custom-scripts --connector-version "$VERSION" > "$LOG" 2>&1 - else - "$GULP" process-custom-scripts --connector-version "$VERSION" -p > "$LOG" 2>&1 - fi -fi - -if [[ $BUILD_BROWSER_EXT == 1 ]]; then - # Chrome modifications - - # Use larger icons where available in Chrome, which actually wants 19px icons - # 2x - for img in "$BUILD_DIR"/chrome/images/*2x.png; do - cp $img `echo $img | sed 's/@2x//'` - done - ## 2.5x - for img in "$BUILD_DIR"/chrome/images/*48px.png; do - cp $img `echo $img | sed 's/@48px//'` - done - - # Remove the 'applications' property used by Firefox from the manifest - pushd $BUILD_DIR/chrome > /dev/null - cat manifest.json | jq '. |= del(.applications)' > manifest.json-tmp - mv manifest.json-tmp manifest.json - popd > /dev/null - - # Firefox modifications - - # TEMP: Copy 2x icons to 1x until getImageSrc() is updated to detect HiDPI - for img in "$BUILD_DIR"/firefox/images/*2x.png; do - cp $img `echo $img | sed 's/@2x//'` - done - ## 2.5x - for img in "$BUILD_DIR"/firefox/images/*48px.png; do - cp $img `echo $img | sed 's/@48px//'` - done - - # Remove 'optional_permissions' property used by Chrome from the manifest. - # If we start using other optional permissions in Firefox before 'management' - # is supported in Firefox, we can probably get jq to delete just 'management'. - pushd $BUILD_DIR/firefox > /dev/null - cat manifest.json | jq '. |= del(.optional_permissions)' > manifest.json-tmp - mv manifest.json-tmp manifest.json - popd > /dev/null - -fi - -echo "done" - -if [ $BUILD_BOOKMARKLET == 1 ]; then - echo -n "Building bookmarklet..." - - # Copy HTML to dist directory - cp -R "$SRCDIR/bookmarklet/debug_mode.html" \ - "$SRCDIR/bookmarklet/iframe.html" \ - "$SRCDIR/bookmarklet/auth_complete.html" \ - "$SRCDIR/bookmarklet/upload.js" \ - "$SRCDIR/common/itemSelector" \ - "$SRCDIR/common/progressWindow" \ - "$BUILD_DIR/bookmarklet" - cp "$SRCDIR/bookmarklet/htaccess" "$BUILD_DIR/bookmarklet/.htaccess" - rm -rf "$BUILD_DIR/bookmarklet/images" - mkdir "$BUILD_DIR/bookmarklet/images" - cp $ICONS $IMAGES "$BUILD_DIR/bookmarklet/images" - - # Update scripts - if [ ! -z $DEBUG ]; then - "$GULP" process-bookmarklet-scripts --connector-version "$VERSION" > "$LOG" 2>&1 - else - "$GULP" process-bookmarklet-scripts --connector-version "$VERSION" -p > "$LOG" 2>&1 - fi - - echo "done" -else - rmdir "$BUILD_DIR/bookmarklet" -fi diff --git a/zotero-connectors/config.sh-sample b/zotero-connectors/config.sh-sample deleted file mode 100644 index d832dd71..00000000 --- a/zotero-connectors/config.sh-sample +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -FIREFOX_UPDATE_URL="https://example.com/download/connector/firefox/CHANNEL/updates.json" - -# This must be xar from https://code.google.com/p/xar/issues/detail?id=76 -XAR_EXECUTABLE=/usr/local/bin/xar -SAFARI_PRIVATE_KEY="$ROOT_DIR/cert/safari_extension.key" -SAFARI_EXT_CERTIFICATE="$ROOT_DIR/cert/safari_extension.cer" -SAFARI_AUX_CERTIFICATE1="$ROOT_DIR/cert/Apple Worldwide Developer Relations Certification Authority.cer" -SAFARI_AUX_CERTIFICATE2="$ROOT_DIR/cert/Apple Root CA.cer" -SAFARI_DEVELOPER_ID="" - -export WEB_EXT_API_KEY="" -export WEB_EXT_API_SECRET="" -S3_BUCKET="foo-download" -DEPLOY_HOST="deploy.local" -MANIFEST_DEPLOY_PATH="/path/to/dir" -DEPLOY_CMD="/path/to/script" diff --git a/zotero-connectors/gulpfile.js b/zotero-connectors/gulpfile.js deleted file mode 100644 index 6e94aba6..00000000 --- a/zotero-connectors/gulpfile.js +++ /dev/null @@ -1,427 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -'use strict'; - -const { watchBookmarklet, processBookmarkletScripts } = require('./scripts/gulpfile_bookmarklet'); -const replaceBrowser = require('./scripts/replace_browser'); -const exec = require('child_process').exec; -const through = require('through2'); -const gulp = require('gulp'); -const plumber = require('gulp-plumber'); -const babel = require('@babel/core'); -const browserify = require('browserify'); -const schemaJSON = require('./src/zotero/resource/schema/global/schema.json'); -const argv = require('yargs') - .boolean('p') - .alias('p', 'production') - .describe('p', 'Production. Do not include translator tester.') - .string('connector-version') - .describe('connector-version', 'Version of the extension') - .help('h') - .alias('h', 'help') - .default({'connector-version': '4.999.0', p: false}) - .argv; - -var injectInclude = [ - 'node_modules.js', - 'zotero_config.js', - 'zotero.js', - 'translate/promise.js', - 'http.js', - 'proxy.js', - 'utilities/date.js', - 'utilities/openurl.js', - 'utilities/xregexp-all.js', - 'utilities/xregexp-unicode-zotero.js', - 'utilities/resource/zoteroTypeSchemaData.js', - 'utilities/utilities.js', - 'utilities/utilities_item.js', - 'utilities.js', - 'translate/debug.js', - 'utilities/schema.js', - 'translate/rdf/init.js', - 'translate/rdf/uri.js', - 'translate/rdf/term.js', - 'translate/rdf/identity.js', - 'translate/rdf/rdfparser.js', - 'translate/translation/translate.js', - 'translate/translator.js', - 'translate/utilities_translate.js', - 'translate_item.js', - 'inject/http.js', - 'inject/translate_inject.js', - 'integration/connectorIntegration.js', - 'cachedTypes.js', - 'schema.js', - 'messages.js', - 'messaging_inject.js', - 'inject/progressWindow_inject.js', - 'inject/modalPrompt_inject.js', - 'i18n.js', - 'singlefile.js' -]; -var injectIncludeLast; -if (argv.p) { - injectIncludeLast = ['inject/inject.js']; -} else { - injectIncludeLast = [ - 'tools/testTranslators/translatorTester_messages.js', - 'tools/testTranslators/translatorTester.js', - 'inject/inject.js', - 'tools/testTranslators/translatorTester_inject.js' - ]; -} -var injectIncludeBrowserExt = ['browser-polyfill.js'].concat(injectInclude, ['api.js'], injectIncludeLast); - -var backgroundInclude = [ - 'node_modules.js', - 'zotero_config.js', - 'zotero.js', - 'i18n.js', - 'translate/promise.js', - 'prefs.js', - 'api.js', - 'http.js', - 'oauthsimple.js', - 'proxy.js', - 'connector.js', - 'repo.js', - 'utilities/date.js', - 'utilities/openurl.js', - 'utilities/xregexp-all.js', - 'utilities/xregexp-unicode-zotero.js', - 'utilities/resource/zoteroTypeSchemaData.js', - 'utilities/utilities.js', - 'utilities/utilities_item.js', - 'utilities.js', - 'translate/debug.js', - 'translate/tlds.js', - 'translate/translator.js', - 'translators.js', - 'cachedTypes.js', - 'errors_webkit.js', - 'google-docs-plugin-manager.js', - 'messages.js', - 'messaging.js', - 'singlefile-config.js', - 'lib/SingleFile/dist/extension-core.js', - 'lib/SingleFile/dist/single-file-background.js', -]; - - -if (!argv.p) { - backgroundInclude.push('zotero-google-docs-integration/api.js', - 'tools/testTranslators/translatorTester_messages.js', - 'tools/testTranslators/translatorTester.js', - 'tools/testTranslators/translatorTester_global.js', - 'test/messages.js', - 'test/testSetup.js', - 'lib/sinon.js'); -} -var backgroundIncludeBrowserExt = ['browser-polyfill.js'].concat(backgroundInclude, [ - 'webRequestIntercept.js', - 'contentTypeHandler.js', - 'firefoxPDF.js' -]); - -function reloadChromeExtensionsTab(cb) { - console.log("Reloading Chrome extensions tab"); - - - exec('chrome-cli list tabs', function (err, stdout) { - if (err) cb(err); - - var extensionsTabMatches = stdout.match(/\[\d{1,5}:(\d{1,5})\] Extensions/); - if (extensionsTabMatches) { - var extensionsTabID = extensionsTabMatches[1]; - - exec('chrome-cli reload -t ' + extensionsTabID) - } - else { - exec('chrome-cli open chrome://extensions && chrome-cli reload') - } - }); -} - -function replaceScriptsHTML(string, match, scripts) { - return string.replace(match, - scripts.map((s) => '') - .join('\n')); -} - -function processFile() { - return through.obj(async function(file, enc, cb) { - console.log(file.path.slice(file.cwd.length)); - var offset = file.cwd.split('/').length; - var parts = file.path.split('/'); - var basename = parts[parts.length-1]; - var ext = basename.split('.')[1]; - for (var i = offset; i < parts.length; i++) { - if ('src' === parts[i]) { - i++; - break; - } - } - var type = parts[i]; - - // Used to identify files by pathname from src to try and prevent conflicts - var sourcefile = parts.slice(i).join('/'); - - // Transform react - if (ext == 'jsx') { - try { - file.contents = Buffer.from( - babel.transform( - file.contents, - { - plugins: [ - '@babel/plugin-transform-react-jsx', - '@babel/plugin-proposal-class-properties' - ] - } - ).code - ); - } catch (e) { - console.log(e.message); - return; - } - // Remove the 'x' from '.jsx' - parts[parts.length-1] = basename = basename.substr(0, basename.length-1); - } - - // Replace contents - switch (basename) { - case 'zotero_config.js': - var contents = file.contents.toString(); - if (process.env.ZOTERO_GOOGLE_DOCS_DEV_MODE) { - contents = contents.replace('GOOGLE_DOCS_DEV_MODE: false', - 'GOOGLE_DOCS_DEV_MODE: true'); - } - if (process.env.ZOTERO_GOOGLE_DOCS_API_URL) { - contents = contents.replace(/GOOGLE_DOCS_API_URL: [^,]*/, - `GOOGLE_DOCS_API_URL: "${process.env.ZOTERO_GOOGLE_DOCS_API_URL}"`); - } - if (process.env.ZOTERO_GOOGLE_DOCS_OAUTH_CLIENT_KEY) { - contents = contents.replace( - '222339878061-13uqre19u268oo9pdapuaifklbu8d6js.apps.googleusercontent.com', - process.env.ZOTERO_GOOGLE_DOCS_OAUTH_CLIENT_KEY - ); - } - if (process.env.ZOTERO_REPOSITORY_URL) { - contents = contents.replace(/REPOSITORY_URL: [^,]*/, - `REPOSITORY_URL: "${process.env.ZOTERO_REPOSITORY_URL}"`); - } - file.contents = Buffer.from(contents); - break; - case 'zotero.js': - var contents = file.contents.toString(); - if (!argv.p) { - contents = contents - .replace('"debug.log": false', '"debug.log": true') - // TODO: Replace with remote code repo URL once it is set up - .replace('"integration.googleDocs.codeRepositoryURL": ""', - '"integration.googleDocs.codeRepositoryURL": "http://127.0.0.1:8090/"'); - } - contents = contents.replace(/\/\* this\.allowRepoTranslatorTester = SET IN BUILD SCRIPT \*\//, - `this.allowRepoTranslatorTester = ${!!process.env.ZOTERO_REPOSITORY_URL}`); - file.contents = Buffer.from(contents); - break; - case 'manifest.json': - file.contents = Buffer.from(file.contents.toString() - .replace("/*BACKGROUND SCRIPTS*/", - backgroundIncludeBrowserExt.map((s) => `"${s}"`).join(',\n\t\t\t')) - .replace("/*INJECT SCRIPTS*/", - injectIncludeBrowserExt.map((s) => `"${s}"`).join(',\n\t\t\t')) - .replace(/"version": "[^"]*"/, '"version": "' + argv.connectorVersion + '"')); - break; - case 'background.js': - file.contents = Buffer.from(file.contents.toString() - .replace("/*INJECT SCRIPTS*/", - injectIncludeBrowserExt.map((s) => `"${s}"`).join(',\n\t\t'))); - break; - case 'schema.js': { - file.contents = Buffer.from(file.contents.toString() - .replace("/*ZOTERO_SCHEMA*/", - JSON.stringify(schemaJSON) - )); - break; - } - case 'preferences.html': - case 'progressWindow.html': - case 'modalPrompt.html': - file.contents = Buffer.from(file.contents.toString() - .replace(/([\s\S]*?)/g, argv.p ? '' : '$1')); - break; - case 'node_modules.js': - await new Promise((resolve) => { - // Stream needs to be converted to a buffer because of complicated stream cloning quantum bugs - // so we cannot just do file = browserify.bundle() - // Also - // We used to be able to pass in the whole file object here before gulp 4. - // It doesn't work anymore and produces weird minified content - // so we pass in the file path instead which works well - browserify(file.path).bundle((err, buf) => {file.contents = buf; resolve()}); - }); - break; - } - - // sourcefile is relative to the src/ directory - switch (sourcefile) { - case 'zotero/resource/SingleFile/dist/extension-core.js': - // Change single file inject base path - // See injectSingleFile() in background.js - file.contents = Buffer.from(file.contents.toString() - .replace('../../../', 'lib/SingleFile/') - ); - - // Override the type so we include this file in firefox and chrome builds - type = 'browserExt'; - // Switch from resource to lib sub-directory - parts[i+1] = 'lib'; - break; - case 'zotero/resource/SingleFile/dist/single-file.js': - case 'zotero/resource/SingleFile/dist/single-file-frames.js': - // Change single file inject base path - // See injectSingleFile() in background.js - file.contents = Buffer.from(file.contents.toString() - .replaceAll('dist/web/', 'lib/SingleFile/dist/') - ); - - // Override the type so we include this file in firefox and chrome builds - type = 'browserExt'; - // Switch from resource to lib sub-directory - parts[i+1] = 'lib'; - break; - } - - let f; - - // Amend paths - if (type === 'common' || type === 'browserExt') { - if (file.path.includes('.html')) { - file.contents = Buffer.from(replaceScriptsHTML( - file.contents.toString(), "", injectIncludeBrowserExt.map(s => `../../${s}`))); - } - ['chrome', 'firefox'].forEach((browser) => { - f = file.clone({contents: false}); - if (basename == 'zotero.js') { - let contents = f.contents.toString() - .replace('this.version = [^;]*', `this.version = "${argv.version}";`); - contents = replaceBrowser(contents, { browserExt: true, firefox: browser == 'firefox' }); - f.contents = Buffer.from(contents); - } - f.path = parts.slice(0, i-1).join('/') + `/build/${browser}/` + parts.slice(i+1).join('/'); - console.log(`-> ${f.path.slice(f.cwd.length)}`); - this.push(f); - }); - } - if (type === 'common' || type === 'safari') { - f = file.clone({contents: false}); - f.path = parts.slice(0, i-1).join('/') + '/build/safari/' + parts.slice(i+1).join('/'); - if (basename == 'zotero.js') { - let contents = f.contents.toString() - .replace('this.version = [^;]*', `this.version = "${argv.version}";`); - contents = replaceBrowser(contents, { safari: true }); - f.contents = Buffer.from(contents); - } - console.log(`-> ${f.path.slice(f.cwd.length)}`); - this.push(f); - } - if (type === 'zotero-google-docs-integration') { - f = file.clone({contents: false}); - f.path = parts.slice(0, i-1).join('/') + '/build/safari/zotero-google-docs-integration/' - + parts.slice(i+3).join('/'); - console.log(`-> ${f.path.slice(f.cwd.length)}`); - this.push(f); - ['chrome', 'firefox'].forEach((browser) => { - f = file.clone({contents: false}); - f.path = parts.slice(0, i-1).join('/') + `/build/${browser}/zotero-google-docs-integration/` - + parts.slice(i+3).join('/'); - console.log(`-> ${f.path.slice(f.cwd.length)}`); - this.push(f); - }); - } - - cb(); - }); -} - -gulp.task('watch', function () { - var watcher = gulp.watch(['./src/browserExt/**', './src/common/**', './src/safari/**', - './src/zotero-google-docs-integration/src/connector/**']); - watcher.on('change', function(path) { - gulp.src(path) - .pipe(plumber()) - .pipe(processFile()) - .pipe(gulp.dest((data) => data.base)); - }); -}); - -gulp.task('watch-chrome', function () { - var watcher = gulp.watch(['./src/browserExt/**', './src/common/**', './src/safari/**', - './src/zotero-google-docs-integration/src/connector/**']); - watcher.on('change', function(event) { - gulp.src(event.path) - .pipe(plumber()) - .pipe(processFile()) - .pipe(gulp.dest((data) => data.base)) - .on('close', reloadChromeExtensionsTab); - }); -}); - -gulp.task('process-custom-scripts', function() { - let sources = [ - './src/browserExt/background.js', - './src/browserExt/manifest.json', - './src/browserExt/confirm.html', - './src/common/node_modules.js', - './src/common/preferences/preferences.html', - './src/common/progressWindow/progressWindow.html', - './src/common/modalPrompt/modalPrompt.html', - './src/common/schema.js', - './src/common/zotero.js', - './src/common/zotero_config.js', - './src/zotero/resource/SingleFile/dist/extension-core.js', - './src/zotero/resource/SingleFile/dist/single-file.js', - './src/zotero/resource/SingleFile/dist/single-file-frames.js', - './src/common/test/**/*', - './src/**/*.jsx', - './src/zotero-google-docs-integration/src/connector/**', - ]; - if (!argv.p) { - sources.push('./src/common/test/**/*.js'); - } - return gulp.src(sources) - .pipe(plumber()) - .pipe(processFile()) - .pipe(gulp.dest((data) => data.base)); -}); - -gulp.task('watch-bookmarklet', watchBookmarklet(argv)); - -gulp.task('process-bookmarklet-scripts', processBookmarkletScripts(argv)); - -gulp.task('default', gulp.series(['watch'])); diff --git a/zotero-connectors/icons/Icon-128.png b/zotero-connectors/icons/Icon-128.png deleted file mode 100644 index 32abac97..00000000 Binary files a/zotero-connectors/icons/Icon-128.png and /dev/null differ diff --git a/zotero-connectors/icons/Icon-16.png b/zotero-connectors/icons/Icon-16.png deleted file mode 100644 index bbe0e997..00000000 Binary files a/zotero-connectors/icons/Icon-16.png and /dev/null differ diff --git a/zotero-connectors/icons/Icon-32.png b/zotero-connectors/icons/Icon-32.png deleted file mode 100644 index 36d33bee..00000000 Binary files a/zotero-connectors/icons/Icon-32.png and /dev/null differ diff --git a/zotero-connectors/icons/Icon-48.png b/zotero-connectors/icons/Icon-48.png deleted file mode 100644 index ffa9cfdc..00000000 Binary files a/zotero-connectors/icons/Icon-48.png and /dev/null differ diff --git a/zotero-connectors/icons/Icon-64.png b/zotero-connectors/icons/Icon-64.png deleted file mode 100644 index 343c2085..00000000 Binary files a/zotero-connectors/icons/Icon-64.png and /dev/null differ diff --git a/zotero-connectors/icons/Icon-96.png b/zotero-connectors/icons/Icon-96.png deleted file mode 100644 index 00a58705..00000000 Binary files a/zotero-connectors/icons/Icon-96.png and /dev/null differ diff --git a/zotero-connectors/init.sh b/zotero-connectors/init.sh deleted file mode 100755 index fd5a416e..00000000 --- a/zotero-connectors/init.sh +++ /dev/null @@ -1,9 +0,0 @@ -CONFIG_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/config.sh" -if [ -f "$CONFIG_PATH" ]; then - . "$CONFIG_PATH" -fi - -if [ -z "${BUILD_DIR:-}" ]; then - BUILD_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/dist" - mkdir -p "$BUILD_DIR" -fi diff --git a/zotero-connectors/package-lock.json b/zotero-connectors/package-lock.json deleted file mode 100644 index 817c469d..00000000 --- a/zotero-connectors/package-lock.json +++ /dev/null @@ -1,9451 +0,0 @@ -{ - "name": "zotero-connectors", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/cli": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.8.3.tgz", - "integrity": "sha512-K2UXPZCKMv7KwWy9Bl4sa6+jTNP7JyDiHKzoOiUUygaEDbC60vaargZDnO9oFMvlq8pIKOOyUUgeMYrsaN9djA==", - "dev": true, - "requires": { - "chokidar": "^2.1.8", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.13", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - } - }, - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "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 - } - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", - "dev": true - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - } - }, - "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" - } - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/formatio": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", - "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^5.0.2" - } - }, - "@sinonjs/samsam": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", - "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@testim/chrome-version": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.0.7.tgz", - "integrity": "sha512-8UT/J+xqCYfn3fKtOznAibsHpiuDshCb0fwgWxRazTT19Igp9ovoXMPhXyLD6m3CKQGTMHgqoxaFfMWaL40Rnw==", - "dev": true - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.0.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.19.tgz", - "integrity": "sha512-yf3BP/NIXF37BjrK5klu//asUWitOEoUP5xE1mhSUjazotwJ/eJDgEmMQNlOeWOVv72j24QQ+3bqXHE++CFGag==", - "dev": true - }, - "@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "acorn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", - "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", - "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", - "dev": true - }, - "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "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" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "dev": true, - "requires": { - "follow-redirects": "1.5.10" - } - }, - "babel-helper-evaluate-path": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", - "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==", - "dev": true - }, - "babel-helper-flip-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", - "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=", - "dev": true - }, - "babel-helper-is-nodes-equiv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", - "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", - "dev": true - }, - "babel-helper-is-void-0": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", - "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=", - "dev": true - }, - "babel-helper-mark-eval-scopes": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", - "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=", - "dev": true - }, - "babel-helper-remove-or-void": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", - "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=", - "dev": true - }, - "babel-helper-to-multiple-sequence-expressions": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", - "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==", - "dev": true - }, - "babel-plugin-minify-builtins": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", - "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==", - "dev": true - }, - "babel-plugin-minify-constant-folding": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", - "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-minify-dead-code-elimination": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz", - "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-mark-eval-scopes": "^0.4.3", - "babel-helper-remove-or-void": "^0.4.3", - "lodash": "^4.17.11" - } - }, - "babel-plugin-minify-flip-comparisons": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", - "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-minify-guarded-expressions": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", - "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3" - } - }, - "babel-plugin-minify-infinity": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", - "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=", - "dev": true - }, - "babel-plugin-minify-mangle-names": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz", - "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", - "dev": true, - "requires": { - "babel-helper-mark-eval-scopes": "^0.4.3" - } - }, - "babel-plugin-minify-numeric-literals": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", - "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=", - "dev": true - }, - "babel-plugin-minify-replace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", - "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==", - "dev": true - }, - "babel-plugin-minify-simplify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", - "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.5.0" - } - }, - "babel-plugin-minify-type-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", - "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-transform-inline-consecutive-adds": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", - "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=", - "dev": true - }, - "babel-plugin-transform-member-expression-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", - "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=", - "dev": true - }, - "babel-plugin-transform-merge-sibling-variables": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz", - "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=", - "dev": true - }, - "babel-plugin-transform-minify-booleans": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", - "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=", - "dev": true - }, - "babel-plugin-transform-property-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", - "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "babel-plugin-transform-regexp-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", - "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=", - "dev": true - }, - "babel-plugin-transform-remove-console": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=", - "dev": true - }, - "babel-plugin-transform-remove-debugger": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", - "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=", - "dev": true - }, - "babel-plugin-transform-remove-undefined": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", - "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-transform-simplify-comparison-operators": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", - "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=", - "dev": true - }, - "babel-plugin-transform-undefined-to-void": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", - "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=", - "dev": true - }, - "babel-preset-minify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz", - "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==", - "dev": true, - "requires": { - "babel-plugin-minify-builtins": "^0.5.0", - "babel-plugin-minify-constant-folding": "^0.5.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.1", - "babel-plugin-minify-flip-comparisons": "^0.4.3", - "babel-plugin-minify-guarded-expressions": "^0.4.4", - "babel-plugin-minify-infinity": "^0.4.3", - "babel-plugin-minify-mangle-names": "^0.5.0", - "babel-plugin-minify-numeric-literals": "^0.4.3", - "babel-plugin-minify-replace": "^0.5.0", - "babel-plugin-minify-simplify": "^0.5.1", - "babel-plugin-minify-type-constructors": "^0.4.3", - "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", - "babel-plugin-transform-member-expression-literals": "^6.9.4", - "babel-plugin-transform-merge-sibling-variables": "^6.9.4", - "babel-plugin-transform-minify-booleans": "^6.9.4", - "babel-plugin-transform-property-literals": "^6.9.4", - "babel-plugin-transform-regexp-constructors": "^0.4.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-plugin-transform-remove-debugger": "^6.9.4", - "babel-plugin-transform-remove-undefined": "^0.5.0", - "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", - "babel-plugin-transform-undefined-to-void": "^6.9.4", - "lodash": "^4.17.11" - } - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "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==", - "dev": true - }, - "binary-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", - "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.0.tgz", - "integrity": "sha512-Xpgy0IwHK2N01ncykXTy6FpCWuM+CJSHoPVBLyNqyrWxsedpLvwsYUhf0ME3WRFNUhos0dMamz9cOS/xRDtU5g==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chromedriver": { - "version": "81.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-81.0.0.tgz", - "integrity": "sha512-BA++IQ7O1FzHmNpzMlOfLiSBvPZ946uuhtJjZHEIr/Gb+Ha9jiuGbHiT45l6O3XGbQ8BAwvbmdisjl4rTxro4A==", - "dev": true, - "requires": { - "@testim/chrome-version": "^1.0.7", - "axios": "^0.19.2", - "del": "^5.1.0", - "extract-zip": "^2.0.0", - "mkdirp": "^1.0.4", - "tcp-port-used": "^1.0.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "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==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, - "commander": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", - "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "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=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "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=", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "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=", - "dev": true - }, - "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 - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - }, - "dependencies": { - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "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==", - "dev": true - }, - "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==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "geckodriver": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-1.19.1.tgz", - "integrity": "sha512-xWL/+eEhQ6+t98rc1c+xVM3hshDJibXtZf9WJA3sshxq4k5L1PBwfmswyBmmlKUfBr4xuC256gLVC2RxFhiCsQ==", - "dev": true, - "requires": { - "adm-zip": "0.4.11", - "bluebird": "3.4.6", - "got": "5.6.0", - "https-proxy-agent": "3.0.0", - "tar": "4.4.2" - }, - "dependencies": { - "bluebird": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz", - "integrity": "sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8=", - "dev": true - } - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "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 - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "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" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "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 - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "got": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", - "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", - "dev": true, - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-plain-obj": "^1.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^2.0.0", - "unzip-response": "^1.0.0", - "url-parse-lax": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "gulp-concat": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", - "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", - "dev": true, - "requires": { - "concat-with-sourcemaps": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulp-plumber": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", - "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "fancy-log": "^1.3.2", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.0.tgz", - "integrity": "sha512-y4jAxNEihqvBI5F3SaO2rtsjIOnnNA8sEbuiP+UhJZJHeM2NRm6c09ax2tgqme+SgUUvjao2fJXF4h3D6Cb2HQ==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } - } - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", - "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^2.1.0", - "is-url": "^1.2.2" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "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 - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "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==", - "dev": true - }, - "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==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "just-extend": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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 - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.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==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "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==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "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=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "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==", - "dev": true - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.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=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "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.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "module-deps": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", - "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "natives": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nise": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", - "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "dependencies": { - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - } - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^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.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.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==", - "dev": true - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz", - "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "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=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "dev": true, - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - } - }, - "react-dom-factories": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/react-dom-factories/-/react-dom-factories-1.0.2.tgz", - "integrity": "sha1-63cFxNs2+1AbOqOP91lhaqD/luA=", - "dev": true - }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - }, - "dependencies": { - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "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" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "selenium-webdriver": { - "version": "4.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", - "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", - "dev": true, - "requires": { - "jszip": "^3.2.2", - "rimraf": "^2.7.1", - "tmp": "0.0.30" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "shell-quote": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.1.tgz", - "integrity": "sha512-2kUqeAGnMAu6YrTPX4E3LfxacH9gKljzVjlkUeSqY0soGwK4KLl7TURXCem712tkhBCeeaFP9QK4dKn88s3Icg==", - "dev": true - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "sinon": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz", - "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.2", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/formatio": "^5.0.1", - "@sinonjs/samsam": "^5.0.3", - "diff": "^4.0.2", - "nise": "^4.0.1", - "supports-color": "^7.1.0" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", - "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6", - "xtend": "^4.0.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, - "tar": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.2.tgz", - "integrity": "sha512-BfkE9CciGGgDsATqkikUHrQrraBCO+ke/1f6SFAEMnxyyfN9lxC+nW1NFWMpqH865DhHIy9vQi682gk1X7friw==", - "dev": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "tcp-port-used": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", - "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", - "dev": true, - "requires": { - "debug": "4.1.0", - "is2": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "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==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "type": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.3.tgz", - "integrity": "sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - } - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "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==", - "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=", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "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.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/zotero-connectors/package.json b/zotero-connectors/package.json deleted file mode 100644 index eff865de..00000000 --- a/zotero-connectors/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "zotero-connectors", - "devDependencies": { - "@babel/cli": "^7.8.3", - "@babel/core": "^7.8.3", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/preset-react": "^7.8.3", - "babel-preset-minify": "^0.5.1", - "bluebird": "^3.5.3", - "browserify": "^16.5.0", - "chai": "^4.2.0", - "chalk": "^2.4.1", - "chromedriver": "^81.0.0", - "geckodriver": "^1.19.1", - "gulp": "^4.0.2", - "gulp-concat": "^2.6.1", - "gulp-plumber": "^1.2.1", - "merge-stream": "^2.0.0", - "mocha": "^7.1.2", - "prop-types": "^15.6.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-dom-factories": "^1.0.2", - "regenerator-runtime": "^0.12.1", - "selenium-webdriver": "^4.0.0-alpha.7", - "semver": "^5.6.0", - "sinon": "^9.0.2", - "through2": "^2.0.5", - "yargs": "^6.0.0" - }, - "dependencies": { - "natives": "^1.1.6" - } -} diff --git a/zotero-connectors/scripts/chrome/build_zip b/zotero-connectors/scripts/chrome/build_zip deleted file mode 100755 index 28d4cfb6..00000000 --- a/zotero-connectors/scripts/chrome/build_zip +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" -BUILD_DIR="$( cd "$ROOT_DIR"/build && pwd )" - -rm -rf "$ROOT_DIR"/dist/Zotero_Connector*.zip - -cd "$BUILD_DIR/chrome/" - -version=$(cat manifest.json | jq -r .version) -filename="Zotero_Connector-$version.zip" - -zip -r ../$filename * -mv ../$filename "$ROOT_DIR/dist" - -echo -echo "Built $ROOT_DIR/dist/$filename" diff --git a/zotero-connectors/scripts/firefox/build_and_deploy b/zotero-connectors/scripts/firefox/build_and_deploy deleted file mode 100755 index 03f96a49..00000000 --- a/zotero-connectors/scripts/firefox/build_and_deploy +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" -BUILD_DIR="$ROOT_DIR"/build - -. "$ROOT_DIR/config.sh" - -function usage { - echo "Current '$channel' version: `$DIR/get_current_version $channel`" >&2 - echo >&2 - cat >&2 < beta9 -# https://github.com/npm/node-semver/issues/30#issuecomment-64028037 -CMP=$(node -e "console.log(require('semver').compare('$version'.replace('beta', 'beta.'), '$current_version'.replace('beta', 'beta.'), true))") -if [ "$CMP" = "-1" ]; then - echo "$version must be greater than $current_version" - exit 1 -fi -if [ "$CMP" = "0" ]; then - echo "$version is the current version" - exit 1 -fi -if [ "$CMP" != "1" ]; then - echo "Unexpected response $CMP from semver.compare()" - exit 1 -fi - -cd "$ROOT_DIR" - -echo -n "Building $version" -sleep 1 -echo -n . -sleep 1 -echo -n . -sleep 1 -echo . -sleep 1 - -./build.sh -p bs -v "$version" - -if [ $channel != "release" ]; then - # Add Git commit hash to XPI files - hash=$(git rev-parse --short HEAD) - echo "$version+$hash" > $BUILD_DIR/firefox/build_id -fi - -FIREFOX_UPDATE_URL=${FIREFOX_UPDATE_URL/CHANNEL/$channel} -cat "$BUILD_DIR/firefox/manifest.json" | jq ".applications.gecko.update_url = \"$FIREFOX_UPDATE_URL\"" > $BUILD_DIR/firefox/manifest.json-new -mv $BUILD_DIR/firefox/manifest.json-new $BUILD_DIR/firefox/manifest.json - -echo -echo manifest.json: -echo -grep '"version"' $BUILD_DIR/firefox/manifest.json -grep update_url $BUILD_DIR/firefox/manifest.json -echo -sleep 2 - -cd "$DIR" -./sign_xpi -echo "Pushing XPI" - -./push_xpi $channel -if [ $channel != "release" ]; then - ./set_last_rev $channel $main_version $rev -fi diff --git a/zotero-connectors/scripts/firefox/get_current_version b/zotero-connectors/scripts/firefox/get_current_version deleted file mode 100755 index 7844c821..00000000 --- a/zotero-connectors/scripts/firefox/get_current_version +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" - -. "$ROOT_DIR/config.sh" - -channel=${1:-release} - -ssh $DEPLOY_HOST cat "$MANIFEST_DEPLOY_PATH/$channel/updates.json" | jq -r '.addons["zotero@chnm.gmu.edu"].updates[-1].version' diff --git a/zotero-connectors/scripts/firefox/get_last_rev b/zotero-connectors/scripts/firefox/get_last_rev deleted file mode 100755 index f30d1f2a..00000000 --- a/zotero-connectors/scripts/firefox/get_last_rev +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" - -. "$ROOT_DIR/config.sh" - -function usage { - echo "Usage: $0 CHANNEL VERSION" >&2 - exit 1 -} - -if [[ -z "${1:-}" ]] || [[ -z "${2:-}" ]]; then - usage -fi - -channel=$1 -version=$2 - -ssh $DEPLOY_HOST "test -e $MANIFEST_DEPLOY_PATH/$channel/lastrev-$version && cat $MANIFEST_DEPLOY_PATH/$channel/lastrev-$version" || echo -n 0 \ No newline at end of file diff --git a/zotero-connectors/scripts/firefox/get_xpi_path b/zotero-connectors/scripts/firefox/get_xpi_path deleted file mode 100755 index 05abe46f..00000000 --- a/zotero-connectors/scripts/firefox/get_xpi_path +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" -BUILD_DIR="$( cd "$ROOT_DIR"/build && pwd )" - -if [ "$( ls "$BUILD_DIR"/*.xpi | wc -l )" -gt 1 ]; then - echo "More than one XPI found" - exit 1 -fi - -ls "$BUILD_DIR"/*.xpi diff --git a/zotero-connectors/scripts/firefox/push_xpi b/zotero-connectors/scripts/firefox/push_xpi deleted file mode 100755 index 5d29b864..00000000 --- a/zotero-connectors/scripts/firefox/push_xpi +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" -BUILD_DIR="$( cd "$ROOT_DIR"/build && pwd )" - -. "$ROOT_DIR/config.sh" - -cd "$DIR" - -channel=${1:-} -if [ -z "$channel" ]; then - echo "Usage: $0 CHANNEL" >&2 - exit 1 -fi - -XPI="`./get_xpi_path`" -VERSION="$( cat "$BUILD_DIR/firefox/manifest.json" | jq -r .version )" -HASH="$( shasum -a 256 "$XPI" | cut -d' ' -f1 )" - -./upload_signed_xpi $channel -scp $DEPLOY_HOST:"$MANIFEST_DEPLOY_PATH/$channel/updates.json" "$BUILD_DIR/updates.json" -./update_manifest -f "$BUILD_DIR/updates.json" -c $channel -v $VERSION -s $HASH -scp "$BUILD_DIR/updates.json" $DEPLOY_HOST:"$MANIFEST_DEPLOY_PATH/$channel/updates.json" -rm "$BUILD_DIR/updates.json" - -ssh $DEPLOY_HOST $DEPLOY_CMD diff --git a/zotero-connectors/scripts/firefox/run_xpi b/zotero-connectors/scripts/firefox/run_xpi deleted file mode 100755 index f6f087b7..00000000 --- a/zotero-connectors/scripts/firefox/run_xpi +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" - -cd $ROOT_DIR -web-ext run -s build/firefox -a build $* diff --git a/zotero-connectors/scripts/firefox/set_last_rev b/zotero-connectors/scripts/firefox/set_last_rev deleted file mode 100755 index 6ced0da3..00000000 --- a/zotero-connectors/scripts/firefox/set_last_rev +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" - -. "$ROOT_DIR/config.sh" - -function usage { - echo "Usage: $0 CHANNEL VERSION REV" >&2 - exit 1 -} - -if [[ -z "${1:-}" ]] || [[ -z "${2:-}" ]] || [[ -z "${3:-}" ]]; then - usage -fi - -channel=$1 -version=$2 -rev=$3 - -ssh $DEPLOY_HOST "echo -n $rev > $MANIFEST_DEPLOY_PATH/$channel/lastrev-$version" \ No newline at end of file diff --git a/zotero-connectors/scripts/firefox/sign_xpi b/zotero-connectors/scripts/firefox/sign_xpi deleted file mode 100755 index d25ccca7..00000000 --- a/zotero-connectors/scripts/firefox/sign_xpi +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" -BUILD_DIR="$( cd "$ROOT_DIR"/build && pwd )" - -. "$ROOT_DIR/config.sh" - -rm -f "$BUILD_DIR"/*.xpi - -VERSION="$( cat "$BUILD_DIR/firefox/manifest.json" | jq -r .version )" -echo "Signing $VERSION" -sleep 3 -web-ext sign -s "$BUILD_DIR/firefox" -a $BUILD_DIR diff --git a/zotero-connectors/scripts/firefox/update_manifest b/zotero-connectors/scripts/firefox/update_manifest deleted file mode 100755 index 098c46b7..00000000 --- a/zotero-connectors/scripts/firefox/update_manifest +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -""" -Update a WebExtension build manifest with info on a given build -""" -import argparse -import sys -import shutil -import json -import traceback -from distutils.version import LooseVersion - -parser = argparse.ArgumentParser( - description='Update a WebExtension build manifest with info on a given build', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - -parser.add_argument('-f', '--file', required=True, help="path to updates.json") -parser.add_argument('-c', '--channel', required=True, help='release channel') -parser.add_argument('-v', '--version', required=True, help='version number of XPI') -parser.add_argument('-s', '--sha', required=True, help="SHA256 of XPI") - -args = parser.parse_args() - -def main(): - try: - file = args.file - version = args.version - channel = args.channel - sha = args.sha - - # Read in existing file - with open(file) as f: - manifest = json.loads(f.read()) - - updates = manifest['addons']['zotero@chnm.gmu.edu']['updates'] - - if any(u['version'] == version for u in updates): - sys.stderr.write( - "Update with version '{0}' already exists in manifest\n" - .format(version) - ) - return 1 - - url = ("https://download.zotero.org/connector/" + - "firefox/{0}/Zotero_Connector-{1}.xpi".format(channel, version)) - min_version = "51.0" - updates.append({ - "version": version, - "update_link": url, - "update_hash": "sha256:" + sha, - "applications": { - "gecko": { - "strict_min_version": min_version - } - } - }) - updates = sorted(updates, key=lambda item: LooseVersion(item['version'])) - - # Keep last 5 versions - manifest['addons']['zotero@chnm.gmu.edu']['updates'] = updates[-5:] - - # Back up JSON file - shutil.copy2(file, file + '.bak') - - # Write new file - manifest = json.dumps(manifest, indent=2) - with open(file, 'w') as f: - f.write(manifest + "\n") - - print(manifest) - - return 0 - - except Exception as err: - sys.stderr.write("\n" + traceback.format_exc()) - return 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/zotero-connectors/scripts/firefox/upload_signed_xpi b/zotero-connectors/scripts/firefox/upload_signed_xpi deleted file mode 100755 index e2be6234..00000000 --- a/zotero-connectors/scripts/firefox/upload_signed_xpi +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -eu - -# -# Upload signed XPI to S3 with correct content type -# - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" -BUILD_DIR="$( cd "$DIR"/../../build && pwd )" - -. "$ROOT_DIR/config.sh" - -channel=${1:-} -if [ -z "$channel" ]; then - echo "Usage: $0 CHANNEL" >&2 - exit 1 -fi - -S3_PATH="$S3_BUCKET/connector/firefox/$channel/" -XPI="`$DIR/get_xpi_path`" -VERSION="$( unzip -p "$XPI" manifest.json | jq -r .version )" - -if ! unzip -l "$XPI" | grep --quiet META-INF; then - echo "$XPI is not signed" - exit 1 -fi - -aws s3 cp --content-type application/x-xpinstall "$XPI" s3://${S3_PATH}Zotero_Connector-$VERSION.xpi -rm $XPI diff --git a/zotero-connectors/scripts/gulpfile_bookmarklet.js b/zotero-connectors/scripts/gulpfile_bookmarklet.js deleted file mode 100644 index 611057b7..00000000 --- a/zotero-connectors/scripts/gulpfile_bookmarklet.js +++ /dev/null @@ -1,249 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -'use strict'; - -const fs = require('fs').promises; -const { basename, join, extname } = require('path'); -const through = require('through2'); -const gulp = require('gulp'); -const mergeStream = require('merge-stream'); -const plumber = require('gulp-plumber'); -const concat = require('gulp-concat'); -const babel = require('@babel/core'); -const replaceBrowser = require('./replace_browser'); - -const xpcomDir = './src/zotero/chrome/content/zotero/xpcom'; - -const sources = { - 'common.js': [ - "./src/common/zotero.js", - "./src/bookmarklet/zotero_config.js", - "./src/common/promise.js", - join(xpcomDir, "debug.js"), - "./src/common/errors_webkit.js", - "./src/common/http.js", - join(xpcomDir, "xregexp/xregexp.js"), - join(xpcomDir, "xregexp/addons/build.js"), - join(xpcomDir, "xregexp/addons/matchrecursive.js"), - join(xpcomDir, "xregexp/addons/unicode/unicode-base.js"), - join(xpcomDir, "xregexp/addons/unicode/unicode-categories.js"), - join(xpcomDir, "xregexp/addons/unicode/unicode-zotero.js"), - join(xpcomDir, "utilities.js"), - "./src/common/utilities.js", - join(xpcomDir, "translation/translator.js"), - "./src/bookmarklet/translators.js", - "./src/bookmarklet/messages.js", - "./src/bookmarklet/i18n.js", - "./src/messages.json" - ], - 'iframe.js': [ - "./src/common/connector.js", - join(xpcomDir, "translation/tlds.js"), - "./src/common/messaging.js", - "./src/bookmarklet/iframe_base.js" - ], - 'inject.js': [ - "./src/common/cachedTypes.js", - join(xpcomDir, "date.js"), - "./src/common/inject/http.js", - join(xpcomDir, "openurl.js"), - join(xpcomDir, "rdf/init.js"), - join(xpcomDir, "rdf/uri.js"), - join(xpcomDir, "rdf/term.js"), - join(xpcomDir, "rdf/identity.js"), - join(xpcomDir, "rdf/match.js"), - join(xpcomDir, "rdf/rdfparser.js"), - join(xpcomDir, "translation/translate.js"), - "./src/common/translate_item.js", - "./src/common/inject/translate_inject.js", - "./src/zotero/resource/schema/connectorTypeSchemaData.js", - join(xpcomDir, "utilities_translate.js"), - "./src/bookmarklet/messaging_inject.js", - "./src/bookmarklet/inject_base.js", - "./src/common/inject/progressWindow_inject.js", - ], - "progressWindow/progressWindow.js": [ - "./node_modules/react/umd/react.production.min.js", - "./node_modules/react-dom/umd/react-dom.production.min.js", - "./node_modules/prop-types/prop-types.min.js", - "./node_modules/react-dom-factories/index.js", - "./src/common/zotero.js", - "./src/bookmarklet/zotero_config.js", - "./src/common/ui/tree/tree.js", - "./src/common/ui/ProgressWindow.jsx", - "./src/common/promise.js", - "./src/common/messages.js", - "./src/bookmarklet/messaging_inject.js", - "./src/common/progressWindow/progressWindow.js", - "./src/bookmarklet/i18n.js", - "./src/messages.json" - ], - "progressWindow/progressWindow.html": ["./src/common/progressWindow/progressWindow.html"], - "itemSelector/itemSelector.html": ["./src/common/itemSelector/itemSelector.html"], - "itemSelector/itemSelector.js": [ - './src/common/itemSelector/itemSelector.js', - './src/bookmarklet/itemSelector/itemSelector_browserSpecific.js' - ], - "loader.js": ["./src/bookmarklet/loader.js"] -} - -function processFile(argv) { return through.obj(async function(file, enc, cb) { - console.log(file.path.slice(file.cwd.length)); - var fileName = basename(file.path); - var ext = fileName.split('.')[1]; - - switch (fileName) { - case 'messages.json': - file.contents = Buffer.from("Zotero.i18n.localeJSON = " + file.contents.toString()); - break; - case 'zotero.js': - let contents = file.contents.toString() - .replace('this.version = [^;]*', `this.version = "${argv.version}";`); - if (!argv.p) { - contents = contents.replace('"debug.log": false', '"debug.log": true'); - } - contents = replaceBrowser(contents, { bookmarklet: true }); - file.contents = Buffer.from(contents); - break; - case 'zotero_config.js': - if (!argv.p) { - file.contents = Buffer.from(file.contents.toString() - .replace(/www\.zotero\.org/g, 'staging.zotero.net') - .replace(/REPOSITORY_URL:.*/, 'REPOSITORY_URL: "https://www.zotero.org/repo",') - .replace(/API_URL:.*/, 'API_URL: "https://apidev.zotero.org/",') - ); - } - break; - case 'progressWindow.html': - case 'itemSelector.html': - file.contents = Buffer.from(file.contents.toString() - .replace(/([\s\S]*?)/g, '') - .replace(/([\s\S]*?)/g, '') - ); - break; - case 'loader.js': - if (!argv.p) { - file.contents = Buffer.from(file.contents.toString() - .replace('www.zotero.org', 'staging.zotero.net')); - } else { - let config = await fs.readFile(join(__dirname, '../src/bookmarklet/zotero_config.js'), 'utf-8'); - let url = /BOOKMARKLET_URL: ?['"]([^'"]*)['"]/.exec(config)[1]; - file.contents = Buffer.from(file.contents.toString() - .replace('https://www.zotero.org/bookmarklet/', url)); - } - } - - - var plugins = []; - if (ext == 'jsx') { - plugins = [ - ...plugins, - '@babel/plugin-transform-react-jsx', - '@babel/plugin-proposal-class-properties' - ]; - try { - file.contents = new Buffer.from(babel.transform(file.contents, { plugins }).code); - } catch (e) { - console.log(e.message); - return; - } - } - - - this.push(file.clone({contents:false})); cb(); -})} - -function postProcess(argv) { return through.obj(function(file, enc, cb) { - if (extname(file.path) == '.js' && argv.p) { - let presets = []; - // presets = [...presets, 'env']; - if (argv.p) { - presets = [...presets, ['minify', {builtIns: false}]]; - } - try { - let fileStr = file.contents; - // if (file.path.split('.')[1] == '.js') { - // fileStr = "require('regenerator-runtime/runtime');" + fileStr; - // } - file.contents = new Buffer.from(babel.transform(fileStr, { presets }).code); - } catch (e) { - console.error(e); - return; - } - // browserify(file).bundle((err, buf) => {file.contents = buf; this.push(file.clone({contents: false})); cb()}); - } - this.push(file.clone({contents: false})); cb(); -})} - -function logFinalOutput() { - return through.obj(function(file, enc, cb) { - console.log(`-> ${basename(file.path)}`); - this.push(file); cb(); - }) -} - -function watchBookmarklet(argv) {return function() { - var watcher = gulp.watch(['./src/bookmarklet/**', './src/common/**']); - watcher.on('change', function(event) { - for (let key in sources) { - let shouldProcess = false; - for (let source of sources[key]) { - if (event.path.includes(source.substr(2))) { - shouldProcess = true; - break; - } - } - if (shouldProcess) { - console.log(`${event.path} changed`); - gulp.src(sources[key]) - .pipe(plumber()) - .pipe(processFile(argv)) - .pipe(concat(key)) - .pipe(postProcess(argv)) - .pipe(logFinalOutput()) - .pipe(gulp.dest('./build/bookmarklet/')); - } - } - - }); -}} - -function processBookmarkletScripts(argv) {return function() { - let streams = []; - for (let key in sources) { - streams.push(gulp.src(sources[key]).pipe(plumber()) - .pipe(processFile(argv)) - .pipe(concat(key)) - .pipe(postProcess(argv)) - .pipe(logFinalOutput()) - .pipe(gulp.dest('./build/bookmarklet/'))); - } - return mergeStream(...streams); -}} - -module.exports = { - watchBookmarklet, processBookmarkletScripts -}; diff --git a/zotero-connectors/scripts/replace_browser.js b/zotero-connectors/scripts/replace_browser.js deleted file mode 100644 index 5eadf7cd..00000000 --- a/zotero-connectors/scripts/replace_browser.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2020 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -module.exports = function(filetext, config) { - // Defaults to all false, so just need to set true flags in the build script - config = Object.assign({ - bookmarklet: false, - firefox: false, - safari: false, - browserExt: false - }, config); - for (let browserOption in config) { - let value = config[browserOption]; - browserOption = browserOption[0].toUpperCase() + browserOption.slice(1); - let regexp = new RegExp(`/\\* this\\.is${browserOption} = SET IN BUILD SCRIPT \\*/`); - filetext = filetext.replace(regexp, - `this.is${browserOption} = ${value}`) - } - return filetext -} diff --git a/zotero-connectors/scripts/safari/get_extz_path b/zotero-connectors/scripts/safari/get_extz_path deleted file mode 100755 index 85165981..00000000 --- a/zotero-connectors/scripts/safari/get_extz_path +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" - -. "$ROOT_DIR/init.sh" - -if [ "$( ls "$BUILD_DIR"/*.safariextz | wc -l )" -gt 1 ]; then - echo "More than one .safariextz found" >&2 - exit 1 -fi - -ls "$BUILD_DIR"/*.safariextz diff --git a/zotero-connectors/scripts/safari/upload_signed_extz b/zotero-connectors/scripts/safari/upload_signed_extz deleted file mode 100755 index 214078dd..00000000 --- a/zotero-connectors/scripts/safari/upload_signed_extz +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -eu - -# -# Upload signed .safariextz to S3 -# - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$( cd "$DIR"/../.. && pwd )" - -. "$ROOT_DIR/init.sh" - -S3_PATH="$S3_BUCKET/connector/safari/" -EXTZ="`"$DIR"/get_extz_path`" -VERSION="$( xar -x -f "$EXTZ" --to-stdout | grep -C 2 CFBundleVersion | head -n 2 | tail -n 1 | sed -n -E 's/.*([0-9.]+(beta[0-9]+)?)<\/string>.*/\1/p' )" - -if [ -z "$VERSION" ]; then - echo "Error extracting version from Info.plist" - exit 1 -fi - -# Check signature -CERT_FILE="$BUILD_DIR/safari_certs.pem" -xar -f "$EXTZ" --extract-CAfile "$CERT_FILE" - -if ! openssl x509 -subject -in "$CERT_FILE" -noout | grep --quiet $SAFARI_DEVELOPER_ID; then - echo "$EXTZ is not signed" - exit 1 -fi -rm "$CERT_FILE" - -aws s3 cp --content-type application/octet-stream "$EXTZ" s3://${S3_PATH}Zotero_Connector-$VERSION.safariextz -rm "$EXTZ" diff --git a/zotero-connectors/src/bookmarklet/auth_complete.html b/zotero-connectors/src/bookmarklet/auth_complete.html deleted file mode 100644 index e3835d41..00000000 --- a/zotero-connectors/src/bookmarklet/auth_complete.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - -Authorization complete. - diff --git a/zotero-connectors/src/bookmarklet/bookmarklet_upload.html b/zotero-connectors/src/bookmarklet/bookmarklet_upload.html deleted file mode 100644 index 60ec7685..00000000 --- a/zotero-connectors/src/bookmarklet/bookmarklet_upload.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/zotero-connectors/src/bookmarklet/debug_mode.html b/zotero-connectors/src/bookmarklet/debug_mode.html deleted file mode 100644 index d4ba1316..00000000 --- a/zotero-connectors/src/bookmarklet/debug_mode.html +++ /dev/null @@ -1,11 +0,0 @@ - - -Debug Mode for Zotero Bookmarklet - -

    To enable debug mode: -Enable Debug Mode

    - -

    To enable disable mode: -Disable Debug Mode

    - - diff --git a/zotero-connectors/src/bookmarklet/htaccess b/zotero-connectors/src/bookmarklet/htaccess deleted file mode 100644 index fcfa0fab..00000000 --- a/zotero-connectors/src/bookmarklet/htaccess +++ /dev/null @@ -1 +0,0 @@ -Header set Cache-Control "max-age=60" diff --git a/zotero-connectors/src/bookmarklet/i18n.js b/zotero-connectors/src/bookmarklet/i18n.js deleted file mode 100644 index 2a34c0ca..00000000 --- a/zotero-connectors/src/bookmarklet/i18n.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * This file gets concated with messages.json for static eng locale strings in the bookmarklet - */ -Zotero.i18n = { - init: async () => 0, - getString: function(name, substitutions) { - if (!this.localeJSON) { - Zotero.logError(new Error(`i18n.getString called for ${name} before i18n.localeJSON was loaded.`)); - return '{' + name + '}'; - } - var str = this.localeJSON[name] && this.localeJSON[name].message; - if (!str) { - Zotero.logError(new Error(`Localized string '${name}' is not defined.`)); - return '{' + name + '}'; - } - if (substitutions != undefined) { - if (!Array.isArray(substitutions)) { - substitutions = [substitutions]; - } - for (let i = 0; i < substitutions.length; i++) { - let sub = substitutions[i]; - str = str.replace(new RegExp(`\\$${i+1}`, 'g'), sub) - } - } - - return str; - } -}; diff --git a/zotero-connectors/src/bookmarklet/iframe.html b/zotero-connectors/src/bookmarklet/iframe.html deleted file mode 100644 index 5f32cc91..00000000 --- a/zotero-connectors/src/bookmarklet/iframe.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/zotero-connectors/src/bookmarklet/iframe_base.js b/zotero-connectors/src/bookmarklet/iframe_base.js deleted file mode 100644 index a1f29d43..00000000 --- a/zotero-connectors/src/bookmarklet/iframe_base.js +++ /dev/null @@ -1,324 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.API = new function() { - /** - * Performs authorization - * @param {Function} callback Callback to execute when auth is complete. The first argument - * passed to the callback indicates whether authorization succeeded - * successfully. The second will be either a string error message - * (if authorization failed) or the username (if authorization - * succeeded) - */ - this.authorize = function() {return new Zotero.Promise(function(resolve, reject) { - var iframe = document.createElement("iframe"); - iframe.src = ZOTERO_CONFIG.LOGIN_URL; - iframe.style.borderStyle = "none"; - iframe.style.position = "absolute"; - iframe.style.top = "0px"; - iframe.style.left = "0px"; - iframe.style.width = "100%"; - iframe.style.height = "100%"; - iframe.onload = function() { - var win = iframe.contentWindow; - if(win.location.href === ZOTERO_CONFIG.AUTH_COMPLETE_URL) { - // Authorization should be done - var c = _getCredentials(win.document ? win.document : document), - userID = c[0], sessionToken = c[1]; - if(!userID || !sessionToken) { - if(!userID) { - var str = "User ID"; - } else if(!sessionToken) { - var str = "Session token"; - } else { - var str = "User ID and session token"; - } - str += " not available"; - return reject(new Error(str)); - } - - Zotero.Messaging.sendMessage("hideZoteroIFrame", null); - document.body.removeChild(iframe); - return resolve([userID, sessionToken]); - } - }; - - document.body.appendChild(iframe); - Zotero.Messaging.sendMessage("revealZoteroIFrame", null); - })}; - - /** - * Creates a new item - * @param {Object} payload Item(s) to create, in the object format expected by the server. - * @param {String|null} itemKey Parent item key, or null if a top-level item. - * @param {Boolean} [askForAuth] If askForAuth === false, don't ask for authorization if not - * already authorized. - */ - this.createItem = async function(payload, askForAuth) { - var [userID, sessionToken] = _getCredentials(document); - - if((!userID || !sessionToken)) { - if (askForAuth !== false) { - [userID, sessionToken] = await Zotero.API.authorize(); - askForAuth = false; - } else { - throw new Error("Not authorized"); - } - } - - var url = ZOTERO_CONFIG.API_URL+"users/"+userID+"/items?session="+sessionToken; - try { - let xmlhttp = await Zotero.HTTP.request('POST', url, { - body: JSON.stringify(payload), - headers: { - "Content-Type": "application/json", - "Zotero-API-Version":"3" - } - }); - return xmlhttp.responseText; - } catch (e) { - if (e.status == 403 && askForAuth !== false) { - Zotero.debug("API request failed with 403 ("+xmlhttp.responseText+"); reauthorizing"); - return this.createItem(payload, askForAuth); - } - throw (e); - } - }; - - /** - * Uploads an attachment to the Zotero server - * @param {Object} attachment An attachment object. This object must have the following keys
    - * id - a unique identifier for the attachment used to identifiy it in subsequent progress - * messages
    - * data - the attachment contents, as a typed array
    - * filename - a filename for the attachment
    - * key - the attachment item key
    - * md5 - the MD5 hash of the attachment contents
    - * mimeType - the attachment MIME type - */ - this.uploadAttachment = function(attachment) { - const REQUIRED_PROPERTIES = ["id", "data", "filename", "key", "md5", "mimeType"]; - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -var cssBookmarkletFrameDimmer = {"background":"black", "opacity":"0.5", "position":"fixed", - "top":"0px", "bottom":"0px", "left":"0px", "right":"0px", "zIndex":"16777270", - "height":"100%", "width":"100%", "filter":"alpha(opacity = 50);"}; -var cssBookmarkletFrame = {"position":"fixed", "zIndex":"16777271", "top":"50%", - "left":"50%", "background":"white"}; - -Zotero.initInject(); -Zotero.Connector_Types.init(); - -var sessionID; - -/** - * Creates a new frame with the specified width and height - * @constructor - */ -var BookmarkletFrame = function(url, width, height) { - var parentWin = window.parent, - parentDoc = parentWin.document; - - this._appendFrameTo = (document.body ? document.body : document.documentElement); - this._appendDimmerTo = (parentDoc.body ? parentDoc.body : parentDoc.documentElement); - - // Make sure iframe is not bigger than window - var windowWidth, windowHeight; - if(parentWin.innerWidth) { - windowWidth = parentWin.innerWidth; - windowHeight = parentWin.innerHeight; - } else if(parentDoc.documentElement.offsetWidth) { - windowWidth = parentDoc.documentElement.offsetWidth; - windowHeight = parentDoc.documentElement.offsetHeight; - } else if(parentDoc.body && parentDoc.body.offsetWidth) { - windowWidth = parentDoc.body.offsetWidth; - windowHeight = parentDoc.body.offsetHeight; - } else { - windowWidth = windowHeight = Infinity; - } - - // Add width and height - height = Math.min(windowHeight-10, height); - width = Math.min(windowWidth-10, width); - - this._dimmer = parentDoc.createElement("div"); - for(var i in cssBookmarkletFrameDimmer) this._dimmer.style[i] = cssBookmarkletFrameDimmer[i]; - this._appendDimmerTo.appendChild(this._dimmer); - - // Add iframe - if(url) { - this._frame = document.createElement("iframe"); - this._frame.src = url; - } else { - this._frame = zoteroIFrame; - zoteroIFrame.style.display = "block"; - } - this._frame.style.position = "absolute"; - this._frame.style.top = "0px"; - this._frame.style.left = "0px"; - this._frame.style.width = "100%"; - this._frame.style.height = "100%"; - this._frame.style.borderStyle = "none"; - this._frame.setAttribute("frameborder", "0"); - - var frameElementStyle = window.frameElement.style; - for(var i in cssBookmarkletFrame) frameElementStyle[i] = cssBookmarkletFrame[i]; - frameElementStyle.display = "block"; - frameElementStyle.margin = "-"+height/2+"px 0 0 -"+width/2+"px"; - frameElementStyle.width = width+"px"; - frameElementStyle.height = height+"px"; - if(url) this._appendFrameTo.appendChild(this._frame); -} - -/** - * Removes the frame - */ -BookmarkletFrame.prototype.remove = function() { - this._appendDimmerTo.removeChild(this._dimmer); - if(this._frame == zoteroIFrame) { - zoteroIFrame.style.display = "none"; - } else { - this._appendFrameTo.removeChild(this._frame); - } - window.frameElement.style.display = "none"; -} - -function determineAttachmentIcon(attachment) { - if(attachment.linkMode === "linked_url") { - return Zotero.ItemTypes.getImageSrc("attachment-web-link"); - } - var contentType = attachment.contentType || attachment.mimeType; - return Zotero.ItemTypes.getImageSrc( - contentType === "application/pdf" ? "attachment-pdf" : "attachment-snapshot" - ); -} - -var translate = new Zotero.Translate.Web(), - selectCallback, cancelled, haveItem, attachmentsSaving; -translate.setDocument(window.parent.document); -translate.setHandler("select", function(obj, items, callback) { - // If the handler returns a non-undefined value then it is passed - // back to the callback due to backwards compat code in translate.js - (async function() { - // Close the progress window before displaying Select Items - Zotero.Messaging.sendMessage("progressWindow.close", null); - - // If the handler returns a non-undefined value then it is passed - // back to the callback due to backwards compat code in translate.js - try { - let response = await Zotero.Connector.callMethod("getSelectedCollection", {}); - if (response.libraryEditable === false) { - return callback([]); - } - } catch (e) { - // Zotero is online but an error occured anyway, so let's log it and display - // the dialog just in case - if (e.status != 0) { - Zotero.logError(e); - } - } - - var frame = new BookmarkletFrame(ZOTERO_CONFIG.BOOKMARKLET_URL+"itemSelector/itemSelector.html#" - +encodeURIComponent(JSON.stringify([null, items])), 600, 350); - - let deferred = Zotero.Promise.defer(); - selectCallback = deferred.resolve; - let returnItems = await deferred.promise; - frame.remove(); - - // If items were selected, reopen the save popup - if (returnItems && !Zotero.Utilities.isEmpty(returnItems)) { - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - } - - callback(returnItems); - })(); -}); -translate.setHandler("itemSaving", function(obj, item) { - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title - } - ); -}); -translate.setHandler("itemDone", function(obj, dbItem, item) { - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { sessionID }); - // this relays an item from this tab to the top level of the window - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title, - progress: 100 - } - ); - for(var i=0; i { - let keep = !translatorIDs.has(translator.translatorID); - translatorIDs.add(translator.translatorID); - return keep; - }); - selectCallback = cancelled = haveItem = null; - - while (translators && translators.length) { - var translator = translators.shift(); - if (translator.runMode === Zotero.Translator.RUN_MODE_IN_BROWSER) { - Zotero.Messaging.sendMessage('progressWindow.show', [sessionID]); - } else if (translator.runMode === Zotero.Translator.RUN_MODE_ZOTERO_SERVER) { - Zotero.Messaging.sendMessage('progressWindow.show', [sessionID, "Saving to zotero.org…", true]); - } else { - Zotero.Messaging.sendMessage('progressWindow.show', [sessionID, "Saving to Zotero…"]); - } - translate.setTranslator(translator); - - try { - await translate.translate({ sessionID }); - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - cleanup(); - return; - } catch (e) { - if (translator.itemType != "multiple") { - if (translators.length) { - sessionID = Zotero.Utilities.randomString(); - Zotero.Messaging.sendMessage("progressWindow.setSession", sessionID); - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, translators[0].label]); - } - else { - Zotero.logError(e); - try { - sessionID = Zotero.Utilities.randomString(); - Zotero.Messaging.sendMessage("progressWindow.setSession", sessionID); - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, "Save as Webpage"]); - await saveAsWebpage(); - } catch (e) { - Zotero.Messaging.sendMessage("progressWindow.error", ["unexpectedError"]) - } - return cleanup(); - } - } else { - Zotero.Messaging.sendMessage("progressWindow.done", [false]); - return cleanup(); - } - } - } - - await saveAsWebpage(); - cleanup(); -} - -async function saveAsWebpage() { - var doc = window.parent.document; - var title = doc.title; - var image; - - var data = { - sessionID, - url: doc.location.toString(), - cookie: doc.cookie, - html: doc.documentElement.innerHTML, - }; - - if (doc.contentType == 'application/pdf') { - data.pdf = true; - image = "attachment-pdf"; - } else { - image = "webpage"; - } - - Zotero.Messaging.sendMessage('progressWindow.show', [sessionID]); - - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: title, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title: title - } - ); - var clientAvailable = await Zotero.Connector.checkIsOnline(); - if (clientAvailable) { - try { - result = await Zotero.Connector.callMethodWithCookies("saveSnapshot", data); - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { sessionID }); - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: title, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return result; - } catch (e) { - // Unexpected error, including a timeout (which we don't want to - // result in a save to the server, because it's possible the request - // will still be processed) - if (!e.value || e.value.libraryEditable != false) { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'unexpectedError']); - } - throw e; - } - } else { - // Attempt saving to server if not pdf - if (doc.contentType != 'application/pdf') { - let itemSaver = new Zotero.Translate.ItemSaver({}); - let items = await itemSaver.saveAsWebpage(doc); - if (items.length) { - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - id: title, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - } - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return; - } else { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'clientRequired']); - } - } -} - -// Add message listener for translate, so we don't call until the iframe is loaded -Zotero.Messaging.addMessageListener("translate", doTranslate); -Zotero.Messaging.addMessageListener("selectDone", function(returnItems) { - // if no items selected, close save dialog immediately - if(!returnItems || Zotero.Utilities.isEmpty(returnItems)) { - cancelled = true; - Zotero.Messaging.sendMessage('progressWindow.close', null); - } - selectCallback(returnItems); -}); - -// We use these for OAuth, so that we can load the OAuth pages in a child frame of the privileged -// iframe -var revealedFrame; -Zotero.Messaging.addMessageListener("revealZoteroIFrame", function() { - if(revealedFrame) return; - revealedFrame = new BookmarkletFrame(null, 800, 400); -}); -Zotero.Messaging.addMessageListener("hideZoteroIFrame", function() { - revealedFrame.remove(); -}); - -window.zoteroIFrame = null; - -/** - * Load privileged iframe and begin translation - */ -function startTranslation() { - zoteroIFrame = document.createElement("iframe"); - zoteroIFrame.id = "zotero-privileged-iframe"; - zoteroIFrame.src = ZOTERO_CONFIG.BOOKMARKLET_URL+"iframe.html"; - zoteroIFrame.style.display = "none"; - document.body.appendChild(zoteroIFrame); - document.body.style.overflow = "hidden"; -} - -/** - * Remove the frames - */ -async function cleanup() { - await new Promise(function(resolve) { - window.top.addEventListener('message', function progressWindowClose(event) { - var [name, data] = event.data || []; - if (name == 'progressWindowIframe.close') { - resolve(); - } - window.top.removeEventListener('message', progressWindowClose); - }); - }); - zoteroIFrame.parentNode.removeChild(zoteroIFrame); - window.frameElement.parentNode.removeChild(window.frameElement); -} - -if(document.readyState && document.readyState !== "interactive" && document.readyState !== "complete") { - window.onload = startTranslation; -} else { - startTranslation(); -} diff --git a/zotero-connectors/src/bookmarklet/itemSelector/itemSelector_browserSpecific.js b/zotero-connectors/src/bookmarklet/itemSelector/itemSelector_browserSpecific.js deleted file mode 100644 index a55d510d..00000000 --- a/zotero-connectors/src/bookmarklet/itemSelector/itemSelector_browserSpecific.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Sends a message back to the connector parent - */ -function sendMessage() { - if(responseSent) return; - responseSent = true; - window.parent.postMessage(["selectDone", items], "*"); -} diff --git a/zotero-connectors/src/bookmarklet/loader.js b/zotero-connectors/src/bookmarklet/loader.js deleted file mode 100644 index 86369a94..00000000 --- a/zotero-connectors/src/bookmarklet/loader.js +++ /dev/null @@ -1,20 +0,0 @@ -(function() { - var iframe = document.getElementById("zotero-iframe"); - if (iframe) { - iframe.contentWindow.postMessage(['progressWindow.reopen', null], '*'); - return; - }; - - var baseURL = 'https://www.zotero.org/bookmarklet/', - common = baseURL+"common.js", - inject = baseURL+"inject.js"; - - iframe = document.createElement("iframe"), - tag = document.body || document.documentElement; - iframe.id = "zotero-iframe" - iframe.style.display = "none"; - iframe.style.borderStyle = "none"; - iframe.setAttribute("frameborder", "0"); - iframe.src = 'javascript:(function(){document.open();try{window.parent.document;}catch(e){document.domain="' + document.domain.replace(/[\\\"]/g, "\\$0")+'";}document.write(\'\');document.close();})()'; - tag.appendChild(iframe); -})(); diff --git a/zotero-connectors/src/bookmarklet/messages.js b/zotero-connectors/src/bookmarklet/messages.js deleted file mode 100644 index 652fee94..00000000 --- a/zotero-connectors/src/bookmarklet/messages.js +++ /dev/null @@ -1,110 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * The MESSAGES array contains two levels. The first level is the NAMESPACE. The second level is the - * METHOD. This sets up messaging so that a call to Zotero.NAMESPACE.METHOD(..., callback) in the - * injected script calls the same function on the global script, and when the global script calls - * callback(data), the injected script calls callback(data). - * - * If the value in the JSON below is not false, then the function accepts a callback. - * - * In the bookmarklet, the following takes place: - * 1. Injected script calls Zotero.NAMESPACE.METHOD(ARGS, CALLBACK) - * 2. Injected script generates a REQUESTID from the current time, and adds CALLBACK to - * _callbacks indexed by REQUESTID - * 3. Injected script sends message with name NAMESPACE+MESSAGE_SEPARATOR+METHOD and message - * [TABID, REQUESTID, [ARGS]] - * 4. Iframe script receives message - * 5. Iframe script executes Zotero.NAMESPACE.METHOD(ARGS, NEWCALLBACK, TABID) - * 6. Zotero.NAMESPACE.METHOD calls its callback on the global side, with some CALLBACKDATA - * 7. If MESSAGES[NAMESPACE][METHOD] has a preSend function, this gets passed CALLBACKDATA - * and returns some result, which is used as the CALLBACKDATA below - * 8. Global script sends a message with name - * NAMESPACE+MESSAGE_SEPARATOR+METHOD+MESSAGE_SEPARATOR+"Response" and message - * [REQUESTID, CALLBACKDATA] - * 9. Injected script receives message - * 10. If MESSAGES[NAMESPACE][METHOD] has a postReceive function, this gets passed CALLBACKDATA - * and returns some result, which is used as the CALLBACKDATA below - * 11. Injected script calls _callbacks[REQUESTID](CALLBACKDATA) - * - * See other messaging scripts for more details. - */ -window.MESSAGE_SEPARATOR = "."; -window.MESSAGES = { - Translators: { - get: { - background: { - preSend: function(translators) { - return Zotero.Translators.serialize(translators, TRANSLATOR_PASSING_PROPERTIES); - } - }, - inject: { - postReceive: function(translator) { - return new Zotero.Translator(translator); - } - } - }, - getAllForType: { - background: { - preSend: function(translators) { - return Zotero.Translators.serialize(translators, TRANSLATOR_PASSING_PROPERTIES); - }, - }, - inject: { - postReceive: function(translators) { - return translators.map(function(translator) {return new Zotero.Translator(translator)}); - } - } - }, - getWebTranslatorsForLocation: { - background: { - preSend: function(data) { - return [Zotero.Translators.serialize(data[0], TRANSLATOR_PASSING_PROPERTIES), data[1]]; - } - }, - inject: { - postReceive: function(data) { - // Deserialize to class objects - data[0] = data[0].map((translator) => new Zotero.Translator(translator)); - data[1] = data[1].map((proxy) => proxy && new Zotero.Proxy(proxy)); - return [data[0], data[1]]; - } - } - }, - }, - Messaging: { - sendMessage: true - }, - Connector: { - checkIsOnline: true, - callMethod: true, - callMethodWithCookies: true - }, - API: { - createItem: true, - uploadAttachment: false - } -}; diff --git a/zotero-connectors/src/bookmarklet/messaging_inject.js b/zotero-connectors/src/bookmarklet/messaging_inject.js deleted file mode 100644 index 9dc956d2..00000000 --- a/zotero-connectors/src/bookmarklet/messaging_inject.js +++ /dev/null @@ -1,155 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @namespace - * See messages.js for an overview of the message handling process. - */ -Zotero.Messaging = new function() { - var _callbacks = {}, - _messageListeners = {}, - _listenerRegistered = false; - - /** - * Add a message listener - */ - this.addMessageListener = function(messageName, callback) { - _messageListeners[messageName] = callback; - } - - /** - * Adds messaging functions to injected script. This adds Zotero.xxx.yyy functions for all - * entries in MESSAGES. These will send a message to the global script and return immediately. - * When a message is received, they will call the callback function, which should be passed - * as the last argument to Zotero.xxx.yyy. - */ - this.init = function() { - for(var ns in MESSAGES) { - if(!Zotero[ns]) Zotero[ns] = {}; - for(var meth in MESSAGES[ns]) { - Zotero[ns][meth] = new function() { - var messageName = ns+MESSAGE_SEPARATOR+meth; - var messageConfig = MESSAGES[ns][meth]; - return function() { - // make sure last argument is a callback - var callback, callbackArg = null; - if(messageConfig) { - callbackArg = (messageConfig.callbackArg - ? messageConfig.callbackArg : arguments.length-1); - callback = arguments[callbackArg]; - if(typeof callback !== "function") { - // Zotero.debug("Message `"+messageName+"` has no callback arg. It should use the returned promise"); - callbackArg = null; - } - } - - // copy arguments to newArgs - var newArgs = new Array(arguments.length); - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -// Enumeration of types of translators -var TRANSLATOR_TYPES = {"import":1, "export":2, "web":4, "search":8}; - -/** - * Singleton to handle loading and caching of translators - * @namespace - */ -Zotero.Translators = new function() { - var infoRe = /^\s*{[\S\s]*?}\s*?[\r\n]/; - var cache = {}; - - /** - * Gets translator code; only in this implementation - */ - this._getCode = async function(translatorID) { - // try standalone - - try { - return await Zotero.Connector.callMethod("getTranslatorCode", {"translatorID":translatorID}); - } catch(e) {} - - - // then try repo - let xmlhttp = await Zotero.HTTP.request('GET', - ZOTERO_CONFIG.REPOSITORY_URL+"/code/"+ZOTERO_CONFIG.REPOSITORY_CHANNEL+"/"+translatorID); - - - return xmlhttp.responseText; - } - - /** - * Gets the translator that corresponds to a given ID - * @param {String} translatorID The ID of the translator - * @param {Function} [callback] An optional callback to be executed when translators have been - * retrieved. If no callback is specified, translators are - * returned. - */ - this.get = async function(translatorID) { - if (translatorID in cache) return cache[translatorID]; - let code = await this._getCode(translatorID); - - var m = infoRe.exec(code); - if (!m) { - throw new Error("Invalid or missing translator metadata JSON object for " + translatorID); - } - - try { - var metadata = JSON.parse(m[0]); - } catch(e) { - throw new Error("Invalid or missing translator metadata JSON object for " + translatorID); - } - metadata.code = code; - - cache[translatorID] = new Zotero.Translator(metadata); - return cache[translatorID]; - }; - - /** - * Gets all translators for a specific type of translation - * @param {String} type The type of translators to get (import, export, web, or search) - * @param {Function} callback A required callback to be executed when translators have been - * retrieved. - * @param {Boolean} [debugMode] Whether to assume debugging mode. If true, code is included for - * unsupported translators, and code originally retrieved from the - * repo is re-retrieved from Zotero Standalone. - */ - this.getAllForType = function(type) { - throw new Error("Not implemented"); - }; - - /** - * Check the url for potential proxies and deproxify, providing a schema to build - * a proxy object. - * - * @param URL - * @returns {Object} Unproxied url to proxy object - */ - this._getPotentialProxies = function(URL) { - var urlToProxy = {}; - urlToProxy[URL] = null; - - // if there is a subdomain that is also a TLD, also test against URI with the domain - // dropped after the TLD - // (i.e., www.nature.com.mutex.gmu.edu => www.nature.com) - var m = /^(https?:\/\/)([^\/]+)/i.exec(URL); - if (m) { - // First, drop the 0- if it exists (this is an III invention) - var host = m[2]; - if (host.substr(0, 2) === "0-") host = host.substr(2); - var hostnameParts = [host.split(".")]; - if (m[1] == 'https://') { - // try replacing hyphens with dots for https protocol - // to account for EZProxy HttpsHypens mode - hostnameParts.push(host.split('.')); - hostnameParts[1].splice(0, 1, ...(hostnameParts[1][0].replace(/-/g, '.').split('.'))); - } - - for (let i=0; i < hostnameParts.length; i++) { - let parts = hostnameParts[i]; - // If hostnameParts has two entries, then the second one is with replaced hyphens - let dotsToHyphens = i == 1; - // skip the lowest level subdomain, domain and TLD - for (let j=1; j { - Zotero.debug(`Failed to retrieve code for ${translator.translatorID}`); - throw e; - }); - } -} - - -Zotero.Translators.CodeGetter.prototype.getAll = function () { - var codes = []; - // Chain promises with some level of concurrency. If unchained, fires - // off hundreds of xhttprequests on connectors and crashes the extension - for (let i = 0; i < this._translators.length; i++) { - if (i < this._concurrency) { - codes.push(this.getCodeFor(i)); - } else { - codes.push(codes[i-this._concurrency].then(() => this.getCodeFor(i))); - } - } - return Promise.all(codes); -}; - -window.TRANSLATOR_REQUIRED_PROPERTIES = ["translatorID", "translatorType", "label", "creator", "target", - "priority", "lastUpdated"]; -window.TRANSLATOR_PASSING_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES.concat(["browserSupport", "code", "runMode"]); -window.TRANSLATOR_SAVE_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES.concat(["browserSupport"]); - -/** - * Retrieves code for this translator - */ -Zotero.Translator.prototype.getCode = async function() { - if (!this.code) { - this.code = await Zotero.Translators._getCode(this.translatorID); - } - return this.code -} diff --git a/zotero-connectors/src/bookmarklet/upload.js b/zotero-connectors/src/bookmarklet/upload.js deleted file mode 100644 index 76f8008e..00000000 --- a/zotero-connectors/src/bookmarklet/upload.js +++ /dev/null @@ -1,23 +0,0 @@ -var POST_TO = "https://www.zotero.org/"; - -window.onmessage = function(event) { - var data = event.data; - var xhr = new XMLHttpRequest(); - if(xhr.upload) { - xhr.upload.addEventListener("progress", function(event) { - // Don't fire progress on 100% - if(!event.total || event.loaded == event.total) return; - window.parent.postMessage([data.id, event.loaded/event.total*100], POST_TO); - }, false); - } - xhr.open("POST", "/", true); - xhr.onreadystatechange = function() { - if(xhr.readyState !== 4) return; - window.parent.postMessage([data.id, - (this.status == 200 || this.status == 201 ? 100 : false), this.responseText], POST_TO); - }; - xhr.setRequestHeader("Content-Type", data.contentType); - xhr.send(data.data.buffer); -}; - -window.parent.postMessage("", POST_TO); diff --git a/zotero-connectors/src/bookmarklet/zotero_config.js b/zotero-connectors/src/bookmarklet/zotero_config.js deleted file mode 100644 index 2148dd0a..00000000 --- a/zotero-connectors/src/bookmarklet/zotero_config.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -window.ZOTERO_CONFIG = { - REPOSITORY_URL: 'https://www.zotero.org/repo', - REPOSITORY_CHECK_INTERVAL: 86400, // 24 hours - REPOSITORY_RETRY_INTERVAL: 3600, // 1 hour - REPOSITORY_CHANNEL: 'trunk', - BASE_URI: 'http://zotero.org/', - WWW_BASE_URL: 'http://www.zotero.org/', - API_URL: 'https://www.zotero.org/api/', - LOGIN_URL: 'https://www.zotero.org/user/login?bm=1', - BOOKMARKLET_ORIGIN : 'https://www.zotero.org', - BOOKMARKLET_URL: 'https://www.zotero.org/bookmarklet/', - AUTH_COMPLETE_URL: 'https://www.zotero.org/bookmarklet/auth_complete.html', - S3_URL: 'https://zoterofilestorage.s3.amazonaws.com/' -}; diff --git a/zotero-connectors/src/browserExt/background.js b/zotero-connectors/src/browserExt/background.js deleted file mode 100644 index 23242ec3..00000000 --- a/zotero-connectors/src/browserExt/background.js +++ /dev/null @@ -1,936 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009-2012 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.Connector_Browser = new function() { - var _tabInfo = {}; - var _incompatibleVersionMessageShown; - var _injectTranslationScripts = [ - "browser-polyfill.min.js", - "Zotero/zotero_config.js", - "Zotero/zotero.js", - "Zotero/promise.js", - "Zotero/http.js", - "Zotero/proxy.js", - "Zotero/cachedTypes.js", - "Zotero/date.js", - "Zotero/debug.js", - "Zotero/openurl.js", - "Zotero/xregexp-all.js", - "Zotero/unicode-zotero.js", - "Zotero/translate.js", - "Zotero/translator.js", - "Zotero/translate_item.js", - "Zotero/connectorTypeSchemaData.js", - "Zotero/utilities.js", - "Zotero/utilities_translate.js", - "Zotero/utilities-common.js", - "Zotero/http_inject.js", - "Zotero/progressWindow.js", - "Zotero/translate_inject.js", - "Zotero/messages.js", - "Zotero/messaging_inject.js", - "Zotero/inject.js" - ]; - // Exposed for tests - this._tabInfo = _tabInfo; - - /** - * Called when translators are available for a given page - */ - this.onTranslators = function(translators, instanceID, contentType, tab, frameId) { - //_enableForTab(tab.id); - - let existingTranslators = _tabInfo[tab.id] && _tabInfo[tab.id].translators; - // If translators already exist for tab we need to figure out if the new translators - // are more important/higher priority - if (existingTranslators) { - if (!translators.length) return; - - if (existingTranslators.length) { - let existingTranslatorsHaveHigherPriority = existingTranslators[0].priority < translators[0].priority; - if (existingTranslatorsHaveHigherPriority) return; - - let priorityEqual = translators[0].priority == existingTranslators[0].priority; - let newTranslatorsAreFromTopFrame = frameId == 0; - if (priorityEqual && !newTranslatorsAreFromTopFrame) return; - } - } - - var isPDF = contentType == 'application/pdf'; - _tabInfo[tab.id] = Object.assign(_tabInfo[tab.id] || {injections: {}}, {translators, instanceID, isPDF}); - - //Zotero.Connector_Browser._updateExtensionUI(tab); - } - - /** - * If there's a frame with a PDF mimeType this gets invoked - * @param frameURL - * @param tabId - */ - this.onPDFFrame = function(frameURL, frameId, tabId) { - if (_tabInfo[tabId] && _tabInfo[tabId].translators && _tabInfo[tabId].translators.length) { - return; - } - browser.tabs.get(tabId).then(function(tab) { - _tabInfo[tab.id] = Object.assign(_tabInfo[tab.id] || {injections: {}}, {translators: [], isPDF: true, frameId}); - Zotero.Connector_Browser.injectTranslationScripts(tab, frameId); - Zotero.Connector_Browser._updateExtensionUI(tab); - }); - } - - /** - * Called to display select items dialog - */ - this.onSelect = async function(items, tab) { - await Zotero.Connector_Browser.openWindow( - browser.runtime.getURL("itemSelector/itemSelector.html") - + "#" + encodeURIComponent(JSON.stringify([tab.id, items])) - // Remove once https://bugzilla.mozilla.org/show_bug.cgi?id=719905 is fixed - .replace(/%3A/g, 'ZOTEROCOLON'), - {width: 600, height: 325}, tab - ); - return new Promise(function(resolve) { - _tabInfo[tab.id].selectCallback = resolve; - }); - }; - - /** - * Called when a tab is removed or the URL has changed - */ - this.onPageLoad = function(url, tab) { - if(tab) _updateInfoForTab(tab.id, url); - } - - /** - * Called when Zotero goes online or offline - * @param [String|Boolean] version - either `false` or version string from X-Zotero-Version header - */ - this.onStateChange = function(version) { - if (version) { - Zotero.Prefs.set('firstSaveToServer', true); - // TODO: Enable once 5.0 is out, so that ContentTypeHandlers show an upgradeClient message instead - parseInt(version[0]) >= 5 && Zotero.ContentTypeHandler.enable(); - } else { - Zotero.ContentTypeHandler.disable(); - } - } - - this.onTabActivated = function(tab) { - Zotero.Connector_Browser._updateExtensionUI(tab); - }; - - /** - * Called if Zotero version is determined to be incompatible with Standalone - */ - this.onIncompatibleStandaloneVersion = function(zoteroVersion, standaloneVersion) { - if(_incompatibleVersionMessageShown) return; - alert('Zotero Connector for Chrome '+zoteroVersion+' is incompatible with the running '+ - 'version of Zotero Standalone'+(standaloneVersion ? " ("+standaloneVersion+")" : "")+ - '. Zotero Connector will continue to operate, but functionality that relies upon '+ - 'Zotero Standalone may be unavaliable.\n\n'+ - 'Please ensure that you have installed the latest version of these components. See '+ - 'https://www.zotero.org/download for more details.'); - _incompatibleVersionMessageShown = true; - } - - /** - * Called if Zotero version is determined to be incompatible with Standalone - */ - this.newerVersionRequiredPrompt = function() { - let clientName = ZOTERO_CONFIG.CLIENT_NAME; - let url = ZOTERO_CONFIG.CLIENT_DOWNLOAD_URL; - let pageName = Zotero.getString('progressWindow_error_upgradeClient_latestVersion'); - let pageLink = `${pageName}`; - - return Zotero.Messaging.sendMessage('confirm', { - title: Zotero.getString("general_warning"), - button2Text: "", - message: Zotero.getString("progressWindow_error_upgradeClient", [clientName, pageLink]) - }); - } - - /** - * Checks whether a given frame has any matching translators. Injects translation code - * if translators are found. - * - * @param tab - * @param frameId - * @param url - url of the frame - */ - this.onFrameLoaded = async function(tab, frameId, url) { - if (_isDisabledForURL(tab.url) && frameId == 0 || _isDisabledForURL(url)) { - return; - } - Zotero.debug("Connector_Browser: onFrameLoaded for " + tab.url + "; " + url); - if (frameId == 0) { - // Injected via the manifest file - return; - } else { - if (!(tab.id in _tabInfo)) { - _tabInfo[tab.id] = {}; - } - if (!_tabInfo[tab.id].frameChecked) { - // Also in the first frame detected - // See https://github.com/zotero/zotero-connectors/issues/156 - _tabInfo[tab.id].frameChecked = true; - // If you try to inject here immediately Firefox throws - // "Frame not found, or missing host permission" - if (Zotero.isFirefox) { - await Zotero.Promise.delay(100); - } - return Zotero.Connector_Browser.injectTranslationScripts(tab, frameId); - } - } - // Frame url shouldn't ever match the tab url but sometimes it does and causes weird - // injections. We explicitly ignore it here. - if (url == tab.url) { - Zotero.debug(`Ignoring frame ${frameId} with a tab matching url ${tab.url}`); - return; - } - return Zotero.Translators.getWebTranslatorsForLocation(url, tab.url).then(function(translators) { - if (translators[0].length == 0) { - Zotero.debug("Not injecting. No translators found for [tab.url, url]: " + tab.url + " , " + url); - return; - } - Zotero.debug(translators[0].length+ " translators found. Injecting into [tab.url, url]: " + tab.url + " , " + url); - return Zotero.Connector_Browser.injectTranslationScripts(tab, frameId); - }); - }; - - this.isIncognito = function(tab) { - return tab.incognito; - } - - /** - * Checks whether translation scripts are already injected into a frame and if not - injects - * @param tab {Object} - * @param [frameId=0] {Number] Defaults to top frame - * @returns {Promise} A promise that resolves when all scripts have been injected - */ - this.injectTranslationScripts = function(tab, frameId=0) { - // Prevent triggering multiple times - let key = tab.id+'-'+frameId; - let deferred = this.injectTranslationScripts[key]; - if (deferred) { - Zotero.debug(`Translation Inject: Script injection already in progress for ${key}`); - return deferred.promise; - } - deferred = Zotero.Promise.defer(); - this.injectTranslationScripts[key] = deferred; - deferred.promise.catch(function(e) { - Zotero.debug(`Translation Inject: Script injection rejected ${key}`); - Zotero.debug(e.message); - }).then(function() { - delete Zotero.Connector_Browser.injectTranslationScripts[key]; - }); - - Zotero.Messaging.sendMessage('ping', null, tab, frameId).then(function(response) { - if (response && frameId == 0) return deferred.resolve(); - Zotero.debug(`Injecting translation scripts into ${frameId} ${tab.url}`); - return Zotero.Connector_Browser.injectScripts(_injectTranslationScripts, tab, frameId) - .then(deferred.resolve).catch(deferred.reject); - }); - return deferred.promise; - }; - - this.INJECTION_TIMEOUT = 10000; - - /** - * Injects custom scripts - * - * @param scripts {Object[]} array of scripts to inject - * @param tab {Object} - * @param [frameId=0] {Number] Defaults to top frame - * @returns {Promise} A promise that resolves when all scripts have been injected - */ - this.injectScripts = async function(scripts, tab, frameId=0) { - function* injectScripts() { - if (! Array.isArray(scripts)) scripts = [scripts]; - // Make sure we're not changing the original list - scripts = Array.from(scripts); - Zotero.debug(`Inject: Injecting scripts into ${frameId} - ${tab.url} : ${scripts.join(', ')}`); - - for (let script of scripts) { - // Firefox returns an error for unstructured data being returned from scripts - // We are forced to catch these, even though when sometimes they may be legit errors - yield browser.tabs.executeScript(tab.id, {file: script, frameId, runAt: 'document_end'}) - .catch((e) => console.log("Error while loading % s: % o ", script, e)); - } - - // Send a ready message to confirm successful injection - let readyMsg = `ready${Date.now()}`; - yield browser.tabs.executeScript(tab.id, { - code: `browser.runtime.onMessage.addListener(function awaitReady(request) { - if (request == '${readyMsg}') { - browser.runtime.onMessage.removeListener(awaitReady); - return Promise.resolve(true); - } - })`, - frameId, - runAt: 'document_end' - }); - - while (true) { - try { - var response = yield browser.tabs.sendMessage(tab.id, readyMsg, {frameId: frameId}); - } catch (e) {} - if (!response) { - yield Zotero.Promise.delay(100); - } else { - Zotero.debug(`Inject: Complete ${frameId} - ${tab.url}`); - return true; - } - } - } - var timedOut = Zotero.Promise.defer(); - let timeout = setTimeout(function() { - timedOut.reject(new Error (`Inject: Timed out ${frameId} - ${tab.url} after ${this.INJECTION_TIMEOUT}ms`)) - }.bind(this), this.INJECTION_TIMEOUT); - - // Prevent triggering multiple times - let deferred = _tabInfo[tab.id].injections[frameId]; - if (deferred) { - Zotero.debug(`Inject: Script injection already in progress for ${frameId} - ${tab.url}`); - await deferred.promise; - } - deferred = Zotero.Promise.defer(); - _tabInfo[tab.id].injections[frameId] = deferred; - - function tabRemovedListener(tabID) { - if (tabID != tab.id) return; - deferred.reject(new Error(`Inject: Tab removed mid-injection into ${frameId} - ${tab.url}`)) - } - browser.tabs.onRemoved.addListener(tabRemovedListener); - - // This is a bit complex, but we need to cut off script injection as soon as we notice an - // interruption condition, such as a timeout or url change, otherwise we get partial injections - try { - var iter = injectScripts(); - var val = iter.next(); - while (true) { - if (val.done) { - return val.value; - } - if (val.value.then) { - // Will either throw from the first two, or return from the third one - let nextVal = await Promise.race([ - timedOut.promise, - deferred.promise, - val.value - ]); - val = iter.next(nextVal); - } else { - val = iter.next(val.value); - } - } - } finally { - browser.tabs.onRemoved.removeListener(tabRemovedListener); - deferred.resolve(); - delete _tabInfo[tab.id].injections[frameId]; - clearTimeout(timeout); - } - }; - - this.injectSingleFile = async function(tab, frameId) { - Zotero.debug("SingleFile: injecting SingleFile into page"); - await extension.injectScript(tab.id, Zotero.SingleFile.CONFIG); - // Also insert the config object - await this.injectScripts('singlefile-config.js', tab, frameId); - }; - - this.openWindow = async function(url, options={}, tab=null) { - if (!tab) { - tab = (await browser.tabs.query({active: true}))[0]; - } - options = Object.assign({ - width: 800, - height: 600, - type: "popup" - }, options); - let win = await browser.windows.get(tab.windowId, null); - options.left = Math.floor(win.left + (win.width / 2) - (options.width / 2)); - options.top = Math.floor(win.top + (win.height / 2) - (options.height / 2)); - - win = await browser.windows.create({ - url, - type: options.type, - width: options.width, - height: options.height, - left: options.left, - top: options.top - }); - - // Fix positioning in Chrome when window is on second monitor - // https://bugs.chromium.org/p/chromium/issues/detail?id=137681 - if (Zotero.isBrowserExt && win.left < options.left) { - browser.windows.update(win.id, { left: options.left }); - } - // Fix a Firefox bug where content does not appear before resize on linux - // https://bugzilla.mozilla.org/show_bug.cgi?id=1402110 - // this one might actually get fixed, unlike the one above - if (Zotero.isFirefox) { - await Zotero.Promise.delay(1000); - browser.windows.update(win.id, {width: win.width+1}); - } - if (typeof options.onClose == 'function') { - browser.windows.onRemoved.addListener(function onClose(id) { - if (id == win.id) options.onClose(); - browser.windows.onRemoved.removeListener(onClose); - }); - } - return win; - }; - - this.bringToFront = async function(drawAttention=false, tab) { - var windowId; - if (tab && tab.windowId) { - windowId = tab.windowId; - } else { - let win = await browser.windows.getLastFocused(); - windowId = win.id; - } - browser.windows.update(windowId, {drawAttention, focused: true}); - } - - this.openTab = function(url, tab) { - if (tab) { - let tabProps = { index: tab.index + 1 }; - // Firefox doesn't support openerTabId - if (!Zotero.isFirefox) { - tabProps.openerTabId = tab.id; - } - browser.tabs.create(Object.assign({url}, tabProps)); - } else { - browser.tabs.query({active: true, lastFocusedWindow: true}).then((tabs) => this.openTab(url, tabs[0])); - } - }; - - this.openPreferences = function(paneID, tab) { - this.openTab(browser.runtime.getURL(`preferences/preferences.html#${paneID}`), tab); - }; - - this.openConfigEditor = function(tab) { - this.openTab(browser.runtime.getURL(`preferences/config.html`), tab); - }; - - /** - * Display an old-school firefox notification by injecting HTML directly into DOM. - * This has a side-effect of navigation (user-initiated or JS-redirect-based) - * removing the notification so we keep on re-injecting it into DOM. - * - * The timeout argument specifies how long the notification has to be displayed for - * without navigation, before it is considered "seen" and further navigation on the tab - * will not make it re-appear. - * - * @param {String} text - * @param {String[]} buttons - labels for buttons - * @param {Number} [seenTimeout=5000] - * @param {Tab} [tab=currentTab] - * @returns {Promise{Number}} button pressed idx or undefined if timed-out and navigated away from - */ - this.notify = async function(text, buttons, seenTimeout=5000, tab=null) { - // Get current tab if not provided - if (!tab) { - return browser.tabs.query({active: true, lastFocusedWindow: true}) - .then((tabs) => this.notify(text, buttons, seenTimeout, tabs[0])); - } else if (typeof tab === 'number') { - return browser.tabs.get(tab).then((tab) => this.notify(text, buttons, seenTimeout, tab)); - } - let timedOut = false; - seenTimeout && setTimeout(() => timedOut = true, seenTimeout); - var response = await Zotero.Messaging.sendMessage('notify', [text, buttons, null, tab.status], tab) - if (response != undefined || timedOut) return response; - - // Tab url changed or tab got removed, hence the undefined response - // Wait half a sec to not run a busy-waiting loop - await Zotero.Promise.delay(500) - var tab = await browser.tabs.get(tab.id) - if (!tab) return; - // If it still exists try again - return this.notify(text, buttons, seenTimeout, tab); - }; - - /** - * Update status and tooltip of Zotero button - */ - this._updateExtensionUI = function (tab) { - if (!tab) { - return chrome.tabs.query( { lastFocusedWindow: true, active: true }, - (tabs) => tabs.length && this._updateExtensionUI(tabs[0])); - } - if (Zotero.Prefs.get('firstUse')) return _showFirstUseUI(tab); - if (!tab.active) return; - browser.contextMenus.removeAll(); - - if (_isDisabledForURL(tab.url, true)) { - _showZoteroStatus(); - return; - } else { - _enableForTab(tab.id); - } - - var isPDF = _tabInfo[tab.id] && _tabInfo[tab.id].isPDF; - var translators = _tabInfo[tab.id] && _tabInfo[tab.id].translators; - - // Show the save menu if we have more than one save option to show, which is true in all cases - // other than for PDFs with no translator - var showSaveMenu = (translators && translators.length) || !isPDF; - var showProxyMenu = !isPDF - && Zotero.Proxies.proxies.length > 0 - // Don't show proxy menu if already proxied - && !Zotero.Proxies.proxyToProper(tab.url, true); - - var saveMenuID; - if (showSaveMenu) { - saveMenuID = "zotero-context-menu-save-menu"; - browser.contextMenus.create({ - id: saveMenuID, - title: `${Zotero.getString('general_saveTo', 'Zotero')}`, - contexts: ['all'] - }); - } - - if (translators && translators.length) { - _showTranslatorIcon(tab, translators[0]); - _showTranslatorContextMenuItem(translators, saveMenuID); - _showNoteContextMenuItems(translators, saveMenuID); - } else if (isPDF) { - Zotero.Connector_Browser._showPDFIcon(tab); - } else { - _showWebpageIcon(tab); - } - - if (isPDF) { - _showPDFContextMenuItem(saveMenuID); - } else { - _showWebpageContextMenuItem(saveMenuID); - } - - // If unproxied, show "Reload via Proxy" options - if (showProxyMenu) { - _showProxyContextMenuItems(tab.url); - } - - if (Zotero.isFirefox) { - _showPreferencesContextMenuItem(); - } - } - - function _showFirstUseUI(tab) { - var icon = `${Zotero.platform}/zotero-z-${window.devicePixelRatio > 1 ? 32 : 16}px-australis.png`; - browser.browserAction.setIcon({ - tabId: tab.id, - path: `images/${icon}` - }); - browser.browserAction.setTitle({ - tabId: tab.id, - title: "Zotero Connector" - }); - browser.browserAction.enable(tab.id); - } - - /** - * Removes information about a specific tab - */ - function _clearInfoForTab(tabID, changeInfo) { - if (tabID in _tabInfo) { - _tabInfo[tabID].frameChecked = false; - } - if (changeInfo && !changeInfo.url) return; - delete _tabInfo[tabID]; - } - - function _updateInfoForTab(tabId, url) { - if ((tabId in _tabInfo) && _tabInfo[tabId].url != url) { - Zotero.debug(`Connector_Browser: URL changed from ${_tabInfo[tabId].url} to ${url}`); - if (_tabInfo[tabId].injections) { - for (let frameId in _tabInfo[tabId].injections) { - _tabInfo[tabId].injections[frameId].reject(new Error(`URL changed for tab ${url}`)); - } - } - } - _tabInfo[tabId] = { - url: url, - injections: {} - } - } - - function _isDisabledForURL(url, excludeTests=false) { - return url.startsWith('chrome://') || - url.startsWith('about:') || - (url.startsWith(browser.runtime.getURL('')) && (!excludeTests || !url.includes('/test/data/'))); - } - - function _showZoteroStatus(tabID) { - Zotero.Connector.checkIsOnline().then(function(isOnline) { - var icon, title; - if (isOnline) { - icon = "images/zotero-new-z-16px.png"; - title = "Zotero is Online"; - } else { - icon = "images/zotero-z-16px-offline.png"; - title = "Zotero is Offline"; - } - browser.browserAction.setIcon({ - tabId:tabID, - path:icon - }); - - browser.browserAction.setTitle({ - tabId:tabID, - title: title - }); - }); - browser.browserAction.disable(tabID); - browser.contextMenus.removeAll(); - } - - function _enableForTab(tabID) { - browser.browserAction.enable(tabID); - } - - function _showTranslatorIcon(tab, translator) { - var itemType = translator.itemType; - - browser.browserAction.setIcon({ - tabId:tab.id, - path:(itemType === "multiple" - ? "images/treesource-collection.png" - : Zotero.ItemTypes.getImageSrc(itemType)) - }); - - browser.browserAction.setTitle({ - tabId:tab.id, - title: _getTranslatorLabel(translator) - }); - } - - function _showWebpageIcon(tab) { - browser.browserAction.setIcon({ - tabId: tab.id, - path: Zotero.ItemTypes.getImageSrc("webpage-gray") - }); - let withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - let title = `Save to Zotero (Web Page ${withSnapshot ? 'with' : 'without'} Snapshot)`; - browser.browserAction.setTitle({tabId: tab.id, title}); - } - - this._showPDFIcon = function(tab) { - browser.browserAction.setIcon({ - tabId: tab.id, - path: browser.runtime.getURL('images/pdf.png') - }); - browser.browserAction.setTitle({ - tabId: tab.id, - title: "Save to Zotero (PDF)" - }); - } - - function _showTranslatorContextMenuItem(translators, parentID) { - for (var i = 0; i < translators.length; i++) { - browser.contextMenus.create({ - id: "zotero-context-menu-translator-save" + i, - title: _getTranslatorLabel(translators[i]), - onclick: (function (i) { - return function (info, tab) { - Zotero.Connector_Browser.saveWithTranslator(tab, i, { resave: true }); - }; - })(i), - parentId: parentID, - contexts: ['page', 'browser_action'] - }); - } - } - - function _showNoteContextMenuItems(translators, parentID) { - if (translators[0].itemType == "multiple") return; - browser.contextMenus.create({ - id: "zotero-context-menu-translator-save-with-selection-note", - title: "Create Zotero Item and Note from Selection", - onclick: function (info, tab) { - Zotero.Connector_Browser.saveWithTranslator( - tab, - 0, - { - note: '
    ' + info.selectionText + '
    ' - } - ); - }, - parentId: parentID, - contexts: ['selection'] - }); - } - - function _showWebpageContextMenuItem(parentID) { - var fns = []; - fns.push(() => browser.contextMenus.create({ - id: "zotero-context-menu-webpage-withSnapshot-save", - title: "Save to Zotero (Web Page with Snapshot)", - onclick: function (info, tab) { - Zotero.Connector_Browser.saveAsWebpage(tab, 0, { snapshot: true }); - }, - parentId: parentID, - contexts: ['page', 'browser_action'] - })); - fns.push(() => browser.contextMenus.create({ - id: "zotero-context-menu-webpage-withoutSnapshot-save", - title: "Save to Zotero (Web Page without Snapshot)", - onclick: function (info, tab) { - Zotero.Connector_Browser.saveAsWebpage(tab, 0); - }, - parentId: parentID, - contexts: ['page', 'browser_action'] - })); - // Swap order if automatic snapshots disabled - let withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - if (!withSnapshot) { - fns = [fns[1], fns[0]]; - } - fns.forEach((fn) => fn()); - } - - function _showPDFContextMenuItem(parentID) { - browser.contextMenus.create({ - id: "zotero-context-menu-pdf-save", - title: "Save to Zotero (PDF)", - onclick: function (info, tab) { - Zotero.Connector_Browser.saveAsWebpage(tab); - }, - parentId: parentID, - contexts: ['all'] - }); - } - - function _showProxyContextMenuItems(url) { - var parentID = "zotero-context-menu-proxy-reload-menu"; - browser.contextMenus.create({ - id: parentID, - title: "Reload via Proxy", - contexts: ['page', 'browser_action'] - }); - - var i = 0; - for (let proxy of Zotero.Proxies.proxies) { - let name = proxy.toDisplayName(); - let proxied = proxy.toProxy(url); - browser.contextMenus.create({ - id: `zotero-context-menu-proxy-reload-${i++}`, - title: `Reload via ${name}`, - onclick: function () { - browser.tabs.update({ url: proxied }); - }, - parentId: parentID, - contexts: ['page', 'browser_action'] - }); - } - } - - function _showPreferencesContextMenuItem() { - browser.contextMenus.create({ - type: "separator", - id: "zotero-context-menu-pref-separator", - contexts: ['all'] - }); - browser.contextMenus.create({ - id: "zotero-context-menu-preferences", - title: "Preferences", - onclick: function () { - browser.tabs.create({url: browser.runtime.getURL('preferences/preferences.html')}); - }, - contexts: ['all'] - }); - } - - function _browserAction(tab) { - if (Zotero.Prefs.get('firstUse')) { - Zotero.Messaging.sendMessage("firstUse", null, tab) - .then(function () { - Zotero.Prefs.set('firstUse', false); - Zotero.Connector_Browser._updateExtensionUI(tab); - }); - } - else if(_tabInfo[tab.id] && _tabInfo[tab.id].translators && _tabInfo[tab.id].translators.length) { - Zotero.Connector_Browser.saveWithTranslator(tab, 0, {fallbackOnFailure: true}); - } else { - if (_tabInfo[tab.id] && _tabInfo[tab.id].isPDF) { - Zotero.Connector_Browser.saveAsWebpage( - tab, - _tabInfo[tab.id].frameId, - { - snapshot: true - } - ); - } else { - let withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - Zotero.Connector_Browser.saveAsWebpage(tab, 0, { snapshot: withSnapshot }); - } - } - } - - /** - * @param tab - * @param i the index of translator to save with - * @param options - * - fallbackOnFailure if translation fails, attempt to save with lower priority translators - * - note add string as a note to the saved item - * @returns {Promise<*>} - */ - this.saveWithTranslator = function(tab, i, options={}) { - var translator = _tabInfo[tab.id].translators[i]; - - // Set frameId to null - send message to all frames - // There is code to figure out which frame should translate with instanceID. - return Zotero.Messaging.sendMessage( - "translate", - [ - _tabInfo[tab.id].instanceID, - translator.translatorID, - options - ], - tab, - null - ); - } - - this.saveAsWebpage = function(tab, frameId, options) { - if (Zotero.isFirefox && Zotero.browserMajorVersion >= 60 && _tabInfo[tab.id].isPDF) { - return Zotero.Utilities.saveFirefoxPDF(tab, frameId); - } - - if (tab.id != -1) { - return Zotero.Messaging.sendMessage("saveAsWebpage", [tab.title, options], tab, frameId); - } - // Handle right-click on PDF overlay, which exists in a weird non-tab state - else { - browser.tabs.query( - { - lastFocusedWindow: true, - active: true - }).then(function (tabs) { - Zotero.Messaging.sendMessage("saveAsWebpage", tabs[0].title, tabs[0]); - } - ); - } - } - - function _getTranslatorLabel(translator) { - var translatorName = translator.label; - return "Save to Zotero (" + translatorName + ")"; - } - - Zotero.Messaging.addMessageListener("selectDone", function(data) { - _tabInfo[data[0]].selectCallback(data[1]); - }); - - function logListenerErrors(listener) { - return function() { - try { - var returnValue = listener.apply(this, arguments); - if (returnValue && returnValue.then) { - returnValue.catch(function(e) { - Zotero.logError(e); - throw (e); - }); - } - } catch (e) { - Zotero.logError(e); - throw e; - } - } - } - - /* - CHANGED: Uncommented the following, we have our own tab handling code - - async function onNavigation(details, historyChange=false) { - // Ignore developer tools, item selector - if (details.tabId < 0 || _isDisabledForURL(details.url, true) - || details.url.indexOf(browser.runtime.getURL("itemSelector/itemSelector.html")) === 0) return; - - // Don't process again if URL hasn't changed - if (_tabInfo[details.tabId] && _tabInfo[details.tabId].url == details.url) { - return Zotero.Connector_Browser._updateExtensionUI(tab); - } - - if (details.frameId == 0) { - _updateInfoForTab(details.tabId, details.url); - // Getting the tab is uber slow in Firefox. Since _updateInfoForTab() resets the - // object we use to store tab related metadata, it needs to fire ASAP, so that other hooks - // such as those from webNavigation events can update the metadata, without it being overwritten - var tab = await browser.tabs.get(details.tabId); - Zotero.Connector_Browser._updateExtensionUI(tab); - Zotero.Connector.reportActiveURL(tab.url); - } - if (!tab) { - var tab = await browser.tabs.get(details.tabId); - } - // _updateInfoForTab will reject pending injections, but we need to make sure this - // executes in the next event loop such that the rejections can be processed - await Zotero.Promise.delay(1); - await Zotero.Connector_Browser.onFrameLoaded(tab, details.frameId, details.url); - if (historyChange && details.frameId === 0) { - Zotero.Messaging.sendMessage('historyChanged'); - } - } - - browser.browserAction.onClicked.addListener(logListenerErrors(_browserAction)); - - browser.tabs.onRemoved.addListener(logListenerErrors(_clearInfoForTab)); - - browser.tabs.onActivated.addListener(logListenerErrors(async function(details) { - // Chrome 91 has started throwing - // "Tabs cannot be edited right now (user may be dragging a tab)." - // when attempting to retrieve the tab on event here when user is clicking on a tab - // Follow https://bugs.chromium.org/p/chromium/issues/detail?id=1213925 - // for progress. - let attemptsLeft = 10; - while (!tab && attemptsLeft > 0) { - try { - var tab = await browser.tabs.get(details.tabId); - } - catch (e) { - attemptsLeft--; - await Zotero.Promise.delay(100 * (10 - attemptsLeft)); - } - } - // Ignore item selector - if (tab.url.indexOf(browser.runtime.getURL("itemSelector/itemSelector.html")) === 0) return; - Zotero.debug("Connector_Browser: onActivated for " + tab.url); - Zotero.Connector_Browser.onTabActivated(tab); - Zotero.Connector.reportActiveURL(tab.url); - })); - - browser.webNavigation.onCommitted.addListener(logListenerErrors(onNavigation)); - browser.webNavigation.onHistoryStateUpdated.addListener(details => logListenerErrors(onNavigation(details, true))); - */ -} - -// CHANGED: Don't call init method of Zotero (because ??) -// CHANGED: But at least pretend we did -//Zotero.initGlobal(); -Zotero.initDeferred.resolve(); diff --git a/zotero-connectors/src/browserExt/browser-polyfill.js b/zotero-connectors/src/browserExt/browser-polyfill.js deleted file mode 100644 index 6627f969..00000000 --- a/zotero-connectors/src/browserExt/browser-polyfill.js +++ /dev/null @@ -1,892 +0,0 @@ -(function (global, factory) { - if (typeof define === "function" && define.amd) { - define("webextension-polyfill", ["module"], factory); - } else if (typeof exports !== "undefined") { - factory(module); - } else { - var mod = { - exports: {} - }; - factory(mod); - global.browser = mod.exports; - } -})(this, function (module) { - /* webextension-polyfill - v0.1.1 - Fri Aug 18 2017 16:47:23 */ - /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ - /* vim: set sts=2 sw=2 et tw=80: */ - /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; - - if (typeof browser === "undefined") { - // Wrapping the bulk of this polyfill in a one-time-use function is a minor - // optimization for Firefox. Since Spidermonkey does not fully parse the - // contents of a function until the first time it's called, and since it will - // never actually need to be called, this allows the polyfill to be included - // in Firefox nearly for free. - const wrapAPIs = () => { - // NOTE: apiMetadata is associated to the content of the api-metadata.json file - // at build time by replacing the following "include" with the content of the - // JSON file. - const apiMetadata = { - "alarms": { - "clear": { - "minArgs": 0, - "maxArgs": 1 - }, - "clearAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "bookmarks": { - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "export": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getChildren": { - "minArgs": 1, - "maxArgs": 1 - }, - "getRecent": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTree": { - "minArgs": 0, - "maxArgs": 0 - }, - "getSubTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "import": { - "minArgs": 0, - "maxArgs": 0 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "browserAction": { - "getBadgeBackgroundColor": { - "minArgs": 1, - "maxArgs": 1 - }, - "getBadgeText": { - "minArgs": 1, - "maxArgs": 1 - }, - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "commands": { - "getAll": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "contextMenus": { - "update": { - "minArgs": 2, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeAll": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "cookies": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAllCookieStores": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "downloads": { - "download": { - "minArgs": 1, - "maxArgs": 1 - }, - "cancel": { - "minArgs": 1, - "maxArgs": 1 - }, - "erase": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFileIcon": { - "minArgs": 1, - "maxArgs": 2 - }, - "open": { - "minArgs": 1, - "maxArgs": 1 - }, - "pause": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeFile": { - "minArgs": 1, - "maxArgs": 1 - }, - "resume": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "show": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "extension": { - "isAllowedFileSchemeAccess": { - "minArgs": 0, - "maxArgs": 0 - }, - "isAllowedIncognitoAccess": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "history": { - "addUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "getVisits": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "deleteRange": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "i18n": { - "detectLanguage": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAcceptLanguages": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "idle": { - "queryState": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "management": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getSelf": { - "minArgs": 0, - "maxArgs": 0 - }, - "uninstallSelf": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "notifications": { - "clear": { - "minArgs": 1, - "maxArgs": 1 - }, - "create": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPermissionLevel": { - "minArgs": 0, - "maxArgs": 0 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "pageAction": { - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "hide": { - "minArgs": 0, - "maxArgs": 0 - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - }, - "show": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "permissions": { - "contains": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "request": { - "minArgs": 1, - "maxArgs": 1 - }, - }, - "runtime": { - "getBackgroundPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "getBrowserInfo": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPlatformInfo": { - "minArgs": 0, - "maxArgs": 0 - }, - "openOptionsPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "requestUpdateCheck": { - "minArgs": 0, - "maxArgs": 0 - }, - "sendMessage": { - "minArgs": 1, - "maxArgs": 3 - }, - "sendNativeMessage": { - "minArgs": 2, - "maxArgs": 2 - }, - "setUninstallURL": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "storage": { - "local": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "managed": { - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "sync": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - } - }, - "tabs": { - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "captureVisibleTab": { - "minArgs": 0, - "maxArgs": 2 - }, - "detectLanguage": { - "minArgs": 0, - "maxArgs": 1 - }, - "duplicate": { - "minArgs": 1, - "maxArgs": 1 - }, - "executeScript": { - "minArgs": 1, - "maxArgs": 2 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 0 - }, - "getZoom": { - "minArgs": 0, - "maxArgs": 1 - }, - "getZoomSettings": { - "minArgs": 0, - "maxArgs": 1 - }, - "highlight": { - "minArgs": 1, - "maxArgs": 1 - }, - "insertCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "reload": { - "minArgs": 0, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "query": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "sendMessage": { - "minArgs": 2, - "maxArgs": 3 - }, - "setZoom": { - "minArgs": 1, - "maxArgs": 2 - }, - "setZoomSettings": { - "minArgs": 1, - "maxArgs": 2 - }, - "update": { - "minArgs": 1, - "maxArgs": 2 - } - }, - "webNavigation": { - "getAllFrames": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFrame": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "webRequest": { - "handlerBehaviorChanged": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "windows": { - "create": { - "minArgs": 0, - "maxArgs": 1 - }, - "get": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 1 - }, - "getLastFocused": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - } - }; - - if (Object.keys(apiMetadata).length === 0) { - throw new Error("api-metadata.json has not been included in browser-polyfill"); - } - - /** - * A WeakMap subclass which creates and stores a value for any key which does - * not exist when accessed, but behaves exactly as an ordinary WeakMap - * otherwise. - * - * @param {function} createItem - * A function which will be called in order to create the value for any - * key which does not exist, the first time it is accessed. The - * function receives, as its only argument, the key being created. - */ - class DefaultWeakMap extends WeakMap { - constructor(createItem, items = undefined) { - super(items); - this.createItem = createItem; - } - - get(key) { - if (!this.has(key)) { - this.set(key, this.createItem(key)); - } - - return super.get(key); - } - } - - /** - * Returns true if the given object is an object with a `then` method, and can - * therefore be assumed to behave as a Promise. - * - * @param {*} value The value to test. - * @returns {boolean} True if the value is thenable. - */ - const isThenable = value => { - return value && typeof value === "object" && typeof value.then === "function"; - }; - - /** - * Creates and returns a function which, when called, will resolve or reject - * the given promise based on how it is called: - * - * - If, when called, `chrome.runtime.lastError` contains a non-null object, - * the promise is rejected with that value. - * - If the function is called with exactly one argument, the promise is - * resolved to that value. - * - Otherwise, the promise is resolved to an array containing all of the - * function's arguments. - * - * @param {object} promise - * An object containing the resolution and rejection functions of a - * promise. - * @param {function} promise.resolve - * The promise's resolution function. - * @param {function} promise.rejection - * The promise's rejection function. - * - * @returns {function} - * The generated callback function. - */ - const makeCallback = promise => { - return (...callbackArgs) => { - if (chrome.runtime.lastError) { - promise.reject(chrome.runtime.lastError); - } else if (callbackArgs.length === 1) { - promise.resolve(callbackArgs[0]); - } else { - promise.resolve(callbackArgs); - } - }; - }; - - /** - * Creates a wrapper function for a method with the given name and metadata. - * - * @param {string} name - * The name of the method which is being wrapped. - * @param {object} metadata - * Metadata about the method being wrapped. - * @param {integer} metadata.minArgs - * The minimum number of arguments which must be passed to the - * function. If called with fewer than this number of arguments, the - * wrapper will raise an exception. - * @param {integer} metadata.maxArgs - * The maximum number of arguments which may be passed to the - * function. If called with more than this number of arguments, the - * wrapper will raise an exception. - * - * @returns {function(object, ...*)} - * The generated wrapper function. - */ - const wrapAsyncFunction = (name, metadata) => { - const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments"; - - return function asyncFunctionWrapper(target, ...args) { - if (args.length < metadata.minArgs) { - throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); - } - - if (args.length > metadata.maxArgs) { - throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); - } - - return new Promise((resolve, reject) => { - target[name](...args, makeCallback({ resolve, reject })); - }); - }; - }; - - /** - * Wraps an existing method of the target object, so that calls to it are - * intercepted by the given wrapper function. The wrapper function receives, - * as its first argument, the original `target` object, followed by each of - * the arguments passed to the orginal method. - * - * @param {object} target - * The original target object that the wrapped method belongs to. - * @param {function} method - * The method being wrapped. This is used as the target of the Proxy - * object which is created to wrap the method. - * @param {function} wrapper - * The wrapper function which is called in place of a direct invocation - * of the wrapped method. - * - * @returns {Proxy} - * A Proxy object for the given method, which invokes the given wrapper - * method in its place. - */ - const wrapMethod = (target, method, wrapper) => { - return new Proxy(method, { - apply(targetMethod, thisObj, args) { - return wrapper.call(thisObj, target, ...args); - } - }); - }; - - let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); - - /** - * Wraps an object in a Proxy which intercepts and wraps certain methods - * based on the given `wrappers` and `metadata` objects. - * - * @param {object} target - * The target object to wrap. - * - * @param {object} [wrappers = {}] - * An object tree containing wrapper functions for special cases. Any - * function present in this object tree is called in place of the - * method in the same location in the `target` object tree. These - * wrapper methods are invoked as described in {@see wrapMethod}. - * - * @param {object} [metadata = {}] - * An object tree containing metadata used to automatically generate - * Promise-based wrapper functions for asynchronous. Any function in - * the `target` object tree which has a corresponding metadata object - * in the same location in the `metadata` tree is replaced with an - * automatically-generated wrapper function, as described in - * {@see wrapAsyncFunction} - * - * @returns {Proxy} - */ - const wrapObject = (target, wrappers = {}, metadata = {}) => { - let cache = Object.create(null); - - let handlers = { - has(target, prop) { - return prop in target || prop in cache; - }, - - get(target, prop, receiver) { - if (prop in cache) { - return cache[prop]; - } - - if (!(prop in target)) { - return undefined; - } - - let value = target[prop]; - - if (typeof value === "function") { - // This is a method on the underlying object. Check if we need to do - // any wrapping. - - if (typeof wrappers[prop] === "function") { - // We have a special-case wrapper for this method. - value = wrapMethod(target, target[prop], wrappers[prop]); - } else if (hasOwnProperty(metadata, prop)) { - // This is an async method that we have metadata for. Create a - // Promise wrapper for it. - let wrapper = wrapAsyncFunction(prop, metadata[prop]); - value = wrapMethod(target, target[prop], wrapper); - } else { - // This is a method that we don't know or care about. Return the - // original method, bound to the underlying object. - value = value.bind(target); - } - } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { - // This is an object that we need to do some wrapping for the children - // of. Create a sub-object wrapper for it with the appropriate child - // metadata. - value = wrapObject(value, wrappers[prop], metadata[prop]); - } else { - // We don't need to do any wrapping for this property, - // so just forward all access to the underlying object. - Object.defineProperty(cache, prop, { - configurable: true, - enumerable: true, - get() { - return target[prop]; - }, - set(value) { - target[prop] = value; - } - }); - - return value; - } - - cache[prop] = value; - return value; - }, - - set(target, prop, value, receiver) { - if (prop in cache) { - cache[prop] = value; - } else { - target[prop] = value; - } - return true; - }, - - defineProperty(target, prop, desc) { - return Reflect.defineProperty(cache, prop, desc); - }, - - deleteProperty(target, prop) { - return Reflect.deleteProperty(cache, prop); - } - }; - - return new Proxy(target, handlers); - }; - - /** - * Creates a set of wrapper functions for an event object, which handles - * wrapping of listener functions that those messages are passed. - * - * A single wrapper is created for each listener function, and stored in a - * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener` - * retrieve the original wrapper, so that attempts to remove a - * previously-added listener work as expected. - * - * @param {DefaultWeakMap} wrapperMap - * A DefaultWeakMap object which will create the appropriate wrapper - * for a given listener function when one does not exist, and retrieve - * an existing one when it does. - * - * @returns {object} - */ - const wrapEvent = wrapperMap => ({ - addListener(target, listener, ...args) { - target.addListener(wrapperMap.get(listener), ...args); - }, - - hasListener(target, listener) { - return target.hasListener(wrapperMap.get(listener)); - }, - - removeListener(target, listener) { - target.removeListener(wrapperMap.get(listener)); - } - }); - - const onMessageWrappers = new DefaultWeakMap(listener => { - if (typeof listener !== "function") { - return listener; - } - - /** - * Wraps a message listener function so that it may send responses based on - * its return value, rather than by returning a sentinel value and calling a - * callback. If the listener function returns a Promise, the response is - * sent when the promise either resolves or rejects. - * - * @param {*} message - * The message sent by the other end of the channel. - * @param {object} sender - * Details about the sender of the message. - * @param {function(*)} sendResponse - * A callback which, when called with an arbitrary argument, sends - * that value as a response. - * @returns {boolean} - * True if the wrapped listener returned a Promise, which will later - * yield a response. False otherwise. - */ - return function onMessage(message, sender, sendResponse) { - let result = listener(message, sender); - - if (isThenable(result)) { - result.then(sendResponse, error => { - console.error(error); - sendResponse(error); - }); - - return true; - } else if (result !== undefined) { - sendResponse(result); - } - }; - }); - - const staticWrappers = { - runtime: { - onMessage: wrapEvent(onMessageWrappers) - } - }; - - return wrapObject(chrome, staticWrappers, apiMetadata); - }; - - // The build process adds a UMD wrapper around this file, which makes the - // `module` variable available. - module.exports = wrapAPIs(); // eslint-disable-line no-undef - } else { - module.exports = browser; // eslint-disable-line no-undef - } -}); diff --git a/zotero-connectors/src/browserExt/confirm.html b/zotero-connectors/src/browserExt/confirm.html deleted file mode 100644 index 3bfd60dc..00000000 --- a/zotero-connectors/src/browserExt/confirm.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - Zotero - Confirm Import - - - - - - - - - \ No newline at end of file diff --git a/zotero-connectors/src/browserExt/contentTypeHandler.js b/zotero-connectors/src/browserExt/contentTypeHandler.js deleted file mode 100644 index 6d637b48..00000000 --- a/zotero-connectors/src/browserExt/contentTypeHandler.js +++ /dev/null @@ -1,279 +0,0 @@ - /* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Intercepts web requests and offers to import Zotero-recognised resources into the client. - * - * Includes CSL styles, RIS, BibTeX and Refer files - */ - -(function() { - -"use strict"; - -const url = require('url'); - -Zotero.ContentTypeHandler = { - cslContentTypes: new Set(["application/vnd.citationstyles.style+xml", "text/x-csl"]), - importContentTypes: new Set([ - "application/x-endnote-refer", "application/x-research-info-systems", - "application/x-inst-for-scientific-info", - "text/x-bibtex", "application/x-bibtex", - // Non-standard - "text/x-research-info-systems", - "text/application/x-research-info-systems", // Nature serves this - "text/ris", // Cell serves this - "ris" // Not even trying - ]), - ignoreURL: new Set(), - - enable: function() { - Zotero.WebRequestIntercept.addListener('headersReceived', Zotero.ContentTypeHandler.observe); - }, - - disable: function() { - Zotero.WebRequestIntercept.removeListener('headersReceived', Zotero.ContentTypeHandler.observe); - }, - - observe: function(details) { - // Only attempt intercepting GET requests. To do others we need to cache requestBody on - // onBeforeSend, which is likely to kill performance. - if (!details.responseHeadersObject['content-type'] || details.method != "GET") return; - if (Zotero.ContentTypeHandler.ignoreURL.has(details.url)) { - // Ignore url when user cancels - Zotero.ContentTypeHandler.ignoreURL.delete(details.url); - return; - } - - // Offer to install CSL by Content-Type - let contentType = details.responseHeadersObject['content-type'].split(';')[0]; - if (Zotero.ContentTypeHandler.cslContentTypes.has(contentType)) { - return Zotero.ContentTypeHandler.handleStyle(details); - } - // Offer to install CSL if URL path ends with .csl and host is allowed - if (details.url.match(/https:\/\/[^/]+\/[^?]+\.csl(\?|$)/)) { - let host = details.url.match(/https:\/\/([^/]+)\//)[1]; - let hosts = Zotero.Prefs.get('allowedCSLExtensionHosts'); - if (Array.isArray(hosts) && hosts.includes(host)) { - return Zotero.ContentTypeHandler.handleStyle(details); - } - } - if (Zotero.Prefs.get('interceptKnownFileTypes') - && Zotero.ContentTypeHandler.importContentTypes.has(contentType)) { - return Zotero.ContentTypeHandler.handleImportContent(details); - } - if (contentType == 'application/pdf') { - if (details.frameId != 0) { - setTimeout(() => Zotero.Connector_Browser.onPDFFrame(details.url, details.frameId, details.tabId)); - } - return; - } - }, - - handleStyle: function(details) { - Zotero.ContentTypeHandler.confirm(details, `Add citation style to Zotero?`) - .then(function(response) { - if (response && response.button == 1) { - Zotero.debug(`ContentTypeHandler: Importing style ${details.url}`); - Zotero.ContentTypeHandler.importFile(details, 'csl'); - } else { - Zotero.ContentTypeHandler._redirectToOriginal(details.tabId, details.url); - } - } - ); - // Don't continue until we get confirmation - return {redirectUrl: 'javascript:'}; - }, - - handleImportContent: function(details) { - let URI = url.parse(details.url); - let hosts = Zotero.Prefs.get('allowedInterceptHosts'); - let isEnabledHost = hosts.indexOf(URI.host) != -1; - if (isEnabledHost) { - Zotero.debug(`ContentTypeHandler: Importing a file ${details.url}`); - Zotero.ContentTypeHandler.importFile(details, 'import'); - } else { - Zotero.ContentTypeHandler.confirm(details, `Import items from ${URI.host} into Zotero?

    ` + - 'You can manage automatic file importing in Zotero Connector preferences.', - 'Always allow for this site').then(function(response) { - if (response && response.button == 1) { - Zotero.debug(`ContentTypeHandler: Importing a file ${details.url}`); - Zotero.ContentTypeHandler.importFile(details, 'import'); - if (!isEnabledHost && response.checkboxChecked) { - hosts.push(URI.host); - } - Zotero.Prefs.set('allowedInterceptHosts', hosts); - } else { - Zotero.ContentTypeHandler._redirectToOriginal(details.tabId, details.url); - } - }); - } - return {redirectUrl: 'javascript:'}; - }, - - _redirectToOriginal: function(tabId, url) { - Zotero.ContentTypeHandler.ignoreURL.add(url); - // Ignore the next request to this url and redirect - browser.tabs.update(tabId, {url}); - }, - - /** - * Handle confirmation prompt by sending a message to injected script and - * redirect to the URL if they click cancel - * @param details {Object} as provided by Zotero.WebRequestsInterceptor - * @param message {String} confirmation message to display - * @param checkboxText {String} optional checkbox text - * @returns {Promise{Boolean}} whether user clicked OK or Cancel - */ - confirm: async function(details, message, checkboxText="") { - let tab = await browser.tabs.get(details.tabId); - - var props = {message}; - if (checkboxText.length) { - props = { - message, - checkbox: true, - checkboxText - } - } - let confirmURL = browser.runtime.getURL(`confirm.html`); - let response = await Zotero.Messaging.sendMessage('confirm', props, tab); - // If captured URL was pasted on about:blank or other browser pages the response is immediate - // with undefined and means we cannot inject and display the UI, so we have to do some additional work - if (!response && tab.url != confirmURL) { - var responsePromise = new Zotero.Promise(function(resolve, reject) { - browser.tabs.onUpdated.addListener(async function getResponse(tabId, changeInfo, tab) { - try { - if (changeInfo.status == 'complete' && tab.url == confirmURL) { - let response = await Zotero.ContentTypeHandler.confirm(details, message, checkboxText); - browser.tabs.onUpdated.removeListener(getResponse); - resolve(response); - } - } catch (e) { - reject(e); - } - }); - browser.tabs.update(tab.id, {url: confirmURL}); - }); - response = await responsePromise; - } else if (!response) { - throw new Error('Cannot confirm whether user wants do download the file') - } - - return response; - }, - - /** - * Send an XHR request to retrieve and import the file into Standalone - */ - importFile: async function(details, type) { - var sessionID = Zotero.Utilities.randomString(); - var headline = type == 'csl' ? 'Installing Style' : null; - var readOnly = type == 'csl'; - var tab = await browser.tabs.get(details.tabId); - Zotero.Messaging.sendMessage('progressWindow.show', [sessionID, headline, readOnly], tab); - - var xhr = new XMLHttpRequest(); - // If the original request method was POST, this is likely to fail, because - // we do not send the request body. For discussion see - // https://github.com/zotero/zotero-connectors/pull/59#discussion_r93317639 - xhr.open(details.method, details.url); - xhr.onreadystatechange = async function() { - if(xhr.readyState !== 4) return; - - if (this.status < 200 || this.status >= 400) { - throw Error(`IMPORT: Retrieving ${details.url} failed with status ${this.status}.\nResponse body:\n${this.responseText}`); - } - let options = { - headers: { - "Content-Type": this.getResponseHeader('Content-Type') - } - }; - // Style installation - if (type == 'csl') { - options.method = 'installStyle'; - options.queryString = 'origin=' + encodeURIComponent(details.url); - try { - let result = await Zotero.Connector.callMethod(options, this.response); - Zotero.Messaging.sendMessage( - 'progressWindow.itemProgress', - { - id: null, - iconSrc: browser.runtime.getURL('images/csl-style.png'), - title: result.name, - progress: 100 - }, - tab - ); - return Zotero.Messaging.sendMessage('progressWindow.done', [true], tab); - } - catch(e) { - if (e.status == 404) { - return Zotero.Messaging.sendMessage('progressWindow.done', - [false, 'upgradeClient'], tab); - } else { - return Zotero.Messaging.sendMessage('progressWindow.done', - [false, 'clientRequired'], tab); - } - } - } - // RIS/BibTeX import - else { - options.method = 'import'; - options.queryString = `session=${sessionID}`; - try { - let result = await Zotero.Connector.callMethod(options, this.response); - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { sessionID }); - for (let i = 0; i < result.length && i < 20; i++) { - let item = result[i]; - Zotero.Messaging.sendMessage( - 'progressWindow.itemProgress', - { - id: null, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title, - progress: 100 - }, - tab - ); - } - Zotero.Messaging.sendMessage('progressWindow.done', [true], tab); - } - catch(e) { - let err = 'clientRequired'; - if (e.status == 404) { - err = 'upgradeClient'; - } - else if (e.status == 500 && e.value && e.value.libraryEditable === false) { - err = 'collectionNotEditable'; - } - return Zotero.Messaging.sendMessage('progressWindow.done', [false, err], tab); - } - } - }; - xhr.send(); - } -}; -})(); \ No newline at end of file diff --git a/zotero-connectors/src/browserExt/firefoxPDF.js b/zotero-connectors/src/browserExt/firefoxPDF.js deleted file mode 100644 index 9e833bc1..00000000 --- a/zotero-connectors/src/browserExt/firefoxPDF.js +++ /dev/null @@ -1,115 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -// Firefox currently does not allow to inject scripts into pdf pages -// This is a quick dirty fix for now, which initiates the pdf save from the bg page -// and changes the action button into a "tick.png" icon after the save is complete -// See https://bugzilla.mozilla.org/show_bug.cgi?id=1454760#c3 - -if (Zotero.isFirefox) { - Zotero.WebRequestIntercept.addListener('headersReceived', function(details) { - // Proxy login is a POST method that gets redirected to the final destination via a 302 - if (details.method != "GET" && details.statusCode < 300 && details.statusCode >= 400) return; - - const contentType = details.responseHeadersObject['content-type']; - if (!contentType) return; - if ( - !contentType.includes("application/pdf") && - !contentType.includes("application/octet-stream") - ) return; - - // While Firefox will show the PDF viewer for application/octet-stream, it must pass some - // additional checks: the URL must end in .pdf and the PDF must be a top-level document. - // https://searchfox.org/mozilla-central/rev/50c3cf7a3c931409b54efa009795b69c19383541/toolkit/components/pdfjs/content/PdfStreamConverter.jsm#1100-1121 - if (contentType.includes("application/octet-stream")) { - if (!details.url.includes(".pdf") || !details.type === "main_frame") return; - } - - // Somehow browser.webNavigation.onCommitted runs later than headersReceived - setTimeout(async function() { - var tab = await browser.tabs.get(details.tabId); - if (Zotero.Connector_Browser._tabInfo[tab.id]) { - Zotero.Connector_Browser._tabInfo[tab.id].isPDF = true; - } else { - Zotero.Connector_Browser._tabInfo[tab.id] = {isPDF: true}; - } - Zotero.Connector_Browser._updateExtensionUI(tab); - }, 100); - }); - - Zotero.Utilities.saveFirefoxPDF = async function (tab, frameId) { - let url = tab.url; - // Get URL from iframe - if (frameId) { - ({ url } = await browser.webNavigation.getFrame({ tabId: tab.id, frameId })); - } - - var data = { - url, - pdf: true - }; - try { - browser.browserAction.setIcon({ - tabId:tab.id, - path: { - '16': 'images/spinner-16px.png', - '32': 'images/spinner-16px@2x.png' - } - }); - browser.browserAction.setTitle({ - tabId:tab.id, - title: "Saving…" - }); - - await Zotero.Connector.callMethodWithCookies("saveSnapshot", data, tab); - - browser.browserAction.setIcon({ - tabId:tab.id, - path: { - '16': 'images/tick.png', - '32': 'images/tick@2x.png' - } - }); - browser.browserAction.setTitle({ - tabId:tab.id, - title: "Saved!" - }); - Zotero.Connector_Browser._tabInfo[tab.id].isPDF = false; - - } catch (e) { - Zotero.logError(e); - - browser.browserAction.setIcon({ - tabId:tab.id, - path: "images/cross.png" - }); - - browser.browserAction.setTitle({ - tabId:tab.id, - title: "Saving failed. Is Zotero running?" - }); - } - } -} diff --git a/zotero-connectors/src/browserExt/google-docs-plugin-manager.js b/zotero-connectors/src/browserExt/google-docs-plugin-manager.js deleted file mode 100644 index 7f16edba..00000000 --- a/zotero-connectors/src/browserExt/google-docs-plugin-manager.js +++ /dev/null @@ -1,167 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2020 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.GoogleDocsPluginManager = { - backgroundScriptPaths: [ 'api.js' ], - contentScriptPaths: [ "kixAddZoteroMenu.js", "client.js", 'document.js' ], - uiScriptPaths: [ "ui.js" ], - - scriptContents: {}, - - init: async function() { - await this.fetchScripts(); - this.initNavigationMonitor(); - await this.loadBackgroundScripts(); - }, - - version: null, - - // Firefox has a better API to register scripts for injection - // with the same parameters and effects as registration in manifest.json - // but unfortunately it's not available in chromium, so we'll be - // injecting these scripts on a nav handler instead - // See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/contentScripts/register - // They need to be injected before GDocs own JS runs otherwise - // the google's JS will fail to register menu/button handlers - // on Zotero UI - initNavigationMonitor: function() { - browser.webNavigation.onCommitted.addListener(async (details) => { - if (details.frameId !== 0 || !details.url.startsWith("https://docs.google.com/document/")) return; - Zotero.debug("Injecting Google Docs content scripts into " + details.url); - for (let path of this.contentScriptPaths) { - if (Zotero.version === '4.999.0') { - await browser.tabs.executeScript(details.tabId, { - file: "zotero-google-docs-integration/" + path, - frameId: 0, - runAt: 'document_start' - }); - continue; - } - try { - await browser.tabs.executeScript(details.tabId, { - code: this.scriptContents[path], - frameId: 0, - runAt: 'document_start' - }); - } - catch (e) { - Zotero.debug(`Failed to inject Google Docs content script "${path}"`, 1); - Zotero.logError(e); - } - } - }); - }, - - fetchScripts: async function() { - try { - let paths = this.backgroundScriptPaths.concat(this.contentScriptPaths, this.uiScriptPaths); - - // Initially load bundled scripts - if (!Object.keys(this.scriptContents).length) { - Zotero.debug(`Loading bundled Google Docs scripts ${JSON.stringify(paths)}`); - this.scriptContents = await this._fetchScripts(browser.runtime.getURL('zotero-google-docs-integration') + '/', paths); - - // Set bundled scripts version - let xhr = await Zotero.HTTP.request('GET', - browser.runtime.getURL("zotero-google-docs-integration/package.json")); - this.version = JSON.parse(xhr.responseText).version; - } - - // Then fetch code from server - let serverURL = Zotero.Prefs.get('integration.googleDocs.codeRepositoryURL'); - if (!serverURL) return; - - try { - Zotero.debug("Checking for updated remote Google Docs scripts"); - - let xhr = await Zotero.HTTP.request('GET', serverURL + "package.json"); - let serverVersion = JSON.parse(xhr.responseText).version; - let serverHasNewerVersion = Zotero.Utilities.semverCompare(this.version, serverVersion) < 0; - if (!serverHasNewerVersion) { - Zotero.debug("Google Docs scripts are up to date"); - return; - } - this.version = serverVersion; - - Zotero.debug(`Fetching Google Docs scripts from ${serverURL}: ${JSON.stringify(paths)}`); - this.scriptContents = await this._fetchScripts(serverURL, paths); - Zotero.debug('Remote Google Docs scripts fetched, reloading'); - this.loadBackgroundScripts(); - } - catch (e) { - Zotero.debug('An error occurred while trying to fetch remote Google Docs scripts', 1); - Zotero.logError(e); - } - } - finally { - (async () => { - await Zotero.Promise.delay(Zotero.Prefs.get('integration.googleDocs.repoCheckInterval')); - this.fetchScripts(); - })(); - } - }, - - _fetchScripts: async function(baseURL, paths) { - let scriptContents = {}; - for (let path of paths) { - let xhr = await Zotero.HTTP.request('GET', baseURL + path); - scriptContents[path] = xhr.responseText; - } - return scriptContents; - }, - - loadBackgroundScripts: async function() { - if (Zotero.version === '4.999.0') return; - Zotero.debug(`Loading Google Docs background scripts: ${JSON.stringify(this.backgroundScriptPaths)}`); - for (let path of this.backgroundScriptPaths) { - try { - eval(this.scriptContents[path]); - } - catch (e) { - Zotero.debug(`Failed to load Google Docs background script "${path}"`, 1); - Zotero.logError(e); - } - } - }, - - injectUI: async function(tab) { - Zotero.debug("Injecting Google Docs UI scripts"); - for (let path of this.uiScriptPaths) { - if (Zotero.version === '4.999.0') { - await browser.tabs.executeScript(tab.id, { - file: "zotero-google-docs-integration/" + path, - frameId: 0, - runAt: 'document_start' - }); - continue; - } - await browser.tabs.executeScript(tab.id, { - code: this.scriptContents[path], - frameId: 0, - runAt: 'document_end' - }); - } - } -}; diff --git a/zotero-connectors/src/browserExt/i18n.js b/zotero-connectors/src/browserExt/i18n.js deleted file mode 100644 index d8708b46..00000000 --- a/zotero-connectors/src/browserExt/i18n.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.i18n = { - init: () => Zotero.Promise.resolve(), - getString: function(name, substitutions) { - if (substitutions != undefined && !Array.isArray(substitutions)) { - substitutions = [substitutions]; - } - var str; - if (Zotero.isChrome) { - // Chrome doesn't play nice with the browser-polyfill.js API for this function - str = chrome.i18n.getMessage(name, substitutions); - } else { - str = browser.i18n.getMessage(name, substitutions); - } - if (!str) { - Zotero.logError(new Error(`Localized string '${name}' not defined`)); - str = '{' + name + '}'; - } - return str; - } -}; diff --git a/zotero-connectors/src/browserExt/images/mac/zotero-z-16px-australis.png b/zotero-connectors/src/browserExt/images/mac/zotero-z-16px-australis.png deleted file mode 100644 index 97e92792..00000000 Binary files a/zotero-connectors/src/browserExt/images/mac/zotero-z-16px-australis.png and /dev/null differ diff --git a/zotero-connectors/src/browserExt/images/mac/zotero-z-32px-australis.png b/zotero-connectors/src/browserExt/images/mac/zotero-z-32px-australis.png deleted file mode 100644 index 50404943..00000000 Binary files a/zotero-connectors/src/browserExt/images/mac/zotero-z-32px-australis.png and /dev/null differ diff --git a/zotero-connectors/src/browserExt/images/unix/zotero-z-16px-australis.png b/zotero-connectors/src/browserExt/images/unix/zotero-z-16px-australis.png deleted file mode 100644 index f41c74f5..00000000 Binary files a/zotero-connectors/src/browserExt/images/unix/zotero-z-16px-australis.png and /dev/null differ diff --git a/zotero-connectors/src/browserExt/images/unix/zotero-z-32px-australis.png b/zotero-connectors/src/browserExt/images/unix/zotero-z-32px-australis.png deleted file mode 100644 index 2b8558b4..00000000 Binary files a/zotero-connectors/src/browserExt/images/unix/zotero-z-32px-australis.png and /dev/null differ diff --git a/zotero-connectors/src/browserExt/images/win/zotero-z-16px-australis.png b/zotero-connectors/src/browserExt/images/win/zotero-z-16px-australis.png deleted file mode 100644 index 33e095ed..00000000 Binary files a/zotero-connectors/src/browserExt/images/win/zotero-z-16px-australis.png and /dev/null differ diff --git a/zotero-connectors/src/browserExt/images/win/zotero-z-32px-australis.png b/zotero-connectors/src/browserExt/images/win/zotero-z-32px-australis.png deleted file mode 100644 index b62ed08e..00000000 Binary files a/zotero-connectors/src/browserExt/images/win/zotero-z-32px-australis.png and /dev/null differ diff --git a/zotero-connectors/src/browserExt/itemSelector/itemSelector_browserSpecific.js b/zotero-connectors/src/browserExt/itemSelector/itemSelector_browserSpecific.js deleted file mode 100644 index 9d54b001..00000000 --- a/zotero-connectors/src/browserExt/itemSelector/itemSelector_browserSpecific.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2010 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Sends a message back to the connector parent - */ -function sendMessage() { - if(responseSent) return; - responseSent = true; - browser.runtime.sendMessage(["selectDone", [tabID, items]]); - browser.windows.getCurrent().then(function (win) { - browser.windows.remove(win.id); - }); -} \ No newline at end of file diff --git a/zotero-connectors/src/browserExt/manifest.json b/zotero-connectors/src/browserExt/manifest.json deleted file mode 100644 index c4be960e..00000000 --- a/zotero-connectors/src/browserExt/manifest.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "Zotero Connector", - "manifest_version": 2, - "version": "AUTOFILLED", - "description": "Save references to Zotero from your web browser", - "default_locale": "en", - "browser_action": { - "default_icon": { - "16": "images/treeitem-webpage-gray.png", - "32": "images/treeitem-webpage-gray@2x.png", - "48": "images/treeitem-webpage-gray@48px.png" - }, - "default_title": "Save to Zotero" - }, - "permissions": ["http://*/*", "https://*/*", "tabs", "contextMenus", "cookies", - "webRequest", "webRequestBlocking", "webNavigation", "storage"], - "optional_permissions": ["management"], - "background": { - "scripts": [ - /*BACKGROUND SCRIPTS*/, - "background.js" - ] - }, - "content_scripts": [{ - "matches": ["http://*/*", "https://*/*"], - "run_at": "document_start", - "js": [/*INJECT SCRIPTS*/] - } - ], - "web_accessible_resources": [ - "images/*", - "progressWindow/progressWindow.html", - "modalPrompt/modalPrompt.html", - "test/data/journalArticle-single.html", - "lib/SingleFile/dist/hooks/hooks-web.js", - "lib/SingleFile/dist/hooks/hooks-frames-web.js" - ], - "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", - "homepage_url": "https://www.zotero.org/", - "icons": { - "16": "Icon-16.png", - "48": "Icon-48.png", - "96": "Icon-96.png", - "128": "Icon-128.png" - }, - "options_ui": { - "page": "preferences/preferences.html", - "open_in_tab": true - }, - "commands": { - "_execute_browser_action": { - "suggested_key": { - "default": "Ctrl+Shift+S" - } - } - }, - "minimum_chrome_version": "55", - "applications": { - "gecko": { - "id": "zotero@chnm.gmu.edu", - "update_url": "https://zotero.org/AUTOFILLED", - "strict_min_version": "51.0" - } - } -} \ No newline at end of file diff --git a/zotero-connectors/src/browserExt/messaging_inject.js b/zotero-connectors/src/browserExt/messaging_inject.js deleted file mode 100644 index 731ea34b..00000000 --- a/zotero-connectors/src/browserExt/messaging_inject.js +++ /dev/null @@ -1,136 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @namespace - * See messages.js for an overview of the message handling process. - */ -Zotero.Messaging = new function() { - var _messageListeners = {}; - - /** - * Add a message listener - */ - this.addMessageListener = function(messageName, callback) { - _messageListeners[messageName] = callback; - } - - /** - * Adds messaging functions to injected script. This adds Zotero.xxx.yyy functions for all - * entries in MESSAGES. These will send a message to the global script and return a promise. - * When a message is received, they will resolve the promise and call the callback function, - * which can be passed as the last argument to Zotero.xxx.yyy. - */ - this.init = function() { - for(var ns in MESSAGES) { - if(!Zotero[ns]) Zotero[ns] = {}; - for(var meth in MESSAGES[ns]) { - Zotero[ns][meth] = new function() { - var messageName = ns+MESSAGE_SEPARATOR+meth; - var messageConfig = MESSAGES[ns][meth]; - return async function() { - // see if last argument is a callback - var callback, callbackArg = null; - if(messageConfig) { - callbackArg = (messageConfig.callbackArg - ? messageConfig.callbackArg : arguments.length-1); - callback = arguments[callbackArg]; - if(typeof callback !== "function") { - // Zotero.debug("Message `"+messageName+"` has no callback arg. It should use the returned promise", 5); - callbackArg = null; - } - } - - // copy arguments to newArgs - var newArgs = new Array(arguments.length); - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -/** - * There's a limit of 5MB of locally stored data. - * https://developer.chrome.com/extensions/storage#property-local - */ -Zotero.Prefs = Object.assign(Zotero.Prefs, { - init: async function() { - await this.migrate(); - try { - this.syncStorage = await browser.storage.local.get(null); - } - catch (e) { - Zotero.debug("Prefs initialization failed"); - Zotero.logError(e); - } - }, - - migrate: async function() { - try { - if (!localStorage.length) return; - let prefs = Object.assign({}, localStorage); - for (let k of Object.keys(prefs)) { - if (k.substr(0, 'pref-'.length) == 'pref-') { - prefs[k.substr('pref-'.length)] = JSON.parse(prefs[k]); - } - delete prefs[k]; - } - // If translator metadata migration fails then we need the fetching from repo to - // fetch the full list - delete prefs["connector.repo.lastCheck.repoTime"]; - delete prefs["connector.repo.lastCheck.localTime"]; - await browser.storage.local.set(prefs); - - if ('translatorMetadata' in localStorage) { - await browser.storage.local.set( - {translatorMetadata: JSON.parse(localStorage['translatorMetadata'])}); - } - localStorage.clear() - } - catch (e) { - Zotero.debug('Attempting to migrate prefs threw an error'); - // Let's not, since this will log on every start for firefox people with - // dom.storage.enabled: false - // Zotero.logError(e); - Zotero.debug(e.message); - } - }, - - set: function(pref, value) { - Zotero.debug("Setting "+pref+" to "+JSON.stringify(value).substr(0, 100)); - let prefs = {}; - prefs[pref] = value; - - this.syncStorage[pref] = value; - return browser.storage.local.set(prefs); - }, - - clear: function(pref) { - if (Array.isArray(pref)) return Zotero.Promise.all(pref.map((p) => this.clear(p))); - delete this.syncStorage[pref]; - return browser.storage.local.remove(pref); - } -}); diff --git a/zotero-connectors/src/browserExt/singlefile.js b/zotero-connectors/src/browserExt/singlefile.js deleted file mode 100644 index 9dd6f56f..00000000 --- a/zotero-connectors/src/browserExt/singlefile.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2020 Corporation for Digital Scholarship - Vienna, Virginia, USA - https://www.zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.SingleFile = { - retrievePageData: async function() { - try { - // Call to background script to inject SingleFile - await Zotero.Connector_Browser.injectSingleFile(); - - Zotero.debug("SingleFile: Retrieving page data"); - let pageData = await singlefile.getPageData(Zotero.SingleFile.CONFIG); - Zotero.debug("SingleFile: Done retrieving page data"); - - return pageData.content; - } catch (e) { - Zotero.debug("SingleFile: Error retrieving page data", 2); - Zotero.debug(e.stack, 2); - throw e; - } - } -}; diff --git a/zotero-connectors/src/browserExt/test/test.html b/zotero-connectors/src/browserExt/test/test.html deleted file mode 100644 index f28de689..00000000 --- a/zotero-connectors/src/browserExt/test/test.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Connector Tests - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/zotero-connectors/src/browserExt/test/testSetup.js b/zotero-connectors/src/browserExt/test/testSetup.js deleted file mode 100644 index f91423f0..00000000 --- a/zotero-connectors/src/browserExt/test/testSetup.js +++ /dev/null @@ -1,234 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Provides #background(fn(args...), args...) and Tab.prototype.run(fn(args...), args...) to be used in tests, - * which allow to run arbitrary functions/code in the background page and an open tab. - * - * sinon.js is available in both the background page and tabs. Stub away! - * Bluebird and thus Promise.coroutine available in all tests - * - * The functions are converted to text and passed over the Tab boundary. Only primitive parameters can be passed, e.g. - * - * var success = yield background(function(url) { - * // Executed within the background page - * Zotero.Connector_Browser.openTab(url) - * return 'success' - * }, 'https://www.zotero.org/) - * - * Return value is a promise which resolves to the return value of the passed function. - * - * Errors across the tab boundary are rejected with shallow Error objects without the stack trace. - * Proper errors can be inspected in the background page console where they are logged. - */ - -// Waiting for Zotero.initBackground()/initInject() to run -// so that Zotero.isBackground/Zotero.isInject are set -setTimeout(function() { - if (typeof mocha != 'undefined') { - var runner = mocha.run(function() { - var elem = document.createElement('p'); - elem.setAttribute('id', 'mocha-tests-complete'); - document.body.appendChild(elem); - }); - - // Log results for Selenium access - window.testResults = []; - var flattenTitles = function(test){ - let titles = [test.title]; - while (test.parent.title){ - titles.push(test.parent.title); - test = test.parent; - } - return titles.reverse(); - }; - function logResult(test, error) { - try { - window.testResults.push({ - title: flattenTitles(test), - error: error && JSON.stringify(error, ['message', 'stack'].concat(Object.keys(error)))}); - } catch (e) { - window.testResults.push({title: flattenTitles(test), error: JSON.stringify(error)}); - } - } - runner.on('pass', logResult); - runner.on('fail', logResult); - } -}, 500); - -Zotero.initDeferred.promise.then(function() { - if (Zotero.isBackground) { - // background page - Zotero.Background = { - run: async function(code) { - try { - eval(`var fn = ${code}`); - return fn.apply(null, Array.from(arguments).slice(1)); - } catch (e) { - Zotero.logError(e); - throw e; - } - } - } - Zotero.Background.registeredTabs = {}; - browser.tabs.onUpdated.addListener(async function(tabId, changeInfo, tab) { - var deferred = Zotero.Background.registeredTabs[tabId]; - if (!deferred || deferred.resolved || changeInfo.status != 'complete') return; - // Don't try to inject in extension own pages - if (tab.url.includes('-extension://')) { - return Zotero.Promise.delay(1000).then(function() { - deferred.resolved = true; - deferred.resolve(tab.id) - }); - } - - let scripts = [ 'lib/sinon.js', 'test/testSetup.js' ]; - try { - await Zotero.Connector_Browser.injectScripts(scripts, tab); - deferred.resolved = true; - deferred.resolve(tab.id); - } catch(e) { - deferred.resolved = true; - deferred.reject(e) - } - }); - Zotero.Background.getTabByID = async function(tabId) { - return browser.tabs.get(tabId); - }; - } - else if (Zotero.isInject || Zotero.isPreferences) { - // injected page - var listenerName = 'run'; - if (window.top != window) { - listenerName = `run-${document.location.href}`; - } - Zotero.Messaging.addMessageListener(listenerName, function(args) { - var code = args[0]; - eval(`var fn = ${code}`); - code = undefined; - return fn.apply(null, args.slice(1)); - }); - } -}); - -if (typeof mocha != 'undefined') { - // test.html - /** - * @param code {Function|String} - * @params {Object} ... parameters to be passed into the function to be run - * @returns {Promise} return value of the function - */ - var background = Promise.coroutine(function* (code) { - if (typeof code == 'function') { - arguments[0] = code.toString(); - } - return Zotero.Background.run.apply(null, arguments); - }); - function getExtensionURL(url) { - return browser.runtime.getURL(url); - } - - var Tab = function() {}; - window.Tab.prototype = { - init: Promise.coroutine(function* (url='http://zotero-static.s3.amazonaws.com/test.html') { - this.tabId = yield background(async function(url) { - var deferred = Zotero.Promise.defer(); - var tab = await browser.tabs.create({url, active: false}); - Zotero.Background.registeredTabs[tab.id] = deferred; - return deferred.promise; - }, url); - }), - - navigate: Promise.coroutine(function* (url) { - if (this.tabId == undefined) { - throw new Error('Must run Tab#init() before Tab#run'); - } - yield background(function(url, tabId) { - Zotero.Background.registeredTabs[tabId] = Zotero.Background.defer(); - browser.tabs.update(tabId, {url}); - return Zotero.Background.registeredTabs[tabId].promise; - }, url, this.tabId); - yield Promise.delay(450); - if (Zotero.isFirefox) { - // Firefox is just slow in injecting.. - yield Promise.delay(1500); - } - }), - - run: Promise.coroutine(function* (code) { - return this.runInFrame.apply(this, [null].concat(Array.from(arguments))); - }), - - runInFrame: async function(frameURL, code) { - if (this.tabId == undefined) { - throw new Error('Must run Tab#init() before Tab#run'); - } - if (typeof code == 'function') { - arguments[1] = code.toString(); - } - var listenerName = 'run'; - if (frameURL) { - listenerName = `run-${frameURL}`; - // Seems that frames are not initialized if the tab is inactive in Chrome - // so we focus the tab for a bit. - await background(async function(tabId) { - var prevActiveTab = await browser.tabs.query({active: true, currentWindow: true}); - await browser.tabs.update(tabId, {active: true}); - await Zotero.Promise.delay(100); - await browser.tabs.update(prevActiveTab[0].id, {active: true}); - }, this.tabId) - } - var args = Array.from(arguments).slice(1); - // NOTE: Due to chrome/browser API-compat stuff this needs to use Promise#then(). Do not change! - return browser.tabs.sendMessage(this.tabId, [listenerName, args], {}) - .then(function(response) { - if (response && response[0] == 'error') { - response[1] = JSON.parse(response[1]); - let e = new Error(response[1].message); - for (let key in response[1]) e[key] = response[1][key]; - throw e; - } - return response; - }, function(e) { - if (!(e instanceof Error)) { - throw new Error(e.message); - } - }); - }, - - close: Promise.coroutine(function* () { - if (this.tabId == undefined) { - throw new Error('Must run Tab#init() before Tab#close'); - } - yield browser.tabs.remove(this.tabId); - delete this.tabId; - }) - }; - - var assert = chai.assert; - Zotero.Messaging.init(); - mocha.setup({ui: 'bdd', timeout: 6000}); -} - diff --git a/zotero-connectors/src/browserExt/webRequestIntercept.js b/zotero-connectors/src/browserExt/webRequestIntercept.js deleted file mode 100644 index 3457fd04..00000000 --- a/zotero-connectors/src/browserExt/webRequestIntercept.js +++ /dev/null @@ -1,148 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Handles web request interception and header parsing - */ - -(function() { - -'use strict'; - -Zotero.WebRequestIntercept = { - listeners: { - beforeSendHeaders: [], - headersReceived: [], - errorOccurred: [] - }, - - reqIDToReqMeta: {}, - - init: function() { - const types = ["main_frame", "sub_frame"]; - browser.webRequest.onBeforeSendHeaders.addListener(Zotero.WebRequestIntercept.handleRequest('beforeSendHeaders'), {urls: [''], types}, ['blocking', 'requestHeaders']); - browser.webRequest.onErrorOccurred.addListener(Zotero.WebRequestIntercept.removeRequestMeta, {urls: [''], types}); - browser.webRequest.onCompleted.addListener(Zotero.WebRequestIntercept.removeRequestMeta, {urls: [''], types}); - browser.webRequest.onHeadersReceived.addListener(Zotero.WebRequestIntercept.handleRequest('headersReceived'), {urls: [''], types}, ['blocking', 'responseHeaders']); - - Zotero.WebRequestIntercept.addListener('beforeSendHeaders', Zotero.WebRequestIntercept.storeRequestHeaders) - }, - - storeRequestHeaders: function(details, meta) { - meta.requestHeadersObject = details.requestHeadersObject; - }, - - removeRequestMeta: function(details) { - delete Zotero.WebRequestIntercept.reqIDToReqMeta[details.requestId]; - }, - - /** - * Convert from webRequest.HttpHeaders array to a lowercased object. - * - * headers = _processHeaders(details.requestHeaders) - * console.log(headers['accept-charset']) // utf-8 - * - * @param {Array} headerArray - * @return {Object} headers - */ - processHeaders: function(headerArray) { - if (!Array.isArray(headerArray)) return headerArray; - - let headers = {}; - for (let header of headerArray) { - headers[header.name.toLowerCase()] = header.value; - } - return headers; - }, - - handleRequest: function(requestType) { - return function(details) { - if (!Zotero.WebRequestIntercept.listeners[requestType].length) return; - - let meta = Zotero.WebRequestIntercept.reqIDToReqMeta[details.requestId]; - if (!meta) { - meta = {}; - Zotero.WebRequestIntercept.reqIDToReqMeta[details.requestId] = meta; - } - - if (meta.requestHeadersObject) { - details.requestHeadersObject = meta.requestHeadersObject; - } else if (details.requestHeaders) { - details.requestHeadersObject = Zotero.WebRequestIntercept.processHeaders(details.requestHeaders); - } - - if (details.responseHeaders) { - details.responseHeadersObject = Zotero.WebRequestIntercept.processHeaders(details.responseHeaders); - } - - var returnValue = null; - for (let listener of Zotero.WebRequestIntercept.listeners[requestType]) { - let retVal = listener(details, meta); - if (typeof retVal == 'object') { - returnValue = Object.assign(returnValue || {}, retVal); - } - } - if (returnValue !== null) { - return returnValue; - } - } - }, - - addListener: function(requestType, listener) { - if (Zotero.WebRequestIntercept.listeners[requestType] === undefined) { - throw new Error(`Web request listener for '${requestType}' not allowed`); - } - if (typeof listener != 'function') { - throw new Error(`Web request listener of type ${typeof listener} is not allowed`); - } - Zotero.WebRequestIntercept.listeners[requestType].push(listener) - }, - - removeListener: function(requestType, listener) { - if (Zotero.WebRequestIntercept.listeners[requestType] === undefined) { - throw new Error(`Web request listener for '${requestType}' not allowed`); - } - if (typeof listener != 'function') { - throw new Error(`Web request listener of type ${typeof listener} is not allowed`); - } - let idx = Zotero.WebRequestIntercept.listeners[requestType].indexOf(listener); - if (idx != -1) { - Zotero.WebRequestIntercept.listeners[requestType].splice(idx, 1); - } - }, - - replaceUserAgent: function(url, userAgent) { - function userAgentReplacer(details) { - if (details.url === url) { - Zotero.debug(`Replacing User-Agent for ${url} to ${userAgent}`); - browser.webRequest.onBeforeSendHeaders.removeListener(userAgentReplacer); - return {requestHeaders: [{name: 'User-Agent', value: userAgent}]}; - } - } - browser.webRequest.onBeforeSendHeaders.addListener(userAgentReplacer, {urls: [''], types: ['xmlhttprequest']}, ['blocking', 'requestHeaders']); - } -} - -})(); diff --git a/zotero-connectors/src/common/api.js b/zotero-connectors/src/common/api.js deleted file mode 100644 index 56a6192d..00000000 --- a/zotero-connectors/src/common/api.js +++ /dev/null @@ -1,384 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.API = new function() { - var _tokenSecret; - var config = ZOTERO_CONFIG; - - /** - * Decodes application/x-www-form-urlencoded data - */ - function _decodeFormData(postData) { - var splitData = postData.split("&"); - var decodedData = {}; - for(var i in splitData) { - var variable = splitData[i]; - var splitIndex = variable.indexOf("="); - decodedData[decodeURIComponent(variable.substr(0, splitIndex))] = - decodeURIComponent(variable.substr(splitIndex+1).replace(/\+/g, "%20")); - } - return decodedData; - } - - /** - * Performs OAuth authorization - */ - this.authorize = async function() { - if (this._deferred) { - if (this._authWindow) { - Zotero.Connector_Browser.bringToFront(false, this._authWindow.tabs[0]); - } - return this._deferred.promise; - } - this._deferred = Zotero.Promise.defer(); - this._deferred.promise - .then((r) => {this._deferred = null}, (e) => {this._deferred = null}); - - var oauthSimple = new OAuthSimple(config.OAUTH.ZOTERO.CLIENT_KEY, - config.OAUTH.ZOTERO.CLIENT_SECRET); - oauthSimple.setURL(config.OAUTH.ZOTERO.REQUEST_URL); - oauthSimple.setAction("POST"); - - let options = { - body: '', - headers: {"Authorization": oauthSimple.getHeaderString()} - }; - try { - let xmlhttp = await Zotero.HTTP.request("POST", config.OAUTH.ZOTERO.REQUEST_URL, options) - // parse output and store token_secret - var data = _decodeFormData(xmlhttp.responseText); - _tokenSecret = data.oauth_token_secret; - - // get signed URL - oauthSimple.signatures(data); - oauthSimple.setURL(config.OAUTH.ZOTERO.AUTHORIZE_URL); - var signature = oauthSimple.sign(); - - // add parameters - var url = signature.signed_url+"&library_access=1¬es_access=0&write_access=1&name=Zotero Connector for "; - if (Zotero.isChrome) { - url += "Chrome"; - } else if(Zotero.isSafari) { - url += "Safari"; - } else if (Zotero.isFirefox) { - url += "Firefox"; - } else if (Zotero.isEdge) { - url += "Edge"; - } - - this._authWindow = await Zotero.Connector_Browser.openWindow(url, {width: 900, height: 600, type: 'normal', - onClose: Zotero.API.onAuthorizationCancel.bind(Zotero.API)}); - } - catch (e) { - Zotero.logError(`OAuth request failed with ${e.status}; response was ${e.responseText}`); - this._deferred.reject(new Error("An invalid response was received from the Zotero server")); - } - return this._deferred.promise; - }; - - /** - * Called when OAuth is complete - * @param {String} data The query string received from OAuth - * @param {Tab} tab The object corresponding to the tab where OAuth completed - */ - this.onAuthorizationComplete = async function(data, tab) { - // close auth window - // ensure that tab close listeners don't have a promise they can reject - // this is kinda awful. - let deferred = this._deferred; - this._deferred = null; - if(Zotero.isBrowserExt) { - browser.tabs.remove(tab.id); - } else if (Zotero.isSafari) { - Zotero.Connector_Browser.closeTab(tab); - } - - if(!_tokenSecret) { - throw new Error("onAuthenticationComplete called with no outstanding OAuth request"); - } - - var oauthSimple = new OAuthSimple(config.OAUTH.ZOTERO.CLIENT_KEY, - config.OAUTH.ZOTERO.CLIENT_SECRET); - oauthSimple.setURL(config.OAUTH.ZOTERO.ACCESS_URL); - oauthSimple.setParameters(_decodeFormData(data)); - oauthSimple.signatures({oauth_token_secret: _tokenSecret}); - oauthSimple.setAction("POST"); - _tokenSecret = undefined; - - let options = { - body: '', - headers: {"Authorization": oauthSimple.getHeaderString()} - }; - try { - var xmlhttp = await Zotero.HTTP.request("POST", config.OAUTH.ZOTERO.ACCESS_URL, options) - } - catch(e) { - Zotero.logError(`OAuth access failed with ${e.status}; response was ${e.responseText}`); - return deferred.reject(new Error("An invalid response was received from the Zotero server")); - } - data = _decodeFormData(xmlhttp.responseText); - - let keysUrl = config.API_URL+"users/"+encodeURI(data['auth-userID']) + "/keys/current"; - xmlhttp = await Zotero.HTTP.request("GET", keysUrl, { - headers: { - "Zotero-API-Key": data.oauth_token_secret, - "Zotero-API-Version": "3" - } - }); - try { - var json = JSON.parse(xmlhttp.responseText), - access = json.access; - } catch(e) {}; - - let responseText = xmlhttp.responseText.replace(data.oauth_token_secret, '[API_KEY_HIDDEN]'); - - if(!access || !access.user) { - Zotero.logError("Key verification failed with "+xmlhttp.status+'; response was '+responseText); - Zotero.logError("Key verification failed with "+xmlhttp.status+'; response was '+xmlhttp.responseText); - return deferred.reject(new Error("API key could not be verified")); - } - - if(!access.user.library || !access.user.write) { - Zotero.logError("Generated key had inadequate permissions; response was "+responseText); - return deferred.reject(new Error("The key you have generated does not have adequate "+ - "permissions to save items to your Zotero library. Please try again "+ - "without modifying your key's permissions.")); - } - - Zotero.Prefs.set('auth-token', data.oauth_token); - Zotero.Prefs.set('auth-token_secret', data.oauth_token_secret); - Zotero.Prefs.set('auth-userID', data.userID); - Zotero.Prefs.set('auth-username', data.username); - - return deferred.resolve({"auth-username": data.username, "auth-userID": data.userID}); - }; - - this.onAuthorizationCancel = function() { - if (this._deferred) { - this._deferred.reject(new Error('Authorization cancelled.')); - } - }; - - /** - * Clears OAuth credentials from storage - */ - this.clearCredentials = function() { - let keys = ['auth-token', 'auth-token_secret', 'auth-userID', 'auth-username']; - Zotero.Prefs.clear(keys); - // TODO revoke key - }; - - /** - * Gets authorized username - * @param {Function} callback Callback to receive username (or null if none is define) - */ - this.getUserInfo = Zotero.Promise.method(function() { - let keys = ['auth-token_secret', 'auth-userID', 'auth-username']; - return Zotero.Prefs.getAsync(keys).catch(function() { - return null; - }); - }); - - /** - * Creates a new item. In Safari, this runs in the background script. In Chrome, it - * runs in the injected script. - * @param {Object} payload Item(s) to create, in the object format expected by the server. - * @param {String|null} itemKey Parent item key, or null if a top-level item. - * @param {Boolean} [askForAuth] If askForAuth === false, don't ask for authorization if not - * already authorized. - */ - this.createItem = async function(payload, askForAuth) { - var userInfo = await Zotero.API.getUserInfo(); - if(!userInfo) { - if(askForAuth === false) { - throw new Error("Not authorized"); - } - return Zotero.API.authorize().then(function() { - return Zotero.API.createItem(payload, false); - }, function(e) { - e.message = `Authentication failed: ${e.message}`; - throw e; - }) - } - - var url = config.API_URL + "users/" + userInfo['auth-userID'] + "/items"; - var options = { - body: JSON.stringify(payload), - headers: { - "Content-Type": "application/json", - "Zotero-API-Key": userInfo['auth-token_secret'], - "Zotero-API-Version": "3" - } - }; - try { - var xhr = await Zotero.HTTP.request("POST", url, options); - return xhr.responseText; - } - catch(e) { - if (askForAuth && e.status === 403) { - return Zotero.API.createItem(payload, true); - } - Zotero.logError(e); - throw e; - }; - }; - - /** - * Uploads an attachment to the Zotero server. In Safari, this runs in the background - * script. In Chrome, it runs in the injected script. - * @param {Object} attachment An attachment object. This object must have the following keys
    - * id - a unique identifier for the attachment used to identifiy it in subsequent progress - * messages
    - * data - the attachment contents, as a typed array
    - * filename - a filename for the attachment
    - * key - the attachment item key
    - * md5 - the MD5 hash of the attachment contents
    - * mimeType - the attachment MIME type - */ - this.uploadAttachment = function(attachment, callbackOrTab) { - var _dispatchAttachmentCallback = function(id, status, error) { - Zotero.Messaging.sendMessage("attachmentCallback", - (error ? [id, status, error.toString()] : [id, status]), callbackOrTab); - }; - - const REQUIRED_PROPERTIES = ["id", "data", "filename", "key", "md5", "mimeType"]; - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Emulates very small parts of cachedTypes.js and itemFields.js APIs for use with connector - */ - -/** - * @namespace - */ -Zotero.Connector_Types = new function() { - var TypeSchema = ZOTERO_TYPE_SCHEMA; - /** - * Initializes types - * @param {Object} typeSchema typeSchema generated by Zotero.Connector.GetData#_generateTypeSchema - */ - this.init = function() { - const schemaTypes = ["itemTypes", "creatorTypes", "fields"]; - - // attach IDs and make referenceable by either ID or name - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -// TODO: refactor this class -Zotero.Connector = new function() { - const CONNECTOR_API_VERSION = 2; - - var _ieStandaloneIframeTarget, _ieConnectorCallbacks; - this.isOnline = (Zotero.isSafari || Zotero.isFirefox) ? false : null; - this.shouldReportActiveURL = true; - this.clientVersion = ''; - - /** - * Checks if Zotero is online and passes current status to callback - * @param {Function} callback - */ - this.checkIsOnline = async function() { - // Only check once in bookmarklet - if(Zotero.isBookmarklet && this.isOnline !== null) { - return this.isOnline; - } - - return this.ping({}).catch(function(e) { - if (e.status != 0) { - Zotero.debug("Checking if Zotero is online returned a non-zero HTTP status."); - Zotero.logError(e); - } - return false; - }); - }; - - this.reportActiveURL = function(url) { - if (!this.isOnline || !this.shouldReportActiveURL) return; - - let payload = { activeURL: url }; - this.ping(payload); - } - - // For use in injected pages - this.getPref = function(pref) { - return Zotero.Connector[pref]; - } - - this.ping = function(payload={}) { - return Zotero.Connector.callMethod("ping", payload).then(function(response) { - if (response && 'prefs' in response) { - Zotero.Connector.shouldReportActiveURL = !!response.prefs.reportActiveURL; - Zotero.Connector.automaticSnapshots = !!response.prefs.automaticSnapshots; - Zotero.Connector.googleDocsAddNoteEnabled = !!response.prefs.googleDocsAddNoteEnabled; - } - return response || {}; - }); - } - - this.getClientVersion = async function() { - let isOnline = await this.checkIsOnline(); - return isOnline && this.clientVersion; - } - - /** - * Sends the XHR to execute an RPC call. - * - * @param {String|Object} options - The method name as a string or an object with the - * following properties: - * method - method name - * headers - an object of HTTP headers to send - * queryString - a query string to pass on the HTTP call - * [timeout=15000] - the timeout for the HTTP request - * @param {Object} data - RPC data to POST. If null or undefined, a GET request is sent. - * @param {Function} callback - Function to be called when requests complete. - */ - this.callMethod = async function(options, data, tab) { - // Don't bother trying if not online in bookmarklet - if (Zotero.isBookmarklet && this.isOnline === false) { - throw new Zotero.Connector.CommunicationError("Zotero Offline", 0); - } - if (typeof options == 'string') { - options = {method: options}; - } - var method = options.method; - var headers = Object.assign({ - "Content-Type":"application/json", - "X-Zotero-Version":Zotero.version, - "X-Zotero-Connector-API-Version":CONNECTOR_API_VERSION - }, options.headers || {}); - var timeout = "timeout" in options ? options.timeout : 15000; - var queryString = options.queryString ? ("?" + options.queryString) : ""; - - var deferred = Zotero.Promise.defer(); - var newCallback = function(req) { - try { - var isOnline = req.status !== 0 && req.status !== 403 && req.status !== 412; - - if (req.status != 0) { - Zotero.Connector.clientVersion = req.getResponseHeader('X-Zotero-Version'); - if (Zotero.Connector.isOnline !== isOnline) { - Zotero.Connector.isOnline = isOnline; - if (Zotero.Connector_Browser && Zotero.Connector_Browser.onStateChange) { - Zotero.Connector_Browser.onStateChange(isOnline && Zotero.Connector.clientVersion); - } - } - } - var val = null; - if(req.responseText) { - let contentType = req.getResponseHeader("Content-Type") || "" - if (contentType.includes("application/json")) { - val = JSON.parse(req.responseText); - } else { - val = req.responseText; - } - } - if(req.status == 0 || req.status >= 400) { - // Check for incompatible version - if(req.status === 412) { - if(Zotero.Connector_Browser && Zotero.Connector_Browser.onIncompatibleStandaloneVersion) { - var standaloneVersion = req.getResponseHeader("X-Zotero-Version"); - Zotero.Connector_Browser.onIncompatibleStandaloneVersion(Zotero.version, standaloneVersion); - deferred.reject("Connector: Version mismatch: Connector version "+Zotero.version - +", Standalone version "+(standaloneVersion ? standaloneVersion : "", val)); - } - } - - Zotero.debug("Connector: Method "+method+" failed with status "+req.status); - deferred.reject(new Zotero.Connector.CommunicationError(`Method ${method} failed`, req.status, val)); - } else { - Zotero.debug("Connector: Method "+method+" succeeded"); - deferred.resolve(val); - } - } catch(e) { - Zotero.logError(e); - deferred.reject(new Zotero.Connector.CommunicationError(e.message, 0)); - } - }; - - var uri = Zotero.Prefs.get('connector.url') + "connector/" + method + queryString; - if (headers["Content-Type"] == 'application/json') { - data = JSON.stringify(data); - } - else if (headers["Content-Type"] == 'multipart/form-data') { - let formData = new FormData(); - for (const entry in data) { - // For SingleFile binary arrays, convert them to blobs - if (entry.startsWith('binary-')) { - const int8array = new Uint8Array(Object.values(data[entry])); - formData.append(entry, new Blob([int8array])); - } - else { - formData.append(entry, data[entry]); - } - } - data = formData; - } - options = {body: data, headers, successCodes: false, timeout}; - let httpMethod = data == null || data == undefined ? "GET" : "POST"; - Zotero.HTTP.request(httpMethod, uri, options) - .then(newCallback) - // Unexpected error, including a timeout - .catch(function (e) { - Zotero.logError(e); - deferred.reject(e); - }); - return deferred.promise; - }, - - /** - * Adds detailed cookies to the data before sending "saveItems" request to - * the server/Standalone - * - * @param {String|Object} options. See documentation above - * @param {Object} data RPC data. See documentation above. - */ - this.callMethodWithCookies = function(options, data, tab) { - if (Zotero.isBrowserExt && !Zotero.isBookmarklet) { - let cookieParams = { - url: tab.url - }; - // When first-party isolation is enabled in Firefox, browser.cookies.getAll() - // will fail if firstPartyDomain isn't provided, causing all saves to fail. According - // to the document [1], passing null should cause all cookies to be returned, but as - // of Fx60.0b7 that doesn't seem to be working, returning no cookies instead. (It - // returns all cookies if FPI is disabled.) - // - // In 60.0b7 it does work to set the domain explicitly (e.g., 'gmu.edu'), but we - // can't get that correctly without the public suffix list, which isn't yet available - // to WebExtensions [2], so for now we pass null, which will cause attachments that - // rely on cookies to fail but will at least allow saves to go through when FPI is - // enabled. - // - // https://github.com/zotero/zotero-connectors/issues/226 - // - // [1] https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/cookies/getAll - // [2] https://bugzilla.mozilla.org/show_bug.cgi?id=1315558 - if (Zotero.isFirefox && Zotero.browserMajorVersion >= 59) { - cookieParams.firstPartyDomain = null; - } - return browser.cookies.getAll(cookieParams) - .then(function(cookies) { - var cookieHeader = ''; - for(var i=0, n=cookies.length; i. - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.Errors = new function() { - var _output = []; - - /** - * Error handler - * @param {String} string Error string - * @param {String} url URL of error - * @param {Number} line Line where error occurred - */ - this.log = function(string, url, line) { - var err = ['[JavaScript Error: "', string, '"']; - if (url || line) { - var info = []; - if (url) info.push('file: "' + url + '"'); - if (line) info.push('line: ' + line); - err.push(" {" + info.join(" ") + "}"); - } - err.push("]"); - err = err.join(""); - _output.push(err); - } - - /** - * Gets errors as an array of strings - */ - this.getErrors = async function() { - return _output.slice(); - } - - /** - * Sends an error report to the server - * NB: Runs on the prefs injected page on Safari - * since responseXML or DOMParser are unavailable - * in the global page - */ - this.sendErrorReport = async function() { - var info = await Zotero.getSystemInfo(); - var parts = { - error: "true", - errorData: (await this.getErrors()).join('\n'), - extraData: '', - diagnostic: info - }; - - var body = ''; - for (var key in parts) { - body += key + '=' + encodeURIComponent(parts[key]) + '&'; - } - body = body.substr(0, body.length - 1); - let headers = { - 'Content-Type': 'application/x-www-form-urlencoded' - }; - let options = { - body, - headers - }; - var xmlhttp = await Zotero.HTTP.request("POST", "https://www.zotero.org/repo/report", options); - let responseXML; - try { - let parser = new DOMParser(); - responseXML = parser.parseFromString(xmlhttp.responseText, "text/xml"); - } catch (e) { - throw new Error('Invalid response from repository'); - } - var reported = responseXML.getElementsByTagName('reported'); - if (reported.length != 1) { - throw new Error('Invalid response from repository'); - } - return reported[0].getAttribute('reportID'); - } -} - -if (typeof Zotero.Debug != "undefined") { - // Remove access to Zotero.Debug - //Zotero.Debug.bgInit = Zotero.Debug.init; -} diff --git a/zotero-connectors/src/common/http.js b/zotero-connectors/src/common/http.js deleted file mode 100644 index 3396fe49..00000000 --- a/zotero-connectors/src/common/http.js +++ /dev/null @@ -1,317 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Functions for performing HTTP requests, both via XMLHTTPRequest and using a hidden browser - * @namespace - */ -Zotero.HTTP = new function() { - this.StatusError = function(xmlhttp, url) { - this.message = `HTTP request to ${url} rejected with status ${xmlhttp.status}`; - this.status = xmlhttp.status; - try { - this.responseText = typeof xmlhttp.responseText == 'string' ? xmlhttp.responseText : undefined; - } catch (e) {} - }; - this.StatusError.prototype = Object.create(Error.prototype); - - this.TimeoutError = function(url, ms) { - this.message = `HTTP request to ${url} has timed out after ${ms}ms`; - }; - this.TimeoutError.prototype = Object.create(Error.prototype); - - /** - * Get a promise for a HTTP request - * - * @param {String} method The method of the request ("GET", "POST", "HEAD", or "OPTIONS") - * @param {String} url URL to request - * @param {Object} [options] Options for HTTP request:
      - *
    • body - The body of a POST request
    • - *
    • headers - Object of HTTP headers to send with the request
    • - *
    • debug - Log response text and status code
    • - *
    • logBodyLength - Length of request body to log
    • - *
    • timeout - Request timeout specified in milliseconds [default 15000]
    • - *
    • responseType - The response type of the request from the XHR spec
    • - *
    • responseCharset - The charset the response should be interpreted as
    • - *
    • successCodes - HTTP status codes that are considered successful, or FALSE to allow all
    • - *
    - * @return {Promise} A promise resolved with the XMLHttpRequest object if the - * request succeeds, or rejected if the browser is offline or a non-2XX status response - * code is received (or a code not in options.successCodes if provided). - */ - this.request = async function(method, url, options = {}) { - // Default options - options = Object.assign({ - body: null, - headers: {}, - debug: false, - logBodyLength: 1024, - timeout: 15000, - responseType: '', - responseCharset: null, - successCodes: null - }, options); - - var useContentXHR = false; - - if (Zotero.isInject) { - // The privileged XHR that Firefox makes available to content scripts so that they - // can make cross-domain requests doesn't include the Referer header in requests [1], - // so sites that check for it don't work properly. As long as we're not making a - // cross-domain request, we can use the content XHR that it provides, which does - // include Referer. Chrome's XHR in content scripts includes Referer by default. - // - // [1] https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#XHR_and_Fetch - if (Zotero.HTTP.isSameOrigin(url) && !(Zotero.isSafari && options.headers['User-Agent'])) { - if (typeof content != 'undefined' && content.XMLHttpRequest) { - Zotero.debug("Using content XHR"); - useContentXHR = true; - } - } - else { - if (Zotero.isBookmarklet) { - Zotero.debug("HTTP: Attempting cross-site request from bookmarklet; this may fail"); - } - else { - // Make a cross-origin request via the background page, parsing the responseText with - // DOMParser and returning a Proxy with 'response' set to the parsed document - let isDocRequest = options.responseType == 'document'; - let coOptions = Object.assign({}, options); - if (isDocRequest) { - coOptions.responseType = 'text'; - } - if (Zotero.isSafari && options.headers['User-Agent']) { - coOptions.headers['Cookie'] = document.cookie; - } - return Zotero.COHTTP.request(method, url, coOptions).then(function (xmlhttp) { - if (!isDocRequest) return xmlhttp; - - Zotero.debug("Parsing cross-origin response for " + url); - let parser = new DOMParser(); - let contentType = xmlhttp.getResponseHeader("Content-Type"); - if (contentType != 'application/xml' && contentType != 'text/xml') { - contentType = 'text/html'; - } - let doc = parser.parseFromString(xmlhttp.responseText, contentType); - - return new Proxy(xmlhttp, { - get: function (target, name) { - return name == 'response' ? doc : target[name]; - } - }); - }); - } - } - } - - let logBody = ''; - if (['GET', 'HEAD'].includes(method)) { - if (options.body != null) { - throw new Error(`HTTP ${method} cannot have a request body (${options.body})`) - } - } else if(options.body) { - if (options.headers["Content-Type"] !== 'multipart/form-data') { - options.body = typeof options.body == 'string' ? options.body : JSON.stringify(options.body); - - logBody = `: ${options.body.substr(0, options.logBodyLength)}` + - options.body.length > options.logBodyLength ? '...' : ''; - // TODO: make sure below does its job in every API call instance - // Don't display password or session id in console - logBody = logBody.replace(/password":"[^"]+/, 'password":"********'); - logBody = logBody.replace(/password=[^&]+/, 'password=********'); - } - - if (!options.headers) options.headers = {}; - if (!options.headers["Content-Type"]) { - options.headers["Content-Type"] = "application/x-www-form-urlencoded"; - } - else if (options.headers["Content-Type"] == 'multipart/form-data') { - // Allow XHR to set Content-Type with boundary for multipart/form-data - delete options.headers["Content-Type"]; - } - } - if (options.headers['User-Agent'] && Zotero.isBrowserExt) { - await Zotero.WebRequestIntercept.replaceUserAgent(url, options.headers['User-Agent']); - delete options.headers['User-Agent']; - } - Zotero.debug(`HTTP ${method} ${url}${logBody}`); - - var xmlhttp = useContentXHR ? new content.XMLHttpRequest() : new XMLHttpRequest(); - xmlhttp.timeout = options.timeout; - var promise = Zotero.HTTP._attachHandlers(url, xmlhttp, options); - - xmlhttp.open(method, url, true); - - for (let header in options.headers) { - xmlhttp.setRequestHeader(header, options.headers[header]); - } - - xmlhttp.responseType = options.responseType || ''; - - // Maybe should provide "mimeType" option instead. This is xpcom legacy, where responseCharset - // could be controlled manually - if (options.responseCharset) { - xmlhttp.overrideMimeType("text/plain; charset=" + options.responseCharset); - } - - xmlhttp.send(options.body); - - return promise.then(function(xmlhttp) { - if (options.debug) { - if (xmlhttp.responseType == '' || xmlhttp.responseType == 'text') { - Zotero.debug(`HTTP ${xmlhttp.status} response: ${xmlhttp.responseText}`); - } - else { - Zotero.debug(`HTTP ${xmlhttp.status} response`); - } - } - - let invalidDefaultStatus = options.successCodes === null && - (xmlhttp.status < 200 || xmlhttp.status >= 300); - let invalidStatus = Array.isArray(options.successCodes) && !options.successCodes.includes(xmlhttp.status); - if (invalidDefaultStatus || invalidStatus) { - throw new Zotero.HTTP.StatusError(xmlhttp, url); - } - return xmlhttp; - }); - }; - /** - * Send an HTTP GET request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} responseCharset - * @param {N/A} cookieSandbox Not used in Connector - * @param {Object} headers HTTP headers to include with the request - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doGet = function(url, onDone, responseCharset, cookieSandbox, headers) { - Zotero.debug('Zotero.HTTP.doGet is deprecated. Use Zotero.HTTP.request'); - this.request('GET', url, {responseCharset, headers}) - .then(onDone, function(e) { - onDone({status: e.status, responseText: e.responseText}); - throw (e); - }); - return true; - }; - - /** - * Send an HTTP POST request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {String|Object[]} body Request body - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} headers Request HTTP headers - * @param {String} responseCharset - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doPost = function(url, body, onDone, headers, responseCharset) { - Zotero.debug('Zotero.HTTP.doPost is deprecated. Use Zotero.HTTP.request'); - this.request('POST', url, {body, responseCharset, headers}) - .then(onDone, function(e) { - onDone({status: e.status, responseText: e.responseText}); - throw (e); - }); - return true; - }; - - - /** - * Adds a ES6 Proxied location attribute - * @param doc - * @param docUrl - */ - this.wrapDocument = function(doc, docURL) { - // CHANGED: No idea what's the purpose of this require('url').parse stuff, but it's not working; so emulate it - //let url = require('url'); - //docURL = url.parse(docURL); - url = docURL - docURL = { - toString: () => url, - href: url, - } - var wrappedDoc = new Proxy(doc, { - get: function (t, prop) { - if (prop === 'location') { - return docURL; - } - else if (prop == 'evaluate') { - // If you pass the document itself into doc.evaluate as the second argument - // it fails, because it receives a proxy, which isn't of type `Node` for some reason. - // Native code magic. - return function() { - if (arguments[1] == wrappedDoc) { - arguments[1] = t; - } - return t.evaluate.apply(t, arguments) - } - } - else { - if (typeof t[prop] == 'function') { - return t[prop].bind(t); - } - return t[prop]; - } - } - }); - return wrappedDoc; - }; - - - /** - * Adds request handlers to the XMLHttpRequest and returns a promise that resolves when - * the request is complete. xmlhttp.send() still needs to be called, this just attaches the - * handler - * - * See {@link Zotero.HTTP.request} for parameters - * @private - */ - this._attachHandlers = function(url, xmlhttp, options) { - var deferred = Zotero.Promise.defer(); - xmlhttp.onload = () => deferred.resolve(xmlhttp); - xmlhttp.onerror = xmlhttp.onabort = function() { - var e = new Zotero.HTTP.StatusError(xmlhttp, url); - if (options.successCodes === false) { - deferred.resolve(xmlhttp); - } else { - deferred.reject(e); - } - }; - xmlhttp.ontimeout = function() { - var e = new Zotero.HTTP.TimeoutError(url, xmlhttp.timeout); - Zotero.logError(e); - deferred.reject(e); - }; - return deferred.promise; - }; -} - -// Alias as COHTTP = Cross-origin HTTP; this is how we will call it from children -// For injected scripts, this get overwritten in messaging.js (see messages.js) -Zotero.COHTTP = { - request: Zotero.HTTP.request -}; diff --git a/zotero-connectors/src/common/images/citations-unlinked.png b/zotero-connectors/src/common/images/citations-unlinked.png deleted file mode 100644 index dc5e64c5..00000000 Binary files a/zotero-connectors/src/common/images/citations-unlinked.png and /dev/null differ diff --git a/zotero-connectors/src/common/images/csl-style.png b/zotero-connectors/src/common/images/csl-style.png deleted file mode 100644 index 621546de..00000000 Binary files a/zotero-connectors/src/common/images/csl-style.png and /dev/null differ diff --git a/zotero-connectors/src/common/images/pdf.png b/zotero-connectors/src/common/images/pdf.png deleted file mode 100644 index c24f66c0..00000000 Binary files a/zotero-connectors/src/common/images/pdf.png and /dev/null differ diff --git a/zotero-connectors/src/common/images/zotero-z-16px-offline.png b/zotero-connectors/src/common/images/zotero-z-16px-offline.png deleted file mode 100644 index 8744d427..00000000 Binary files a/zotero-connectors/src/common/images/zotero-z-16px-offline.png and /dev/null differ diff --git a/zotero-connectors/src/common/inject/http.js b/zotero-connectors/src/common/inject/http.js deleted file mode 100644 index 1753cb85..00000000 --- a/zotero-connectors/src/common/inject/http.js +++ /dev/null @@ -1,148 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Functions for performing HTTP requests, both via XMLHTTPRequest and using a hidden browser - * @namespace - */ -if(!Zotero.HTTP) Zotero.HTTP = {}; - -/** - * Determines whether the page to be loaded has the same origin as the current page - */ -Zotero.HTTP.isSameOrigin = function(url) { - // Hack to deal with cross-origin redirect on Nature until we swit - if (url.includes('www.nature.com/') || url.includes('www-nature-com.')) { - return false; - } - - const hostPortRe = /^([^:\/]+:)\/\/([^\/]+)/i; - var m = hostPortRe.exec(url); - if(!m) { - return true; - } else { - var location = Zotero.isBookmarklet ? window.parent.location : window.location; - return m[1].toLowerCase() === location.protocol.toLowerCase() && - m[2].toLowerCase() === location.host.toLowerCase(); - } -} - -/** - * Determing if trying to load non-HTTPs URLs from HTTPS pages - */ -Zotero.HTTP.isLessSecure = function(url) { - if (url.substr(0,8).toLowerCase() == 'https://') return false; - - var location = Zotero.isBookmarklet ? window.parent.location : window.location; - return location.protocol.toLowerCase() == 'https:'; -} - -/** - * Load one or more documents via XMLHttpRequest - * - * This should stay in sync with the equivalent function in the client - * - * @param {String|String[]} urls - URL(s) of documents to load - * @param {Function} processor - Callback to be executed for each document loaded - * @return {Promise} - A promise for an array of results from the processor runs - */ -Zotero.HTTP.processDocuments = async function (urls, processor, options = {}) { - // Handle old signature: urls, processor, onDone, onError - if (typeof arguments[2] == 'function' || typeof arguments[3] == 'function') { - Zotero.debug("Zotero.HTTP.processDocuments() no longer takes onDone or onError -- update your code"); - var onDone = arguments[2]; - var onError = arguments[3]; - } - - if (typeof urls == "string") urls = [urls]; - var funcs = urls.map(url => () => { - return Zotero.HTTP.request( - "GET", - url, - { - responseType: 'document' - } - ) - .then((xhr) => { - var doc = Zotero.HTTP.wrapDocument(xhr.response, url); - return processor(doc, url); - }); - }); - - // Run processes serially - // TODO: Add some concurrency? - var f; - var results = []; - while (f = funcs.shift()) { - try { - results.push(await f()); - } - catch (e) { - if (onError) { - onError(e); - } - throw e; - } - } - - // Deprecated - if (onDone) { - onDone(); - } - - return results; -} - -Zotero.Browser = { - createHiddenBrowser: function() { - var hiddenBrowser = document.createElement("iframe"); - if(!Zotero.isBookmarklet) { - hiddenBrowser.style.display = "none"; - } - if(document.domain == document.location.hostname) { - // Since sandboxed iframes cannot set document.domain, if - // document.domain is set on this page, then SOP will - // definitely prevent us from accessing the document - // in a sandboxed iframe. On the other hand, if we don't - // sandbox the iframe, it is possible it will navigate the - // top-level page. So we set the sandbox attribute only if - // we are not certain that document.domain has been set. - // This is not perfect, since if a page sets - // document.domain = document.domain, it is still a - // different origin and we will not be able to access pages - // loaded in the iframe. Additionally, if a page sets - // document.domain to a different hostname, since we don't - // sandbox, it is possible that it will navigate the - // top-level page. - // TODO: consider HTML XHR - hiddenBrowser.sandbox = "allow-same-origin allow-forms allow-scripts"; - } - document.body.appendChild(hiddenBrowser); - return hiddenBrowser; - }, - deleteHiddenBrowser: function(hiddenBrowser) { - document.body.removeChild(hiddenBrowser); - } -}; \ No newline at end of file diff --git a/zotero-connectors/src/common/inject/inject.jsx b/zotero-connectors/src/common/inject/inject.jsx deleted file mode 100644 index 8544c5b6..00000000 --- a/zotero-connectors/src/common/inject/inject.jsx +++ /dev/null @@ -1,768 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -var isTopWindow = false; -if(window.top) { - try { - isTopWindow = window.top == window; - } catch(e) {}; -} -var instanceID = isTopWindow ? 0 : (new Date()).getTime(); - -if (isTopWindow) { - Zotero.Messaging.addMessageListener("confirm", function (props) { - return Zotero.Inject.confirm(props); - }); - - Zotero.Messaging.addMessageListener("notify", (args) => Zotero.Inject.notify.apply(this, args)); - - Zotero.Messaging.addMessageListener("ping", function () { - // Respond to indicate that script is injected - return 'pong'; - }); -} - -/** - * @namespace - */ -Zotero.Inject = new function() { - var _translate; - var _noteImgSrc; - // Used to display a different message for failing translations on pages - // with site-access limits - const siteAccessLimitsTranslators = new Set([ - "57a00950-f0d1-4b41-b6ba-44ff0fc30289" // GoogleScholar - ]); - this.sessionDetails = {}; - this.translators = []; - - /** - * Initializes the translate machinery and determines whether this page can be translated - */ - this.init = function(force) { - // On OAuth completion, close window and call completion listener - if(document.location.href.substr(0, ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length+1) === ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL+"?") { - Zotero.API.onAuthorizationComplete(document.location.href.substr(ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length+1)); - } else if (document.location.href.substr(0, ZOTERO_CONFIG.OAUTH.ZOTERO.CALLBACK_URL.length+1) === ZOTERO_CONFIG.OAUTH.GOOGLE_DOCS.CALLBACK_URL+"#") { - Zotero.GoogleDocs_API.onAuthComplete(document.location.href); - } - - // Reset session on every init so a new save is triggered after JS-based changes - // (monitorDOMChanges/ZoteroItemUpdated) - this.sessionDetails = {}; - - _noteImgSrc = Zotero.isSafari - ? `${safari.extension.baseURI}safari/`+"images/treeitem-note.png" - : browser.runtime.getURL('images/treeitem-note.png'); - - // wrap this in try/catch so that errors will reach logError - try { - if(this.translators.length) { - if(force) { - this.translators = []; - } else { - return; - } - } - if(document.location == "about:blank") return; - - if (!_translate) { - _translate = this.initTranslation(document); - _translate.setHandler("pageModified", function() { - Zotero.Connector_Browser.onPageLoad(document.location.href); - Zotero.Messaging.sendMessage("pageModified", null); - }); - document.addEventListener("ZoteroItemUpdated", function() { - Zotero.debug("Inject: ZoteroItemUpdated event received"); - Zotero.Connector_Browser.onPageLoad(document.location.href); - Zotero.Messaging.sendMessage("pageModified", null); - }, false); - } else { - _translate.setDocument(document); - } - return _translate.getTranslators(true).then(function(translators) { - if (!translators.length && Zotero.isSafari) { - if (!isTopWindow && document.contentType == 'application/pdf') { - return Zotero.Connector_Browser.onPDFFrame(document.location.href, instanceID); - } - } - this.translators = translators; - - translators = translators.map(function(translator) {return translator.serialize(TRANSLATOR_PASSING_PROPERTIES)}); - Zotero.Connector_Browser.onTranslators(translators, instanceID, document.contentType); - }.bind(this)); - } catch(e) { - Zotero.logError(e); - } - }; - - this.initTranslation = function (document, sessionID) { - var translate = new Zotero.Translate.Web(); - translate.setDocument(document); - if (sessionID) { - translate.setHandler("select", function(obj, items, callback) { - // Close the progress window before displaying Select Items - Zotero.Messaging.sendMessage("progressWindow.close", null); - - // If the handler returns a non-undefined value then it is passed - // back to the callback due to backwards compat code in translate.js - (async function() { - // We don't want to show a select dialog -> always choose all items - /* - try { - let response = await Zotero.Connector.callMethod("getSelectedCollection", {}); - if (response.libraryEditable === false) { - return callback([]); - } - } catch (e) { - // Zotero is online but an error occured anyway, so let's log it and display - // the dialog just in case - if (e.status != 0) { - Zotero.logError(e); - } - } - - if (Zotero.isBrowserExt) { - var returnItems = await Zotero.Connector_Browser.onSelect(items); - } else { - returnItems = await Zotero.Inject.onSafariSelect(items); - } - - // If items were selected, reopen the save popup - if (returnItems && !Zotero.Utilities.isEmpty(returnItems)) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - } - */ - callback(items); - }.bind(this))(); - }.bind(this)); - translate.setHandler("itemSaving", function(obj, item) { - // this relays an item from this tab to the top level of the window - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title - } - ); - }); - translate.setHandler("itemDone", function(obj, dbItem, item) { - // this relays an item from this tab to the top level of the window - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: item.id, - iconSrc: Zotero.ItemTypes.getImageSrc(item.itemType), - title: item.title, - progress: 100 - } - ); - for(var i=0; i
    ' - + Zotero.getString( - 'firstRun_text2', - [ - clientName, - // TODO: Make download URL configurable (instead of just base URL + "download") - ZOTERO_CONFIG.WWW_BASE_URL + "download/" - ] - ) - }); - }; - - this.firstSaveToServerPrompt = async function() { - var clientName = ZOTERO_CONFIG.CLIENT_NAME; - - var result = await this.confirm({ - button1Text: Zotero.getString('general_tryAgain'), - button2Text: Zotero.getString('general_cancel'), - button3Text: Zotero.getString('error_connection_enableSavingToOnlineLibrary'), - title: Zotero.getString('error_connection_isAppRunning', clientName), - message: Zotero.getString( - 'error_connection_save', - [ - Zotero.getString('appConnector', clientName), - clientName, - ZOTERO_CONFIG.DOMAIN_NAME - ] - ) - + '

    ' - + Zotero.Inject.getConnectionErrorTroubleshootingString() - }); - - switch (result.button) { - case 1: - return 'retry'; - - case 3: - return 'server'; - - default: - return 'cancel'; - } - }; - - - this.getConnectionErrorTroubleshootingString = function () { - var clientName = ZOTERO_CONFIG.CLIENT_NAME; - var connectorName = Zotero.getString('appConnector', ZOTERO_CONFIG.CLIENT_NAME); - var downloadLink = 'https://www.zotero.org/download/'; - var troubleshootLink = 'https://www.zotero.org/support/kb/connector_zotero_unavailable'; - return Zotero.getString( - 'error_connection_downloadOrTroubleshoot', - [downloadLink, clientName, troubleshootLink] - ); - }; - - /** - * If Zotero is offline and attempting action fallback to zotero.org for first time: prompts about it - * Prompt only available on BrowserExt which supports programmatic injection - * Otherwise just resolves to true - * - * return {Promise} whether the action should proceed - */ - this.checkActionToServer = async function() { - // Pretend that zotero is online - return true; - - /* - var [firstSaveToServer, zoteroIsOnline] = await Zotero.Promise.all([ - Zotero.Prefs.getAsync('firstSaveToServer'), - Zotero.Connector.checkIsOnline() - ]); - if (zoteroIsOnline || !firstSaveToServer) { - return true; - } - var result = await this.firstSaveToServerPrompt(); - if (result == 'server') { - Zotero.Prefs.set('firstSaveToServer', false); - return true; - } else if (result == 'retry') { - // If we perform the retry immediately and Zotero is still unavailable the prompt returns instantly - // making the user interaction confusing so we wait a bit first - await Zotero.Promise.delay(500); - return this.checkActionToServer(); - } - return false; - */ - }; - - this.translate = async function(translatorID, options={}) { - let result = await Zotero.Inject.checkActionToServer(); - if (!result) return; - var translator = this.translators.find((t) => t.translatorID == translatorID); - - // We always want to save again - options.resave = true; - - // In some cases, we just reopen the popup instead of saving again - if (this.sessionDetails.id - // Same page (no history push) - && document.location.href == this.sessionDetails.url - // Same translator - && translatorID == this.sessionDetails.translatorID - // Not a multiple page - && translator.itemType != 'multiple' - // Not "Create Zotero Item and Note from Selection" - && !options.note - // Not from the context menu, which always triggers a resave - && !options.resave) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - return; - } - - var sessionID = Zotero.Utilities.randomString(); - Zotero.Messaging.sendMessage( - "progressWindow.show", - [ - sessionID, - null, - false, - // If we're likely to show the Select Items window, delay the opening of the - // popup until we've had a chance to hide it (which happens in the 'select' - // callback in progressWindow_inject.js). - translator.itemType == 'multiple' ? 100 : null - ] - ); - - this.sessionDetails = { - id: sessionID, - url: document.location.href, - translatorID, - saveOptions: options - }; - - var translate = this.initTranslation(document, sessionID); - var translators = [...this.translators]; - while (translators[0].translatorID != translatorID) { - translators.shift(); - } - while (true) { - translator = translators.shift(); - translate.setTranslator(translator); - try { - let items = await translate.translate({ sessionID }); - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return items; - } catch (e) { - // TEMP: Remove once client switches automatically (added in 5.0.46) - if (e.value && e.value.libraryEditable == false) { - // Allow another attempt to save again - this.sessionDetails = {}; - return; - } - if (translator.itemType != 'multiple') { - if (options.fallbackOnFailure && translators.length) { - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, translators[0].label]); - } - else { - Zotero.Messaging.sendMessage("progressWindow.error", ['fallback', translator.label, "Save as Webpage"]); - return await this._saveAsWebpage({sessionID, snapshot: true}); - } - } - else { - // Clear session details on failure, so another save click tries again - this.sessionDetails = {}; - // We delay opening the progressWindow for multiple items so we don't have to flash it - // for the select dialog. But it comes back to bite us in the butt if a translation - // error occurs immediately since the below command will execute before the progressWindow show, - // and then the delayed progressWindow.show will pop up another empty progress window. - // Cannot have that! - await Zotero.Promise.delay(500); - const isAccessLimitingTranslator = siteAccessLimitsTranslators.has(translator.translatorID); - try { - var statusCode = typeof e == 'string' && e.match(/status code ([0-9]{3})/)[1]; - } catch (e) {} - const isHTTPErrorForbidden = statusCode == '403'; - const isHTTPErrorTooManyRequests = statusCode == '429'; - if ((isAccessLimitingTranslator && isHTTPErrorForbidden) || isHTTPErrorTooManyRequests) { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'siteAccessLimits', translator.label]); - } - else { - Zotero.Messaging.sendMessage("progressWindow.done", [false]); - } - return; - } - } - } - }; - - this.saveAsWebpage = async function (args) { - var title = args[0] || document.title, options = args[1] || {}; - var result = await Zotero.Inject.checkActionToServer(); - if (!result) return; - - var translatorID = 'webpage' + (options.snapshot ? 'WithSnapshot' : ''); - // Reopen if popup instead of resaving - if (this.sessionDetails.id - // Same page (no history push) - && document.location.href == this.sessionDetails.url - // Same translator - && translatorID == this.sessionDetails.translatorID - // Not from the context menu, which always triggers a resave - && !options.resave) { - let sessionID = this.sessionDetails.id; - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - return; - } - - var sessionID = Zotero.Utilities.randomString(); - return await this._saveAsWebpage({sessionID, title, snapshot: options.snapshot}); - }; - - this._saveAsWebpage = async function(options={}) { - var sessionID = options.sessionID; - var title = options.title || document.title; - var translatorID = 'webpage' + (options.snapshot ? 'WithSnapshot' : ''); - if (!sessionID) { - throw new Error("Trying to save as webpage without session ID"); - } - var data = { - sessionID, - url: document.location.toString(), - cookie: document.cookie, - title: title, - html: document.documentElement.innerHTML, - skipSnapshot: !options.snapshot, - singleFile: true - }; - - var image; - if (document.contentType == 'application/pdf') { - data.pdf = true; - image = "attachment-pdf"; - } else { - image = "webpage"; - } - - Zotero.Messaging.sendMessage("progressWindow.show", [sessionID]); - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: 1, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title: title - } - ); - - try { - var result = await Zotero.Connector.callMethodWithCookies("saveSnapshot", data); - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { sessionID }); - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - sessionID, - id: 1, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - - // Once snapshot item is created, if requested, run SingleFile - if (!data.pdf && result && result.saveSingleFile) { - let progressItem = { - sessionID, - id: 2, - iconSrc: Zotero.ItemTypes.getImageSrc("attachment-snapshot"), - title: "Snapshot", - parentItem: 1, - progress: 0 - }; - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", progressItem); - - try { - data.snapshotContent = await Zotero.SingleFile.retrievePageData(); - } - catch (e) { - // Swallow error, will fallback to save in client - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { ...progressItem, ...{ progress: false } }); - } - - try { - result = await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: {"Content-Type": "application/json"} - }, - data - ); - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { ...progressItem, ...{ progress: 100 } }); - } - catch (e) { - if (e.status === 400 && e.value === 'Endpoint does not support content-type\n') { - let snapshotContent = data.snapshotContent; - delete data.snapshotContent; - - data.pageData = { - content: snapshotContent, - resources: {} - }; - - // This means a Zotero client that expects SingleFileZ. We can just feed - // it a payload it is expecting with no resources. - result = await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: {"Content-Type": "multipart/form-data"} - }, - { - payload: JSON.stringify(data) - } - ); - - Zotero.Messaging.sendMessage("progressWindow.itemProgress", { ...progressItem, ...{ progress: 100 } }); - } - else { - throw e; - } - } - } - - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - Object.assign(this.sessionDetails, { - id: sessionID, - url: document.location.href, - translatorID - }); - return result; - } catch (e) { - // Client unavailable - if (e.status === 0) { - // Attempt saving to server if not pdf - if (document.contentType != 'application/pdf') { - let itemSaver = new Zotero.Translate.ItemSaver({}); - let items = await itemSaver.saveAsWebpage(); - if (items.length) { - Zotero.Messaging.sendMessage( - "progressWindow.itemProgress", - { - id: title, - iconSrc: Zotero.ItemTypes.getImageSrc(image), - title, - parentItem: false, - progress: 100 - } - ); - } - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return; - } else { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'clientRequired']); - } - } - // Unexpected error, including a timeout (which we don't want to - // result in a save to the server, because it's possible the request - // will still be processed) - else if (!e.value || e.value.libraryEditable != false) { - Zotero.Messaging.sendMessage("progressWindow.done", [false, 'unexpectedError']); - } - throw e; - } - } - - this.addKeyboardShortcut = function(eventDescriptor, fn, elem) { - elem = elem || document; - elem.addEventListener('keydown', function ZoteroKeyboardShortcut(event) { - for (let prop in eventDescriptor) { - if (event[prop] != eventDescriptor[prop]) return; - } - event.stopPropagation(); - event.preventDefault(); - fn(); - }); - } -}; - -// check whether this is a hidden browser window being used for scraping -var isHiddenIFrame = false; -try { - isHiddenIFrame = !isTopWindow && window.frameElement && window.frameElement.style.display === "none"; -} catch(e) {} - -const isWeb = window.location.protocol === "http:" || window.location.protocol === "https:"; -const isTestPage = Zotero.isBrowserExt && window.location.href.startsWith(browser.runtime.getURL('test')); -// don't try to scrape on hidden frames -if(!isHiddenIFrame) { - var doInject = async function () { - await Zotero.initInject(); - - if (Zotero.isSafari && isTopWindow) { - Zotero.Connector_Browser.onPageLoad(document.location.href); - } - - // Do not run on non-web pages (file://), test pages, safari extension pages (i.e. safari prefs) - // or non-top Safari pages - if (!isWeb && !isTestPage) return; - // add listener for translate message from extension - Zotero.Messaging.addMessageListener("translate", function(data) { - if(data.shift() !== instanceID) return; - return Zotero.Inject.translate.apply(Zotero.Inject, data); - }); - // add a listener to save as webpage when translators unavailable - Zotero.Messaging.addMessageListener("saveAsWebpage", function(data) { - if (Zotero.isSafari) { - if (data[0] !== instanceID) return; - Zotero.Inject.saveAsWebpage(data[1]) - } else { - Zotero.Inject.saveAsWebpage(data); - } - }); - // add listener to rerun detection on page modifications - Zotero.Messaging.addMessageListener("pageModified", function() { - Zotero.Inject.init(true); - }); - Zotero.Messaging.addMessageListener('historyChanged', function() { - Zotero.Inject.init(true); - }); - - Zotero.Messaging.addMessageListener("firstUse", function () { - return Zotero.Inject.firstUsePrompt(); - }); - - if(document.readyState !== "complete") { - window.addEventListener("pageshow", function(e) { - if(e.target !== document) return; - Zotero.Inject.init(true); - }, false); - } else { - Zotero.Inject.init(); - } - }; - - // Wait until pages in prerender state become visible before injecting - if (document.visibilityState == 'prerender') { - var handler = function() { - doInject(); - document.removeEventListener("visibilitychange", handler); - }; - document.addEventListener("visibilitychange", handler); - } else { - doInject(); - } -} - diff --git a/zotero-connectors/src/common/inject/modalPrompt_inject.js b/zotero-connectors/src/common/inject/modalPrompt_inject.js deleted file mode 100644 index 5359c76a..00000000 --- a/zotero-connectors/src/common/inject/modalPrompt_inject.js +++ /dev/null @@ -1,102 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - -var isTopWindow = false; -if (window.top) { - try { - isTopWindow = window.top == window; - } catch (e) {} -} - -if (isTopWindow) { - // - // Modal prompt initialization - // - // The progress window is created using React in an iframe, and we use the - // connector messaging system to communicate with. - // - var frameID = 'zotero-modal-prompt'; - var iframe; - var initialized = false; - var frameSrc; - if (Zotero.isSafari) { - frameSrc = `${safari.extension.baseURI}safari/` + 'modalPrompt/modalPrompt.html'; - } - else { - frameSrc = browser.runtime.getURL('modalPrompt/modalPrompt.html'); - } - - async function init() { - var deferred = Zotero.Promise.defer(); - Zotero.Messaging.addMessageListener('modalPrompt.init', function () { - initialized = true; - deferred.resolve(); - // Prevent the flash of white screen - iframe.style.display = "block" - }); - - iframe = document.createElement('iframe'); - iframe.id = frameID; - iframe.src = frameSrc; - var style = { - position: 'fixed', - top: '0px', - left: 'unset', - right: '0px', - width: '100%', - height: '100%', - border: "none", - display: "none", - zIndex: 2147483647 - }; - for (let i in style) iframe.style[i] = style[i]; - document.body.appendChild(iframe); - return deferred.promise; - } - - /** - * - * @param props {Object} to be passed to ModalPrompt component - * @returns {Promise{Object}} Object with properties: - * `button` - button number clicked (or 0 if clicked outside of prompt) - * `checkboxChecked` - checkbox state on close - * `inputText` - input field string on close - */ - Zotero.ModalPrompt = { - confirm: async function (props) { - if (!initialized) { - await init(); - } - iframe.style.display = 'block'; - let result = await Zotero.Messaging.sendMessage('modalPrompt.show', props, null, null); - iframe.style.display = 'none'; - return result - } - } -} - -})(); diff --git a/zotero-connectors/src/common/inject/progressWindow_inject.js b/zotero-connectors/src/common/inject/progressWindow_inject.js deleted file mode 100644 index 442cdc0b..00000000 --- a/zotero-connectors/src/common/inject/progressWindow_inject.js +++ /dev/null @@ -1,523 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - -/** - * Only register progress window code in top window - */ -var isTopWindow = false; -if(window.top) { - try { - isTopWindow = window.top == window; - } catch(e) {}; -} - -if (isTopWindow || Zotero.isBookmarklet) { - // - // Progress window initialization - // - // The progress window is created using React in an iframe, and we use the - // connector messaging system to communicate with. - // - var frameID = 'zotero-progress-window-frame'; - var closeOnLeave = false; - var lastSuccessfulTarget; - var frameReadyDeferred = Zotero.Promise.defer(); - var frameInitialized; - var closeTimeoutID; - window.Zotero.progressWindowReady = frameReadyDeferred.promise; - frameReadyDeferred.promise.then(() => frameInitialized = true); - - var currentSessionID; - var createdSessions = new Set(); - var updatingSession; - var nextSessionUpdateData; - - var isReadOnly = false; - var syncDelayIntervalID; - var insideIframe = false; - var insideTags = false; - var blurred = false; - var frameSrc; - var frameIsHidden = false; - if (Zotero.isBookmarklet) { - frameSrc = ZOTERO_CONFIG.BOOKMARKLET_URL + 'progressWindow/progressWindow.html'; - } - else if (Zotero.isSafari) { - frameSrc = `${safari.extension.baseURI}safari/` + 'progressWindow/progressWindow.html'; - } - else { - frameSrc = browser.runtime.getURL('progressWindow/progressWindow.html'); - } - var scrollX; - var scrollY; - - async function sendMessage(name, data = {}) { - if (!Zotero.isBookmarklet) { - return Zotero.Messaging.sendMessage(name, data, null, null); - } - var frame = await frameReadyDeferred.promise; - if (frame) { - return frame.contentWindow.postMessage([name, data], "*"); - } else { - throw new Error("Attempting to message progressWindow frame before it has been loaded"); - } - } - - function addMessageListener(name, handler) { - if (!Zotero.isBookmarklet) { - return Zotero.Messaging.addMessageListener(name, handler); - } - window.top.addEventListener('message', function(event) { - if (event.data && event.data[0] == name) { - handler(event.data[1]); - } - }); - } - - // The progress window component is initialized asynchronously, so queue updates and send them - // to the iframe once the component is ready - function addEvent(name, data) { - frameReadyDeferred.promise.then(function() { - // frameId=null - send message to all frames - sendMessage(`progressWindowIframe.${name}`, data); - }); - } - - function changeHeadline() { - isReadOnly = arguments.length <= 2; - addEvent("changeHeadline", Array.from(arguments)); - } - - function makeReadOnly() { - isReadOnly = true; - addEvent("makeReadOnly", [lastSuccessfulTarget]); - } - - /** - * Get selected collection and collections list from client and update popup - */ - async function updateFromClient(prefix) { - try { - var response = await Zotero.Connector.callMethod("getSelectedCollection", {}) - } - catch (e) { - // TODO: Shouldn't this be coupled to the actual save process? - changeHeadline("Saving to zotero.org"); - return; - } - - // If we're reshowing the current session's popup, override the selected location with the - // last successful tarGet, since the selected collection in the client might have changed - if (lastSuccessfulTarget) { - response.id = lastSuccessfulTarget.id; - response.name = lastSuccessfulTarget.name; - response.libraryEditable = true; - } - - // Disable target selector for read-only library (which normally shouldn't happen, - // because the client switches automatically to My Library) - if (response.libraryEditable === false) { - response.targets = undefined; - addError("collectionNotEditable"); - startCloseTimer(8000); - return; - } - - var id; - // Legacy response for libraries - if (!response.id) { - id = "L" + response.libraryID; - } - // Legacy response for collections - else if (typeof response.id != 'string') { - id = "C" + response.id; - } - else { - id = response.id; - } - - if (!prefix) { - prefix = Zotero.getString('progressWindow_savingTo'); - } - var target = { - id, - name: response.name - }; - - if (response.libraryEditable) { - lastSuccessfulTarget = target; - } - - // TEMP: Make sure libraries have levels (added to client in 5.0.46) - if (response.targets) { - for (let row of response.targets) { - if (!row.level) { - row.level = 0; - } - } - } - - changeHeadline(prefix, target, response.targets); - } - - async function addError() { - await showFrame(); - addEvent("addError", Array.from(arguments)); - } - - function hideFrame() { - insideIframe = false; - - if (Zotero.isBookmarklet) { - var frame = window.top.document.getElementById(frameID); - } else { - var frame = document.getElementById(frameID); - } - if (frame) { - frame.style.display = 'none'; - addEvent("hidden"); - } - - // Stop delaying syncs when the frame closes - if (syncDelayIntervalID) { - clearInterval(syncDelayIntervalID); - } - } - - function resetFrame() { - stopCloseTimer(); - addEvent('reset'); - } - - async function destroyFrame() { - stopCloseTimer(); - var frame = await frameReadyDeferred.promise; - document.body.removeChild(frame); - frameReadyDeferred = Zotero.Promise.defer(); - } - - function handleMouseEnter() { - insideIframe = true; - blurred = false; - stopCloseTimer(); - - // See scroll listener in initFrame() - scrollX = window.scrollX; - scrollY = window.scrollY; - } - - function handleMouseLeave() { - insideIframe = false; - if (closeOnLeave) { - startCloseTimer(2500); - } - } - - function startCloseTimer(delay) { - // Don't start the timer if the mouse is over the popup or the tags box has focus - if (insideIframe) return; - if (insideTags) return; - - if (!delay) delay = 5000; - stopCloseTimer(); - closeTimeoutID = setTimeout(hideFrame, delay); - } - - function stopCloseTimer() { - if (closeTimeoutID) { - clearTimeout(closeTimeoutID); - } - } - - async function initFrame() { - // Create the iframe - var iframe = document.createElement('iframe'); - iframe.id = frameID; - iframe.src = frameSrc; - iframe.setAttribute('data-single-file-hidden-frame', ''); - var style = { - position: 'fixed', - top: '15px', - left: 'unset', - right: '8px', - width: '351px', - maxWidth: '95%', - height: '120px', - border: "none", - zIndex: 2147483647, - display: 'none' - }; - for (let i in style) iframe.style[i] = style[i]; - window.top.document.body.appendChild(iframe); - - // Keep track of clicks on the window so that when the iframe document is blurred we can - // distinguish between a click on the document and switching to another window - var lastClick; - window.addEventListener('click', function () { - lastClick = new Date(); - }, true); - - - // Prevent scrolling of parent document when scrolling to bottom of target list in iframe - // From https://stackoverflow.com/a/32283373 - // - // This is jittery and it would be nice to do better - document.addEventListener('scroll', function (event) { - if (insideIframe) { - window.scrollTo(scrollX, scrollY); - } - }); - - // - // Handle messages from the progress window iframe - // - addMessageListener('progressWindowIframe.registered', function() { - frameReadyDeferred.resolve(iframe); - }); - - // Adjust iframe height when inner document is resized - addMessageListener('progressWindowIframe.resized', function(data) { - iframe.style.height = (data.height + 33) + "px"; - }); - - // Update the client or API with changes - var handleUpdated = async function (data) { - // If we're making changes, don't close the popup and keep delaying syncs - stopCloseTimer(); - blurred = false; - - // If the session isn't yet registered or a session update is in progress, - // store the data to run after, overwriting any already-queued data - if (!createdSessions.has(currentSessionID) || updatingSession) { - nextSessionUpdateData = data; - return; - } - updatingSession = true; - - try { - await Zotero.Connector.callMethod( - "updateSession", - { - sessionID: currentSessionID, - target: data.target.id, - tags: data.tags - // TEMP: Avoid crash on leading/trailing comma pre-5.0.57 - ? data.tags.replace(/(^,|,$)/g, '') : data.tags - } - ); - } - // Collapse popup on error - catch (e) { - makeReadOnly(); - throw e; - } - finally { - updatingSession = false; - } - - if (nextSessionUpdateData) { - data = nextSessionUpdateData; - nextSessionUpdateData = null; - return handleUpdated(data); - } - - // Keep track of last successful target to show on reopen and failure - lastSuccessfulTarget = data.target; - }; - - // Once a session is created in the client, send any queued session data - Zotero.Messaging.addMessageListener('progressWindow.sessionCreated', async function (args) { - var sessionID = args.sessionID; - createdSessions.add(sessionID); - if (nextSessionUpdateData) { - let data = nextSessionUpdateData; - nextSessionUpdateData = null; - handleUpdated(data) - } - }); - - // Sent by the progress window when changes are made in the target selector - addMessageListener('progressWindowIframe.updated', handleUpdated); - - // Keep track of when the mouse is over the popup, for various purposes - addMessageListener('progressWindowIframe.mouseenter', handleMouseEnter); - addMessageListener('progressWindowIframe.mouseleave', handleMouseLeave); - - addMessageListener('progressWindowIframe.tagsfocus', () => insideTags = true); - addMessageListener('progressWindowIframe.tagsblur', () => insideTags = false); - - addMessageListener('progressWindowIframe.blurred', async function() { - blurred = true; - - // Hide iframe if it loses focus and the user recently clicked on the main page - // (i.e., they didn't just switch to another window) - await Zotero.Promise.delay(150); - if (lastClick > new Date() - 500) { - hideFrame(); - } - }); - - addMessageListener('progressWindowIframe.close', function() { - hideFrame(); - if (!Zotero.isBookmarklet) { - window.focus(); - } - }); - - await frameReadyDeferred.promise; - return iframe; - } - - /** - * Shows the frame (initializing it if neccessary) - * @returns {Promise - - - \ No newline at end of file diff --git a/zotero-connectors/src/common/test/data/journalArticle-single.html b/zotero-connectors/src/common/test/data/journalArticle-single.html deleted file mode 100644 index c05e5f74..00000000 --- a/zotero-connectors/src/common/test/data/journalArticle-single.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Scarcity or Abundance? Preserving the Past in a Digital Era - - -
    -
    Rosenzweig, Roy. 2003. “Scarcity or Abundance? Preserving the Past in a Digital Era.†The American Historical Review 108 (3): 735–62. doi:10.1086/529596.
    - -
    - - - - - - - diff --git a/zotero-connectors/src/common/test/data/top-DOI-frame-COInS.html b/zotero-connectors/src/common/test/data/top-DOI-frame-COInS.html deleted file mode 100644 index 5656400e..00000000 --- a/zotero-connectors/src/common/test/data/top-DOI-frame-COInS.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Scarcity or Abundance? Preserving the Past in a Digital Era - - -
    -
    Rosenzweig, Roy. 2003. “Scarcity or Abundance? Preserving the Past in a Digital Era.†The American Historical Review 108 (3): 735–62. doi:10.2307/3523084.
    - -
    - - - - - - - \ No newline at end of file diff --git a/zotero-connectors/src/common/test/messages.js b/zotero-connectors/src/common/test/messages.js deleted file mode 100644 index 6fab0b19..00000000 --- a/zotero-connectors/src/common/test/messages.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -MESSAGES.Background = { - run: true -} diff --git a/zotero-connectors/src/common/test/tests/backgroundTest.js b/zotero-connectors/src/common/test/tests/backgroundTest.js deleted file mode 100644 index 2450a55a..00000000 --- a/zotero-connectors/src/common/test/tests/backgroundTest.js +++ /dev/null @@ -1,79 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe('Connector_Browser', function() { - var tab = new Tab(); - - describe('onPDFFrame', function() { - it('sets icon to PDF if no translators present', async function () { - try { - let bgPromise = background(function() { - Zotero.Prefs.set('firstUse', false); - let stub = sinon.stub(Zotero.Connector_Browser, '_showPDFIcon'); - var deferred = Zotero.Promise.defer(); - stub.callsFake(deferred.resolve); - - if (Zotero.isBrowserExt) { - // Independent of the online status of Zotero client we need to observer content types - // to trigger the onPDFFrame icon, but don't want to affect the already attached - // observer state, so we generate a custom function to work with - let customObserver = details => Zotero.ContentTypeHandler.observe(details); - Zotero.WebRequestIntercept.addListener('headersReceived', customObserver); - deferred.promise.then(() => Zotero.WebRequestIntercept.removeListener('headersReceived', customObserver)); - } - return deferred.promise; - }); - await Zotero.Promise.delay(30); - await tab.init(getExtensionURL('test/data/framePDF.html')); - - // The frame is not initialized unless the tab is activated momentarily. - await background(async function(tabId) { - var prevActiveTab = await browser.tabs.query({active: true, currentWindow: true}); - await browser.tabs.update(tabId, {active: true}); - await Zotero.Promise.delay(100); - await browser.tabs.update(prevActiveTab[0].id, {active: true}); - }, tab.tabId); - - await bgPromise; - - let tabId = await background(async function(tabId) { - if (Zotero.isBrowserExt) { - return Zotero.Connector_Browser._showPDFIcon.args[0][0].id; - } else { - return (await Zotero.Background.getTabByID(tabId)).isPDFFrame ? tabId : -1; - } - }, tab.tabId); - assert.equal(tabId, tab.tabId); - } finally { - await background(function() { - Zotero.Connector_Browser._showPDFIcon.restore() - }); - if (tab.tabId) { - await tab.close(); - } - } - }); - }); -}); \ No newline at end of file diff --git a/zotero-connectors/src/common/test/tests/cachedTypesTest.js b/zotero-connectors/src/common/test/tests/cachedTypesTest.js deleted file mode 100644 index bece393d..00000000 --- a/zotero-connectors/src/common/test/tests/cachedTypesTest.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Corporation for Digital Scholarship - Vienna, Virginia, USA - https://www.zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe('CachedTypes', function() { - describe('ItemFields', function() { - describe("#getFieldIDFromTypeAndBase()", function () { - it('should return item-specific field', async function () { - var [fieldID, targetID] = await background(function() { - var itemTypeID = Zotero.ItemTypes.getID('webpage'); - var baseFieldID = Zotero.ItemFields.getID('publicationTitle'); - var targetID = Zotero.ItemFields.getID('websiteTitle'); - return [ - Zotero.ItemFields.getFieldIDFromTypeAndBase(itemTypeID, baseFieldID), - targetID - ]; - }); - assert.isNumber(targetID); - assert.equal(fieldID, targetID); - }); - }); - }); -}); diff --git a/zotero-connectors/src/common/test/tests/connectorTest.js b/zotero-connectors/src/common/test/tests/connectorTest.js deleted file mode 100644 index fb1bb917..00000000 --- a/zotero-connectors/src/common/test/tests/connectorTest.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe('Connector', function() { - describe('#checkIsOnline()', function() { - before(function() { - return background(function() { - sinon.stub(Zotero.HTTP, 'request'); - }); - }); - - after(function() { - return background(function() { - Zotero.HTTP.request.restore(); - }); - }); - - it('responds with true when Zotero is online', Promise.coroutine(function*() { - let status = yield background(function() { - Zotero.HTTP.request.resolves({status: 200, getResponseHeader: () => 'application/json', responseText: '{}'}); - return Zotero.Connector.checkIsOnline(); - }); - assert.isOk(status); - })); - - it('responds with false when Zotero is offline', Promise.coroutine(function*() { - let status = yield background(function() { - Zotero.HTTP.request.resolves({status: 0}); - return Zotero.Connector.checkIsOnline(); - }); - assert.isNotOk(status); - })); - - it('throws when Zotero responds with a non-200 status', Promise.coroutine(function* () { - try { - yield background(function() { - Zotero.HTTP.request.resolves({status: 500, getResponseHeader: () => '', responseText: 'Error'}); - return Zotero.Connector.checkIsOnline(); - }); - } catch (e) { - return - } - throw new Error('Expected error not thrown'); - })); - }); -}); \ No newline at end of file diff --git a/zotero-connectors/src/common/test/tests/contentTypeHandlerTest.js b/zotero-connectors/src/common/test/tests/contentTypeHandlerTest.js deleted file mode 100644 index 3eb48f3f..00000000 --- a/zotero-connectors/src/common/test/tests/contentTypeHandlerTest.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -if (Zotero.isBrowserExt) { - -describe("ContentTypeHandler", function() { - describe('#observe()', function() { - it('calls Zotero.Connector_Browser.onPDFFrame when pdf frame loads', Promise.coroutine(function* () { - let args = yield background(function() { - var stub = sinon.stub(Zotero.Connector_Browser, 'onPDFFrame'); - Zotero.ContentTypeHandler.observe({ - frameId: 1, tabId: 1, url: 'test', method: "GET", - responseHeadersObject: {'content-type': 'application/pdf'} - }); - return new Zotero.Promise(function(resolve, reject) { - // onPDFFrame called out of observe event loop to not stall the page load - // since it's a blocking call - setTimeout(function() { - try { - resolve(stub.args[0]) - } catch (e) { - reject(e); - } finally { - stub.restore(); - } - }, 10); - }); - }); - assert.deepEqual(args, ['test', 1, 1]); - })); - }); - - describe('#handleImportContent()', function() { - var tab; - before(async function() { - tab = await browser.tabs.create({url: 'about:blank', active: false}) - }); - - after(async function() { - await browser.tabs.remove(tab.id); - }); - - it('displays an import prompt and imports on OK click', async function() { - let details = await background(async function(tabId) { - try { - // stubbing Zotero.Messaging.sendMessage('confirm', props, tab); - var stub1 = sinon.stub(Zotero.Messaging, 'sendMessage'); - stub1.resolves({button: 1}); - var stub2 = sinon.stub(Zotero.ContentTypeHandler, 'importFile'); - var deferred = Zotero.Promise.defer(); - stub2.callsFake(function(details) { - return deferred.resolve(details); - }); - Zotero.ContentTypeHandler.observe({frameId: 1, tabId, url: 'test', method: "GET", - responseHeadersObject: {'content-type': 'application/x-research-info-systems'}}); - - let result = await deferred.promise; - return result; - } finally { - stub1.restore(); - stub2.restore(); - } - }, tab.id); - assert.equal(details.url, 'test'); - }); - - it('displays an import prompt and navigates to target url on Cancel click', async function() { - let redirectUrl = await background(async function(tabId) { - try { - // stubbing Zotero.Messaging.sendMessage('confirm', props, tab); - var stub1 = sinon.stub(Zotero.Messaging, 'sendMessage'); - stub1.resolves({button: 2}); - var deferred = Zotero.Promise.defer(); - var stub2 = sinon.stub(Zotero.ContentTypeHandler, '_redirectToOriginal').callsFake(function(tabId, url) { - deferred.resolve(url); - }); - Zotero.ContentTypeHandler.observe({frameId: 1, tabId, url: 'test', method: "GET", - responseHeadersObject: {'content-type': 'application/x-research-info-systems'}}); - - let result = await deferred.promise; - return result; - } finally { - stub1.restore(); - stub2.restore(); - } - }, tab.id); - assert.equal(redirectUrl, 'test'); - }); - - it('navigates to confirmation page if no injection context available', async function () { - await background(async function(tabId) { - try { - let confirm = Zotero.ContentTypeHandler.confirm; - var stub2 = sinon.stub(Zotero.ContentTypeHandler, 'confirm'); - var deferred = Zotero.Promise.defer(); - stub2.callsFake(async function(details) { - let tab = await browser.tabs.get(details.tabId); - if (tab.url.includes('confirm.html')) deferred.resolve(); - return confirm.apply(Zotero.ContentTypeHandler, arguments); - }); - - Zotero.ContentTypeHandler.observe({frameId: 1, tabId, url: 'http://www.zotero.org/', method: "GET", - responseHeadersObject: {'content-type': 'application/x-research-info-systems'}}); - - let result = await deferred.promise; - return result; - } finally { - stub2.restore(); - } - }, tab.id); - tab = await browser.tabs.get(tab.id); - - assert.equal(tab.url, getExtensionURL('confirm.html')); - }); - }); -}); - -} diff --git a/zotero-connectors/src/common/test/tests/httpTest.js b/zotero-connectors/src/common/test/tests/httpTest.js deleted file mode 100644 index 26f5c26d..00000000 --- a/zotero-connectors/src/common/test/tests/httpTest.js +++ /dev/null @@ -1,126 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe("HTTP", function() { - var tab = new Tab(); - let url = 'https://zotero-static.s3.amazonaws.com/test.html'; - - before(Promise.coroutine(function* () { - yield tab.init(url); - })); - - after(function() { - tab.close(); - }); - - describe("#processDocuments()", function() { - it('succeeds when loading a same-origin page', Promise.coroutine(function* () { - let url = 'https://zotero-static.s3.amazonaws.com/test.html?t'; - let [content, location] = yield tab.run(function(url) { - return Zotero.HTTP.processDocuments( - url, - function (doc) { - var content = doc.querySelector('.csl-entry').innerText; - var location = doc.location.href; - return [content, location]; - } - ) - // Get results of first process - .then(vals => vals[0]); - }, url); - - assert.include(content, 'Rosenzweig'); - assert.equal(location, url); - })); - - it('succeeds when loading a cross-origin page', Promise.coroutine(function* () { - let url = 'http://zotero-static.s3.amazonaws.com/test.html'; - let [content, location] = yield tab.run(function(url) { - return Zotero.HTTP.processDocuments( - url, - function (doc) { - var content = doc.querySelector('.csl-entry').innerText; - var location = doc.location.href; - return [content, location]; - } - ) - .then(vals => vals[0]); - }, url); - - assert.include(content, 'Rosenzweig'); - assert.equal(location, url); - })); - }); - - describe('#request()', function() { - describe('POST', function() { - it('Adds a Content-Type header if not present', Promise.coroutine(function* () { - let args = yield background(function(url) { - let spy = sinon.spy(XMLHttpRequest.prototype, 'setRequestHeader'); - return Zotero.HTTP.request("POST", url, {body: 'test=test'}).catch(() => undefined) - .then(function() { - let args = spy.args; - spy.restore(); - return args; - }); - }, url); - let hasContentType = false; - for (let arg of args) { - hasContentType = hasContentType || arg[0] == 'Content-Type'; - } - assert.isTrue(hasContentType); - })); - }); - }); - - describe("COHTTP", function() { - describe('#request()', function() { - it('responds with correct XHR signature', Promise.coroutine(function* () { - let xhr = yield tab.run(function(url) { - return Zotero.COHTTP.request('GET', url).then(function(xhr) { - return Object.keys(xhr); - }) - }, url); - assert.include(xhr, 'responseText'); - assert.include(xhr, 'status'); - })); - }); - }); - - describe("#wrapDocument()", function () { - it("should allow document itself to be passed to document.evaluate()", Promise.coroutine(function* () { - var content = yield background(function (url) { - var url = "https://zotero-static.s3.amazonaws.com/test.html?t"; - return Zotero.HTTP.request("GET", url, { responseType: 'document' }) - .then(function (xmlhttp) { - var doc = Zotero.HTTP.wrapDocument(xmlhttp.response, url); - var div = doc.evaluate('//div', doc, null, XPathResult.ANY_TYPE, null).iterateNext(); - return div.textContent; - }); - }); - assert.include(content, 'Rosenzweig'); - })); - }); -}); diff --git a/zotero-connectors/src/common/test/tests/preferencesTest.js b/zotero-connectors/src/common/test/tests/preferencesTest.js deleted file mode 100644 index 70019161..00000000 --- a/zotero-connectors/src/common/test/tests/preferencesTest.js +++ /dev/null @@ -1,159 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe('Preferences', function() { - var tab = new Tab(); - - before(Promise.coroutine(function* () { - yield tab.init(getExtensionURL('preferences/preferences.html')); - if (Zotero.isFirefox) { - // Firefox is just very slow - yield Promise.delay(200); - } - })); - - after(Promise.coroutine(function* () { - yield tab.close(); - })); - - describe('General', function() { - describe('Zotero Status', function() { - before(Promise.coroutine(function* () { - return background(function() { - sinon.stub(Zotero.Connector, 'checkIsOnline').resolves(true); - }); - })); - - beforeEach(Promise.coroutine(function* () { - return background(function() { - Zotero.Connector.checkIsOnline.reset(); - }); - })); - - after(Promise.coroutine(function* () { - return background(function() { - Zotero.Connector.checkIsOnline.restore(); - }); - })); - - function clickAndReturnStatus() { - return tab.run(function() { - var spy = sinon.spy(Zotero.Connector, 'checkIsOnline'); - document.querySelector('input[value="Update Status"]').click(); - return spy.lastCall.returnValue.then(function() { - spy.restore(); - return document.querySelector('#client-status p').textContent; - }); - }); - } - - it('shows Zotero as available after clicking "Update Status" when Zotero is available', Promise.coroutine(function * () { - yield background(function() { - Zotero.Connector.checkIsOnline.resolves(true); - }); - let status = yield clickAndReturnStatus(); - assert.include(status, 'currently available'); - })); - - it('shows Zotero as unavailable after clicking "Update Status" when Zotero is not available', Promise.coroutine(function * () { - yield background(function() { - Zotero.Connector.checkIsOnline.resolves(false); - }); - let status = yield clickAndReturnStatus(); - assert.include(status, 'currently unavailable'); - })); - }); - }); - - describe('Advanced', function() { - it('submits an error report to Zotero.org', Promise.coroutine(function* () { - var reportId = '1234567890'; - yield background(function(reportId) { - sinon.stub(Zotero.HTTP, 'request').resolves( - {responseText: ``} - ); - }, reportId); - - try { - var message = yield tab.run(function() { - var deferred = Zotero.Promise.defer(); - sinon.stub(Zotero.ModalPrompt, 'confirm').callsFake((config) => { - deferred.resolve(config); - return {button: 0}; - }); - document.getElementById('advanced-button-report-errors').click(); - return deferred.promise.then(function(config) { - Zotero.ModalPrompt.confirm.restore(); - return config.message; - }); - }); - - assert.include(message, reportId); - } finally { - yield background(() => Zotero.HTTP.request.restore()); - } - })); - - it('submits a debug log to Zotero.org', Promise.coroutine(function * () { - var debugId = '1234567890'; - var testDebugLine = 'testDebugLine'; - yield background(function(debugId) { - sinon.stub(Zotero.HTTP, 'request').resolves( - {responseText: ``} - ); - }, debugId); - - try { - yield tab.run(function(testDebugLine) { - document.getElementById('advanced-checkbox-enable-logging').click(); - Zotero.debug(testDebugLine); - return Zotero_Preferences.refreshData(); - }, testDebugLine); - var message = yield tab.run(function() { - var deferred = Zotero.Promise.defer(); - sinon.stub(Zotero.ModalPrompt, 'confirm').callsFake((config) => { - deferred.resolve(config); - return {button: 0}; - }); - document.getElementById('advanced-checkbox-enable-logging').click(); - document.getElementById('advanced-button-submit-output').click(); - return deferred.promise.then(function(config) { - Zotero.ModalPrompt.confirm.restore(); - document.getElementById('advanced-button-clear-output').click(); - return config.message; - }).catch(e => ['error', e]); - }); - - assert.include(message, `D${debugId}`); - var debugLogBody = yield background(function() { - return Zotero.HTTP.request.lastCall.args[2].body; - }); - assert.include(debugLogBody, testDebugLine); - } finally { - yield background(() => Zotero.HTTP.request.restore()); - } - })); - }); -}); \ No newline at end of file diff --git a/zotero-connectors/src/common/test/tests/proxyTest.js b/zotero-connectors/src/common/test/tests/proxyTest.js deleted file mode 100644 index 54ddb1a1..00000000 --- a/zotero-connectors/src/common/test/tests/proxyTest.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe('Proxies', function() { - var originalProxies; - - async function setProxies(proxies) { - await background(function(proxies) { - Zotero.Proxies.proxies = proxies.map(p => new Zotero.Proxy(p)); - Zotero.Proxies.hosts = []; - Zotero.Proxies.proxies.forEach(proxy => proxy.hosts.forEach(host => Zotero.Proxies.hosts[host] = proxy)) - }, proxies); - } - - before(async function () { - originalProxies = await background(function() { - return Zotero.Proxies.proxies.map(p => p.toJSON()); - }); - }); - - after(async function () { - await setProxies(originalProxies); - }); - - describe('#getPotentialProxies()', function() { - it('returns no proxies if link unproxied', async function() { - let url = 'http://www.zotero.org'; - let proxies = await background((url) => Zotero.Proxies.getPotentialProxies(url), url); - assert.equal(Object.keys(proxies).length, 1); - assert.isNull(proxies[url]); - }); - - it('returns a simple proxy if link proxied', async function() { - let url = 'http://www.zotero.org.proxy.example.com'; - let proxies = await background((url) => Zotero.Proxies.getPotentialProxies(url), url); - assert.equal(Object.keys(proxies).length, 2); - assert.isNull(proxies[url]); - assert.equal(proxies['http://www.zotero.org'].scheme, '%h.proxy.example.com/%p'); - }); - - it('returns an unhyphenated proxy if link is proxied with https hyphenation', async function() { - let url = 'https://www-zotero-org.proxy.example.com'; - let proxies = await background((url) => Zotero.Proxies.getPotentialProxies(url), url); - assert.equal(Object.keys(proxies).length, 2); - assert.isNull(proxies[url]); - assert.equal(proxies['https://www.zotero.org'].scheme, '%h.proxy.example.com/%p'); - assert.isTrue(proxies['https://www.zotero.org'].dotsToHyphens); - }); - }); - - describe('#proxyToProper()', function() { - before(async function() { - await setProxies([{scheme: '%h.proxy.example.com/%p', dotsToHyphens: true, id: "test"}]); - }); - - it('returns original url if not proxied', async function() { - let result = await background(function() { - return Zotero.Proxies.proxyToProper('http://www.zotero.org/'); - }); - assert.equal(result, 'http://www.zotero.org/'); - }); - - it('returns original url if proxied with an unknown proxy', async function() { - let result = await background(function() { - return Zotero.Proxies.proxyToProper('http://www.zotero.org.proxy.example.org/'); - }); - assert.equal(result, 'http://www.zotero.org.proxy.example.org/'); - }); - - it('returns deproxied url if proxied', async function() { - let result = await background(function() { - return Zotero.Proxies.proxyToProper('http://www.zotero.org.proxy.example.com/'); - }); - assert.equal(result, 'http://www.zotero.org/'); - }); - - it('returns deproxied and undashed url if proxied with hyphenated domain', async function() { - let result = await background(function() { - return Zotero.Proxies.proxyToProper('https://www-zotero-org.proxy.example.com/'); - }); - assert.equal(result, 'https://www.zotero.org/'); - }); - }); - - describe('#properToProxy()', function() { - before(async function() { - await setProxies([{scheme: '%h.proxy.example.com/%p', dotsToHyphens: true, id: "test", - hosts: ['www.zotero.org']}]); - }); - - it('returns false if url not in hosts list', async function() { - let result = await background(function() { - return Zotero.Proxies.properToProxy('http://www.zotero.com'); - }); - assert.equal(result, 'http://www.zotero.com'); - }); - - it('returns proxied url if in hosts list', async function() { - let result = await background(function() { - return Zotero.Proxies.properToProxy('http://www.zotero.org'); - }); - assert.equal(result, 'http://www.zotero.org.proxy.example.com/'); - }); - - it('returns proxied and dashed url if in hosts list with HTTPS protocol', async function() { - let result = await background(function() { - return Zotero.Proxies.properToProxy('https://www.zotero.org'); - }); - assert.equal(result, 'https://www-zotero-org.proxy.example.com/'); - }); - }); -}); diff --git a/zotero-connectors/src/common/test/tests/testSetupTest.js b/zotero-connectors/src/common/test/tests/testSetupTest.js deleted file mode 100644 index 93531bda..00000000 --- a/zotero-connectors/src/common/test/tests/testSetupTest.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe('TestSetup', function() { - function executorTests(executor) { - it('executes code properly and returns the response', Promise.coroutine(function* () { - assert.equal(yield executor(() => 2+2), 4); - })); - it('throws an error when the function code is invalid', Promise.coroutine(function* () { - try { - yield executor(() => notvalid) - } catch (e) { - return; - } - throw new Error('Error not thrown'); - })); - it('throws an error when the passed function throws an error', Promise.coroutine(function * () { - try { - yield executor(function() {throw new Error('test')}) - } catch (e) { - return; - } - throw new Error('Error not thrown'); - })); - it('throws an error when the passed function returns a rejected promise', Promise.coroutine(function *() { - try { - yield executor(function() {return Promise.reject(new Error('test'))}) - } catch (e) { - return; - } - throw new Error('Error not thrown'); - })); - } - - describe('#background()', function() { - executorTests(background); - it('can access background properties', Promise.coroutine(function * () { - assert.isTrue(yield background(() => Zotero.isBackground)); - })); - }); - - describe('Tab', function() { - var tab = new Tab(); - - describe('#init()', function() { - it('opens a new tab with the specified url', Promise.coroutine(function * () { - let url = 'http://zotero-static.s3.amazonaws.com/test.html'; - yield tab.init(url); - assert.isOk(tab.tabId); - - if (Zotero.isBrowserExt) { - var tabUrl = yield browser.tabs.get(tab.tabId).then(tab => tab.url); - } else { - tabUrl = yield background(async function(id) { - return (await Zotero.Background.getTabByID(id)).url - }, tab.tabId); - } - assert.equal(tabUrl, url); - })); - }); - - describe('#run()', function() { - executorTests(tab.run.bind(tab)); - it('can access injected properties', Promise.coroutine(function * () { - assert.isTrue(yield tab.run(() => Zotero.isInject)); - })); - }); - - describe('#close()', function() { - it('closes the tab', Promise.coroutine(function* () { - let tabId = tab.tabId; - yield tab.close(); - // Sometimes takes a bit for the browser to garbage collect the tab - yield Zotero.Promise.delay(100); - let closedTab; - try { - closedTab = yield background(async function(id) { - return !!(await Zotero.Background.getTabByID(id)) - }, tabId); - } catch (e) {return} - assert.isNotOk(closedTab, 'Tab was not closed') - })); - }) - }); -}); \ No newline at end of file diff --git a/zotero-connectors/src/common/test/tests/translationTest.js b/zotero-connectors/src/common/test/tests/translationTest.js deleted file mode 100644 index f36092e6..00000000 --- a/zotero-connectors/src/common/test/tests/translationTest.js +++ /dev/null @@ -1,334 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -describe("Translation", function() { - var tab = new Tab(); - - before(async function () { - // Make sure translators initialized - let translators = await background(function() { - // Failure to init is fine - return Zotero.Repo.init().catch(e => 0).then(function() { - return Promise.all([ - Zotero.Translators.get('05d07af9-105a-4572-99f6-a8e231c0daef'), - Zotero.Translators.get('c159dcfe-8a53-4301-a499-30f6549c340d'), - Zotero.Translators.get('951c027d-74ac-47d4-a107-9c3069ab7b48') - ]); - }); - }); - assert.equal(3, translators.length); - }); - - describe('In the top frame', function() { - before(async function() { - await tab.init(getExtensionURL('test/data/journalArticle-single.html')) - }); - after(async function () { - await tab.close(); - }); - afterEach(async function () { - await tab.run(() => Zotero.Inject.sessionDetails = {}); - }); - - describe("Detection", function() { - it('detects expected translators', async function () { - var translators = await tab.run(function() { - return Object.keys(Zotero.Inject.translators).map(function(key) { - return Zotero.Inject.translators[key].metadata.label; - }); - }); - assert.deepEqual(['COinS', 'DOI'], translators); - }); - }); - - describe("Saving", function() { - describe("To Zotero", function() { - before(async function () { - return background(function() { - sinon.stub(Zotero.Connector, 'checkIsOnline').resolves(true); - }); - }); - - after(async function () { - return background(function() { - Zotero.Connector.checkIsOnline.restore(); - }); - }); - - it('saves with a translator', async function () { - var items = await background(async function(tabId) { - var stub = sinon.stub(Zotero.Connector, "callMethodWithCookies").callsFake(async function(_, payload){ - return payload; - }); - let tab = await Zotero.Background.getTabByID(tabId); - try { - var items = await Zotero.Connector_Browser.saveWithTranslator(tab, 0) - } finally { - stub.restore(); - } - return items; - }, tab.tabId); - assert.equal(items.length, 1); - assert.equal(items[0].itemType, 'journalArticle'); - var frameURL = getExtensionURL('progressWindow/progressWindow.html'); - var message = await tab.runInFrame(frameURL, async function() { - // TODO: A more robust way to wait for the text to show up. - let timeout = Zotero.isFirefox ? 1000 : 100; - await Zotero.Promise.delay(timeout); - return document.querySelector('.ProgressWindow-progressBox').textContent; - }); - assert.include(message, items[0].title); - }); - - it('saves with a translator that uses the select dialog', async function () { - var items = await background(async function(tabId) { - var stub1 = sinon.stub(Zotero.Connector, "callMethodWithCookies").callsFake(async function(_, payload){ - return payload; - }); - var stub2 = sinon.stub(Zotero.Connector_Browser, "onSelect").callsFake(function(items) { - return items; - }); - try { - var tab = await Zotero.Background.getTabByID(tabId); - var items = await Zotero.Connector_Browser.saveWithTranslator(tab, 1); - } finally { - stub1.restore(); - stub2.restore(); - } - return items; - }, tab.tabId); - assert.equal(items.length, 1); - assert.equal(items[0].itemType, 'journalArticle'); - var frameURL = getExtensionURL('progressWindow/progressWindow.html'); - var message = await tab.runInFrame(frameURL, async function() { - // TODO: A more robust way to wait for the text to show up. - let timeout = Zotero.isFirefox ? 1000 : 100; - await Zotero.Promise.delay(timeout); - return document.querySelector('.ProgressWindow-progressBox').textContent; - }); - assert.include(message, items[0].title); - }); - - it('saves as snapshot', async function () { - try { - await background(async function (tabId) { - sinon.stub(Zotero.Connector, "callMethod").resolves([]); - let tab = await Zotero.Background.getTabByID(tabId); - await Zotero.Connector_Browser.saveAsWebpage(tab); - }, tab.tabId); - await Zotero.Promise.delay(20); - var frameURL = getExtensionURL('progressWindow/progressWindow.html'); - var message = await tab.runInFrame(frameURL, async function() { - // TODO: A more robust way to wait for the text to show up. - let timeout = Zotero.isFirefox ? 1000 : 100; - await Zotero.Promise.delay(timeout); - return document.querySelector('.ProgressWindow-progressBox').textContent; - }); - assert.include(message, "Scarcity or Abundance? Preserving the Past in a Digital Era"); - } finally { - await background(() => Zotero.Connector.callMethod.restore()) - } - }); - - it('displays an error message if Zotero responds with an error', async function () { - await background(async function(tabId) { - var stub = sinon.stub(Zotero.Connector, "callMethodWithCookies") - .rejects(new Zotero.Connector.CommunicationError('Err', 500)); - // prevent reporting translator errors - var stub2 = sinon.stub(Zotero.Prefs, 'get').returns(false); - var tab = await Zotero.Background.getTabByID(tabId); - try { - await Zotero.Connector_Browser.saveWithTranslator(tab, 0); - } - catch (e) {} - finally { - stub.restore(); stub2.restore(); - } - }, tab.tabId); - var translatorNames = await tab.run(() => { - return Zotero.Inject.translators.map(translator => translator.label); - }) - var frameURL = getExtensionURL('progressWindow/progressWindow.html'); - var message = await tab.runInFrame(frameURL, async function() { - // TODO: A more robust way to wait for the text to show up. - let timeout = Zotero.isFirefox ? 1000 : 100; - await Zotero.Promise.delay(timeout); - return document.querySelector('.ProgressWindow-error').textContent; - }); - assert.include(message, Zotero.i18n.getString('progressWindow_error_fallback').substr(0, 20)); - }); - }); - - describe("To zotero.org", function() { - before(async function () { - await background(function() { - sinon.stub(Zotero.Connector, 'checkIsOnline').resolves(false); - sinon.stub(Zotero.Connector, "callMethod").rejects(new Zotero.Connector.CommunicationError('err')); - }); - await tab.run(function() { - let confirm = Zotero.Inject.confirm; - let confirmStub = sinon.stub(Zotero.Inject, 'confirm'); - confirmStub.deferred = Zotero.Promise.defer(); - confirmStub.callsFake(function() { - confirm.apply(Zotero.Inject, arguments); - return confirmStub.deferred.promise; - }); - }); - }); - - after(async function () { - await background(function() { - Zotero.Connector.checkIsOnline.restore(); - Zotero.Connector.callMethod.restore() - }); - await tab.run(function() { - Zotero.Inject.confirm.restore(); - }) - }); - - if (Zotero.isBrowserExt) { - it('displays a prompt when attempting to save to zotero.org for the first time', async function () { - try { - await background(async function (tabId) { - // First-time save - sinon.stub(Zotero.Prefs, 'get').returns(true); - var deferred = Zotero.Promise.defer(); - var tab = await Zotero.Background.getTabByID(tabId); - Zotero.Connector_Browser.saveWithTranslator(tab, 0).then(deferred.resolve).catch(deferred.reject); - }, tab.tabId); - var frameURL = getExtensionURL('modalPrompt/modalPrompt.html'); - var message = await tab.runInFrame(frameURL, async function() { - // TODO: A more robust way to wait for the text to show up. - let timeout = Zotero.isFirefox ? 1000 : 100; - await Zotero.Promise.delay(timeout); - return document.getElementById('zotero-modal-prompt').textContent; - }); - assert.include(message, 'The Zotero Connector was unable to communicate with the Zotero desktop application.'); - } finally { - await background(function() { - Zotero.Prefs.get.restore(); - }); - } - }); - } - - it('saves with a translator', async function () { - await background(function (tabId) { - sinon.stub(Zotero.Prefs, 'get').returns(false); - sinon.stub(Zotero.HTTP, 'request').resolves( - {status: 200, responseText: JSON.stringify({success: {}}), getAllResponseHeaders: () => ({})} - ); - }, tab.tabId); - - try { - var items = await tab.run(async function () { - var spy = sinon.spy(Zotero.Translate.ItemSaver.prototype, 'saveItems'); - var stub1 = sinon.stub(Zotero.API, 'getUserInfo').resolves({userID: '', apiKey: ''}); - var stub2 = sinon.stub(Zotero.HTTP, 'request').resolves( - {status: 200, responseText: JSON.stringify({success: {}}), getAllResponseHeaders: () => ({})} - ); - - if (Zotero.isBrowserExt) { - Zotero.Inject.confirm.deferred.resolve({button: 3}); - // Allow the confirm response to propagate - await Zotero.Promise.delay(10); - } else { - await Zotero.Inject.translate(Zotero.Inject.translators[0].translatorID); - } - try { - let val = await spy.lastCall.returnValue; - return val; - } finally { - spy.restore(); - stub1.restore(); - stub2.restore(); - } - }); - - assert.equal(items.length, 1); - assert.equal(items[0].itemType, 'journalArticle'); - - var frameURL = getExtensionURL('progressWindow/progressWindow.html'); - var message = await tab.runInFrame(frameURL, async function() { - // TODO: A more robust way to wait for the text to show up. - let timeout = Zotero.isFirefox ? 1000 : 100; - await Zotero.Promise.delay(timeout); - return document.querySelector('.ProgressWindow-box').textContent; - }); - - assert.include(message, 'zotero.org'); - assert.include(message, items[0].title); - } finally { - await background(function() { - Zotero.Prefs.get.restore(); - Zotero.HTTP.request.restore(); - }, tab.tabId); - } - }); - }); - }); - - }); - - describe("In a child frame", function() { - describe('Detection', function() { - it('Sets the frame with higher priority translator as the translation target', async function() { - try { - let bgTranslatorsLoadedPromise = background(function() { - let onTranslators = Zotero.Connector_Browser.onTranslators; - let deferred = Zotero.Promise.defer(); - sinon.stub(Zotero.Connector_Browser, 'onTranslators').callsFake(function(translators) { - if (translators.length >= 2) deferred.resolve(); - return onTranslators.apply(Zotero.Connector_Browser, arguments); - }); - return deferred.promise; - }); - await tab.init(getExtensionURL('test/data/top-DOI-frame-COInS.html')); - await bgTranslatorsLoadedPromise; - - var [translators, instanceID] = await background(async function(tabId) { - Zotero.Connector_Browser.onTranslators.restore(); - - let translators, instanceID; - if (Zotero.isBrowserExt) { - translators = Zotero.Connector_Browser._tabInfo[tabId].translators.map(t => t.label); - instanceID = Zotero.Connector_Browser._tabInfo[tabId].instanceID; - } else { - let tab = await Zotero.Background.getTabByID(tabId); - translators = tab.translators.map(t => t.label); - instanceID = tab.instanceID; - } - return [translators, instanceID]; - }, tab.tabId); - - assert.notEqual(instanceID, 0); - assert.deepEqual(['COinS', 'DOI'], translators); - } finally { - await tab.close(); - } - }); - }); - }); -}); diff --git a/zotero-connectors/src/common/tools/testTranslators/testTranslators.html b/zotero-connectors/src/common/tools/testTranslators/testTranslators.html deleted file mode 100644 index cfd00d50..00000000 --- a/zotero-connectors/src/common/tools/testTranslators/testTranslators.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Zotero Translator Tester - - - - \ No newline at end of file diff --git a/zotero-connectors/src/common/tools/testTranslators/translatorTester_global.js b/zotero-connectors/src/common/tools/testTranslators/translatorTester_global.js deleted file mode 100644 index 6e14b379..00000000 --- a/zotero-connectors/src/common/tools/testTranslators/translatorTester_global.js +++ /dev/null @@ -1,147 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.TranslatorTester = {}; -var _tabData = {}; - -/** - * Called to run tests using the testing framework in Chrome or Safari, not to be confused with - * Zotero_TranslatorTester#runTests - */ -Zotero.TranslatorTester.runTests = function(translator, type, instanceID, tab) { - var debug = function(obj, msg, level) { - Zotero.Messaging.sendMessage("translatorTester_debug", [instanceID, [null, msg, level]], tab); - } - - var translatorTester = new Zotero_TranslatorTester(translator, type, debug); - translatorTester.runTests(function(obj) { - var args = new Array(arguments.length); - args[0] = JSON.parse(JSON.stringify(obj)); - for(var i=1; i. - - ***** END LICENSE BLOCK ***** -*/ - -if(isTopWindow) { - /** - * Used to run tests on injected pages, after the code in translatorTester_global has opened - * them - */ - Zotero_TranslatorTester.runTest = function(data) { - if(data) { - // extract data returned from global script - var translator = data[0]; - translator.runMode = Zotero.Translator.RUN_MODE_IN_BROWSER; // force to run in browser - var type = data[1]; - var test = data[2]; - - // get schema and preferences - var runTest = function() { - // run tests - var translatorTester = new Zotero_TranslatorTester(translator, type, function(obj, msg, level) { - Zotero.TranslatorTester.debug(null, msg, level); - }); - translatorTester.runTest(test, document, function(obj, test, status, message) { - delete test.translator; - Zotero.TranslatorTester.testComplete(null, test, status, message) - }); - }; - - if(test.defer) { - window.setTimeout(runTest, 10000); - } else { - runTest(); - } - } - } - - /** - * Called once the page has loaded - */ - var loaded = false; - var onLoad = function() { - if(loaded) return; - loaded = true; - if(document.documentURI === "http://127.0.0.1:23119/provo/run" - && document.documentElement.textContent === "fnord") { - window.setTimeout(function() { - Zotero.TranslatorTester.runAutomatedTesting(); - }, 30000); - } else { - Zotero.TranslatorTester.onLoad(Zotero_TranslatorTester.runTest); - } - }; - - // wait until load is finished, then see if there are associated tests - if(document.readyState !== "complete") { - window.addEventListener("load", function(e) { - if(e.target !== document) return; - onLoad(); - }, false); - } else { - onLoad(); - } -} \ No newline at end of file diff --git a/zotero-connectors/src/common/tools/testTranslators/translatorTester_messages.js b/zotero-connectors/src/common/tools/testTranslators/translatorTester_messages.js deleted file mode 100644 index cde60f45..00000000 --- a/zotero-connectors/src/common/tools/testTranslators/translatorTester_messages.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -MESSAGES.TranslatorTester = { - onLoad: { - response: true, - background: { - preSend: function(data) { - if (data) { - data[0] = Zotero.Translators.serialize(data[0], TRANSLATOR_PASSING_PROPERTIES) - } - return data; - }, - }, - inject: { - postReceive: function(data) { - if (data) { - data[0] = new Zotero.Translator(data[0]); - } - return data; - } - } - }, - debug: false, - runTests: false, - testComplete: false, - runAutomatedTesting: false -}; \ No newline at end of file diff --git a/zotero-connectors/src/common/tools/testTranslators/translatorTester_viewer.js b/zotero-connectors/src/common/tools/testTranslators/translatorTester_viewer.js deleted file mode 100644 index eaf3e9e4..00000000 --- a/zotero-connectors/src/common/tools/testTranslators/translatorTester_viewer.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -var _instanceData = {}; - -// save old runTests function -Zotero_TranslatorTester.prototype._runTests = Zotero_TranslatorTester.prototype.runTests; - -/** - * Overloads Zotero_TranslatorTester#runTests for Chrome/Safari environments - */ -Zotero_TranslatorTester.prototype.runTests = function(callback) { - if(this.type === "web") { - // web translators need to be run in their own environments - var instanceID = Zotero.Utilities.randomString(); - _instanceData[instanceID] = {"testDone":callback, "debug":this._debug}; - Zotero.TranslatorTester.runTests(this.translator, this.type, instanceID); - } else { - // other translators get passed right through, after we get schema and preferences - var me = this; - Zotero.Connector_Types.getSchema(function(schema) { - Zotero.Connector_Types.schema = schema; - Zotero.Connector_Types.init(); - me._runTests(callback); - }); - } -} - -// call testDoneCallback and delete instance data if this is the last -Zotero.Messaging.addMessageListener("translatorTester_testDone", function(data) { - _instanceData[data[0]].testDone.apply(null, data[1]); - if(data[1][0].pending.length === 0) delete _instanceData[data[0]]; -}); - -// call Zotero_TranslatorTester#_debug -Zotero.Messaging.addMessageListener("translatorTester_debug", function(data) { - _instanceData[data[0]].debug.apply(null, data[1]); -}); \ No newline at end of file diff --git a/zotero-connectors/src/common/translate_item.js b/zotero-connectors/src/common/translate_item.js deleted file mode 100644 index 474b6541..00000000 --- a/zotero-connectors/src/common/translate_item.js +++ /dev/null @@ -1,876 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2012 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Save translator items. - * - * @constructor - * @param {Object} options - *
  • libraryID - ID of library in which items should be saved
  • - *
  • collections - New collections to create (used during Import translation
  • - *
  • attachmentMode - One of Zotero.Translate.ItemSaver.ATTACHMENT_* specifying how attachments should be saved
  • - *
  • forceTagType - Force tags to specified tag type
  • - *
  • cookieSandbox - Cookie sandbox for attachment requests
  • - *
  • proxy - A proxy to deproxify item URLs
  • - *
  • baseURI - URI to which attachment paths should be relative
  • - *
  • sessionID - A sessionID for the save session to allow changes later
  • - * - */ -Zotero.Translate.ItemSaver = function(options) { - this.newItems = []; - this._sessionID = options.sessionID; - this._proxy = options.proxy; - this._baseURI = options.baseURI; - - // Add listener for callbacks, but only for Safari or the bookmarklet. In Chrome, we - // (have to) save attachments from the inject page. - if(Zotero.Messaging && !Zotero.Translate.ItemSaver._attachmentCallbackListenerAdded - && (Zotero.isBookmarklet || Zotero.isSafari)) { - Zotero.Messaging.addMessageListener("attachmentCallback", function(data) { - var id = data[0], - status = data[1]; - var callback = Zotero.Translate.ItemSaver._attachmentCallbacks[id]; - if(callback) { - if(status === false || status === 100) { - delete Zotero.Translate.ItemSaver._attachmentCallbacks[id]; - } else { - data[1] = 50+data[1]/2; - } - callback(data[1], data[2]); - } - }); - Zotero.Translate.ItemSaver._attachmentCallbackListenerAdded = true; - } -} -Zotero.Translate.ItemSaver._attachmentCallbackListenerAdded = false; -Zotero.Translate.ItemSaver._attachmentCallbacks = {}; - -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_IGNORE = 0; -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_DOWNLOAD = 1; -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_FILE = 2; - -Zotero.Translate.ItemSaver.prototype = { - saveAsWebpage: function(doc) { - var doc = doc || document; - var item = { - itemType: 'webpage', - title: doc.title, - url: doc.location.href, - attachments: [], - accessDate: Zotero.Date.dateToSQL(new Date(), true) - }; - return this.saveItems([item]); - }, - - /** - * Saves items to Standalone or the server - * @param items Items in Zotero.Item.toArray() format - * @param {Function} [attachmentCallback] A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - */ - saveItems: async function (items, attachmentCallback, itemsDoneCallback=()=>0) { - items = await this._processItems(items); - - // first try to save items via connector - var payload = { - items, - sessionID: this._sessionID, - uri: this._baseURI, - singleFile: true - }; - if (Zotero.isSafari) { - // This is the best in terms of cookies we can do in Safari - payload.cookie = document.cookie; - } - payload.proxy = this._proxy && this._proxy.toJSON(); - - // Add page data for snapshot - let singleFile = false; - for (let item of items) { - for (let attachment of item.attachments) { - if (attachment.mimeType !== 'text/html' - || attachment.snapshot === false) { - continue; - } - if (attachment.url && !this._urlMatchesLocation(attachment.url)) { - continue; - } - - attachment.singleFile = true; - singleFile = true; - } - } - - try { - var data = await Zotero.Connector.callMethodWithCookies("saveItems", payload) - } - catch (e) { - if (e.status == 0) { - return this._saveToServer(items, attachmentCallback, itemsDoneCallback); - } - throw e; - } - - Zotero.debug("Translate: Save via Zotero succeeded"); - Zotero.Messaging.sendMessage("progressWindow.sessionCreated", { sessionID: this._sessionID }); - - if (data && data.items) { - itemsDoneCallback(data.items); - for (let i = 0; i < data.items.length; i++) { - let attachments = items[i].attachments = data.items[i].attachments; - for (let attachment of attachments) { - if (attachment.id) { - if (!attachment.title) attachment.title = 'Attachment'; - attachmentCallback(attachment, 0); - } - } - } - - // CHANGED: Moved this up in the if statement since data is sometimes undefined - this._pollForProgress(data.items, attachmentCallback); - } - - // If we have a snapshot and the client supports SingleFile snapshots - if (singleFile && data && data.singleFile) { - // Do not wait for async function so we continue to update UI - this._executeSingleFile(payload); - } - - // CHANGED: Added if check since data is sometimes undefined - if (data) { - return data.items; - } - }, - - _executeSingleFile: async function(payload) { - try { - payload.snapshotContent = await Zotero.SingleFile.retrievePageData(); - } - catch (e) { - // We swallow this error and fall back to saving the - // page in the client - } - - try { - await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: {"Content-Type": "application/json"} - }, - payload - ); - } - catch (e) { - if (e.status === 400 && e.value === 'Endpoint does not support content-type\n') { - let snapshotContent = payload.snapshotContent; - delete payload.snapshotContent; - - payload.pageData = { - content: snapshotContent, - resources: {} - }; - - // This means a Zotero client that expects SingleFileZ. We can just feed - // it a payload it is expecting with no resources. - await Zotero.Connector.callMethodWithCookies({ - method: "saveSingleFile", - headers: {"Content-Type": "multipart/form-data"} - }, - { - payload: JSON.stringify(payload) - } - ); - } - else { - throw e; - } - } - }, - - /** - * Return true if the attachment URL fuzzy matches the window location - * - * @param {String} attachmentURL - * @return {Boolean} - */ - _urlMatchesLocation: function(attachmentURL) { - // Complete match - if (attachmentURL === location.href) { - return true; - } - // Translators control the attachment URL and historically that URL was passed to - // the client to save a snapshot. Here we are trying to detect if the attachment URL - // has query params that are a subset of the current URL. So for example: - // - // Attachment URL: /records?id=1234 would match the following: - // - // Current URL: /records?id=1234#abstract - // Current URL: /records?id=1234&utm_source=search - // Current URL: /records?utm_source=search&id=1234 - // - // But not match: - // - // Current URL: /records - // Current URL: /records?utm_source=search - // Current URL: /records?id=5678 - const url = new URL (attachmentURL); - if (url.protocol + url.host + url.pathname === location.protocol + location.host - + location.pathname) { - const locationURL = new URL(location.href); - for (const [param, value] of url.searchParams) { - if (locationURL.searchParams.get(param) !== value) { - return false; - } - } - - return true; - } - - return false; - }, - - _processItems: function(items) { - var saveOptions = !Zotero.isBookmarklet && Zotero.Inject.sessionDetails.saveOptions; - if (saveOptions && saveOptions.note && items.length == 1) { - if (items[0].notes) { - items[0].notes.push({note: saveOptions.note}) - } else { - items[0].notes = {note: saveOptions.note}; - } - } - return items; - }, - - /** - * Polls for updates to attachment progress - * @param items Items in Zotero.Item.toArray() format - * @param {Function} attachmentCallback A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - * attachmentCallback() will be called with all attachments that will be saved - */ - _pollForProgress: async function (items, attachmentCallback) { - var attachments = []; - for (let item of items) { - if (!item.attachments) continue; - for (let attachment of item.attachments) { - if (attachment.id) { - attachments.push(attachment); - } - } - } - - var nPolls = 0; - while (true) { - try { - var response = await Zotero.Connector.callMethod( - "sessionProgress", { sessionID: this._sessionID } - ) - } - catch (e) { - // Zotero <=5.0.55 - if (e.status == 404) { - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - return this._pollForProgressLegacy(items, attachmentCallback); - } else if (Zotero.isBookmarklet && e.status == 400) { - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - for (let item of items) { - for (let attachment of item.attachments) { - attachmentCallback(Object.assign({}, attachment, {parentItem: item.id}), 100); - } - } - } - - for (let attachment of attachments) { - attachmentCallback(attachment, false, "Lost connection to Zotero"); - } - return; - } - - // Store last version of attachments so we can cancel them if a subsequent request fails - let newAttachments = []; - for (let item of response.items) { - if (!item.attachments) continue; - for (let attachment of item.attachments) { - attachment.parentItem = item.id; - attachmentCallback(attachment, attachment.progress); - newAttachments.push(attachment); - } - } - attachments = newAttachments; - - if (nPolls++ < 60 && !response.done) { - await Zotero.Promise.delay(1000); - } - else { - break; - } - } - - Zotero.Messaging.sendMessage("progressWindow.done", [true]); - }, - - - _pollForProgressLegacy: function (items, attachmentCallback) { - var attachments = []; - var progressIDs = []; - var previousStatus = []; - for(var i=0; i0) { - var newItems = [], itemIndices = [], typedArraysSupported = false; - try { - typedArraysSupported = !!(new Uint8Array(1) && new Blob()); - } catch(e) {} - - for(var i=0, n=items.length; i0) { - var promises = []; - for (let attachment of attachments) { - let isSnapshot = false; - if (attachment.mimeType) { - switch (attachment.mimeType.toLowerCase()) { - case "text/html": - case "application/xhtml+xml": - isSnapshot = true; - } - } - - if ((isSnapshot && !prefs.automaticSnapshots) || (!isSnapshot && !prefs.downloadAssociatedFiles)) { - // Skip attachment due to prefs - continue; - } - - let deferredHeadersProcessed = Zotero.Promise.defer(); - let itemKeyPromise = deferredHeadersProcessed.promise - .then(() => this._createAttachmentItem(itemKey, attachment)); - let deferredAttachmentData = Zotero.Promise.defer(); - - if (attachment.snapshot === false && attachment.mimeType) { - // If we aren't taking a snapshot and we have the MIME type, we don't need - // to download any data - attachment.linkMode = "linked_url"; - attachmentCallback && attachmentCallback(attachment, 0); - deferredHeadersProcessed.resolve(); - deferredAttachmentData.resolve(); - } else if (Zotero.isBookmarklet && window.isSecureContext && attachment.url.indexOf('https') != 0) { - deferredAttachmentData.reject(new Error('Cannot load a HTTP attachment in a HTTPS page')); - } else { - let method = (attachment.snapshot === false ? "HEAD" : "GET"); - let options = { responseType: (isSnapshot ? "document" : "arraybuffer"), timeout: 60000 }; - Zotero.HTTP.request(method, attachment.url, options).then((xhr) => { - deferredHeadersProcessed.resolve(this._processAttachmentHeaders(attachment, xhr, baseName)); - deferredAttachmentData.resolve(xhr.response); - }, (e) => { - deferredHeadersProcessed.reject(e); - deferredAttachmentData.reject(e); - }); - if (attachmentCallback) attachmentCallback(attachment, 0); - } - - let promise = Zotero.Promise.all([itemKeyPromise, deferredAttachmentData.promise]).then(function(result) { - attachmentCallback(attachment, 50); - // Attachment item created on zotero.org, store the key - attachment.key = result[0]; - // Attachment downloaded, store the data - attachment.data = result[1]; - if (attachment.linkMode !== "linked_url") { - return this._uploadAttachmentToServer(attachment, attachmentCallback); - } - }.bind(this)).then(function() { - attachmentCallback(attachment, 100); - }).catch(function(e) { - Zotero.logError(e); - attachmentCallback(Object.assign({}, attachment, {parentItem: itemKey}), false, e); - throw e; - }); - promises.push(promise); - } - // This throws if at least one upload fails - return Zotero.Promise.all(promises); - }, - - /** - * Creates an attachment item on the Zotero server. This assigns a "key" to the item - * and allows to upload the attachment data - * - * @param parentItemKey - * @param attachment - * @returns {Promise.} Item key - * @private - */ - _createAttachmentItem: function(parentItemKey, attachment) { - // deproxify url - if (this._proxy && attachment.url) { - attachment.url = this._proxy.toProper(attachment.url); - } - var item = [{ - "itemType":"attachment", - "parentItem":parentItemKey, - "linkMode":attachment.linkMode, - "title":(attachment.title ? attachment.title.toString() : "Untitled Attachment"), - "accessDate":"CURRENT_TIMESTAMP", - "url":attachment.url, - "note":(attachment.note ? attachment.note.toString() : ""), - "tags":(attachment.tags && attachment.tags instanceof Array ? attachment.tags : []) - }]; - - return Zotero.API.createItem(item).then(function(response) { - try { - return JSON.parse(response); - } catch(e) { - throw new Error(`Unexpected response from server ${response}`); - } - }).then(function(response) { - Zotero.debug(`Attachment item created for ${attachment.title}`); - return response.success[0]; - }); - }, - - /** - * Performs attachment header processing and throws an error upon failure. - * - * @param {Object} attachment - * @param {XMLHttpRequest} xhr - * @param {String} baseName - attachment base filename on the server - * @private - */ - _processAttachmentHeaders: function(attachment, xhr, baseName) { - // Validate status - if (xhr.status === 0 || attachment.snapshot === false) { - // Failed due to SOP, or we are supposed to be getting a snapshot - attachment.linkMode = "linked_url"; - } else if (xhr.status !== 200) { - throw new Error(`Zotero.org returned unexpected status code ${xhr.status}`); - } else { - // Validate content type - var contentType = "application/octet-stream", - charset = null, - contentTypeHeader = xhr.getResponseHeader("Content-Type"); - if (contentTypeHeader) { - // See RFC 2616 sec 3.7 - var m = /^[^\x00-\x1F\x7F()<>@,;:\\"\/\[\]?={} ]+\/[^\x00-\x1F\x7F()<>@,;:\\"\/\[\]?={} ]+/.exec(contentTypeHeader); - if(m) contentType = m[0].toLowerCase(); - m = /;\s*charset\s*=\s*("[^"]+"|[^\x00-\x1F\x7F()<>@,;:\\"\/\[\]?={} ]+)/.exec(contentTypeHeader); - if (m) { - charset = m[1]; - if(charset[0] === '"') charset = charset.substring(1, charset.length-1); - } - - if (attachment.mimeType - && attachment.mimeType.toLowerCase() !== contentType.toLowerCase()) { - throw new Error("Attachment MIME type "+contentType+ - " does not match specified type "+attachment.mimeType); - } - } - - attachment.mimeType = contentType; - attachment.linkMode = "imported_url"; - switch (contentType.toLowerCase()) { - case "application/pdf": - attachment.filename = baseName+".pdf"; - break; - case "text/html": - case "application/xhtml+xml": - attachment.filename = baseName+".html"; - break; - default: - attachment.filename = baseName; - } - if (charset) attachment.charset = charset; - } - }, - - /** - * Uploads an attachment to the Zotero server - * @param {Object} attachment Attachment object, including - * @param {Function} attachmentCallback A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - */ - "_uploadAttachmentToServer":function(attachment, attachmentCallback) { - Zotero.debug("Uploading attachment to server"); - switch(attachment.mimeType.toLowerCase()) { - case "text/html": - case "application/xhtml+xml": - // It's possible that we didn't know if this was a snapshot until after the - // download began. If this is the case, we need to convert it to a document. - if(attachment.data instanceof ArrayBuffer) { - var me = this, - blob = new Blob([attachment.data], {"type":attachment.mimeType}), - reader = new FileReader(); - reader.onloadend = function() { - if(reader.error) { - attachmentCallback(attachment, false, reader.error); - } else { - // Convert to an HTML document - var result = reader.result, doc; - try { - // First try using DOMParser - doc = (new DOMParser()).parseFromString(result, "text/html"); - } catch(e) {} - - // If DOMParser fails, use document.implementation.createHTMLDocument, - // as documented at https://developer.mozilla.org/en-US/docs/Web/API/DOMParser - if(!doc) { - doc = document.implementation.createHTMLDocument(""); - var docEl = doc.documentElement; - // AMO reviewer: This code is not run in Firefox, and the document - // is never rendered anyway - docEl.innerHTML = result; - if(docEl.children.length === 1 && docEl.firstElementChild === "html") { - doc.replaceChild(docEl.firstElementChild, docEl); - } - } - - attachment.data = doc; - me._uploadAttachmentToServer(attachment, attachmentCallback); - } - } - reader.readAsText(blob, attachment.charset || "iso-8859-1"); - return; - } - - // We are now assured that attachment.data is an HTMLDocument, so we can - // add a base tag - - // Get the head tag - var doc = attachment.data, - head = doc.getElementsByTagName("head"); - if(!head.length) { - head = doc.createElement("head"); - var docEl = attachment.data.documentElement; - docEl.insertBefore(head, docEl.firstChildElement); - } else { - head = head[0]; - } - - // Add the base tag - var base = doc.createElement("base"); - base.href = attachment.url; - head.appendChild(base); - - // Remove content type tags - var metaTags = doc.getElementsByTagName("meta"), metaTag; - for(var i=0; i - Chris G Jones - Shaon Barman - Vivien Nicolas <21@vingtetun.org> - Justin D'Arcangelo - Yury Delendik - Kalervo Kujala - Adil Allawi <@ironymark> - Jakob Miland - Artur Adib - Brendan Dahl - David Quintana - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - */ - "_md5":(function calculateMD5Closure() { - // Don't throw if typed arrays are not supported - try { - var r = new Uint8Array([ - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); - - var k = new Int32Array([ - -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, - -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, - 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, - 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, - 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, - 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, - -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, - -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, - -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, - -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, - -145523070, -1120210379, 718787259, -343485551]); - } catch(e) {}; - - function hash(data, offset, length) { - var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; - // pre-processing - var paddedLength = (length + 72) & ~63; // data + 9 extra bytes - var padded = new Uint8Array(paddedLength); - var i, j, n; - if (offset || length != data.byteLength) { - padded.set(new Uint8Array(data.buffer, offset, length)); - } else { - padded.set(data); - } - i = length; - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) - padded[i++] = 0; - padded[i++] = (length << 3) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - // chunking - // TODO ArrayBuffer ? - var w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = (padded[i] | (padded[i + 1] << 8) | - (padded[i + 2] << 16) | (padded[i + 3] << 24)); - } - var a = h0, b = h1, c = h2, d = h3, f, g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = (b & c) | ((~b) & d); - g = j; - } else if (j < 32) { - f = (d & b) | ((~d) & c); - g = (5 * j + 1) & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = (3 * j + 5) & 15; - } else { - f = c ^ (b | (~d)); - g = (7 * j) & 15; - } - var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; - d = c; - c = b; - b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; - a = tmp; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - } - return new Uint8Array([ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF - ]); - } - return hash; - })() -}; diff --git a/zotero-connectors/src/common/translators.js b/zotero-connectors/src/common/translators.js deleted file mode 100644 index f1cff7bb..00000000 --- a/zotero-connectors/src/common/translators.js +++ /dev/null @@ -1,368 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -// Enumeration of types of translators -var TRANSLATOR_TYPES = Zotero.Translator.TRANSLATOR_TYPES; - -/** - * Singleton to handle loading and caching of translators - * @namespace - */ -Zotero.Translators = new function() { - var _cache, _translators; - var _initialized = false; - var _fullFrameDetectionWhitelist = ['resolver.ebscohost.com']; - var _resetAttempted = false; - - /** - * Initializes translator cache, loading all relevant translators into memory - * @param {Zotero.Translate[]} [translators] List of translators. If not specified, it will be - * retrieved from storage. - */ - this.init = async function(translators) { - if(!translators) { - translators = []; - if((Zotero.isBrowserExt || Zotero.isSafari) && Zotero.Prefs.get("translatorMetadata")) { - try { - translators = Zotero.Prefs.get("translatorMetadata"); - if(typeof translators !== "object") { - translators = []; - } - } catch(e) {} - } - } - - _cache = {"import":[], "export":[], "web":[], "search":[]}; - _translators = {}; - _initialized = true; - - // Build caches - for(var i=0; i b.priority) { - return 1; - } - else if (a.priority < b.priority) { - return -1; - } - } - for(var type in _cache) { - _cache[type].sort(cmp); - } - } - - /** - * Gets the translator that corresponds to a given ID, without attempting to retrieve code - * @param {String} id The ID of the translator - */ - this.getWithoutCode = async function(id) { - if(!_initialized) await Zotero.Translators.init(); - return _translators[id] ? _translators[id] : false; - } - - /** - * Load code for a translator - */ - this.getCodeForTranslator = async function (translator) { - if (!_initialized) await Zotero.Translators.init(); - if (translator.code) return translator.code; - - let code = await Zotero.Repo.getTranslatorCode(translator.translatorID); - translator.code = code; - return code; - } - - /** - * Gets the translator that corresponds to a given ID - * - * @param {String} id The ID of the translator - */ - this.get = async function (id) { - if (!_initialized) await Zotero.Translators.init(); - var translator = _translators[id]; - if (!translator) { - return false; - } - - // only need to get code if it is of some use - if(translator.runMode === Zotero.Translator.RUN_MODE_IN_BROWSER - && !translator.hasOwnProperty("code")) { - await Zotero.Translators.getCodeForTranslator(translator); - } - return translator; - }; - - /** - * Gets all translators for a specific type of translation - * @param {String} type The type of translators to get (import, export, web, or search) - * @param {Boolean} [debugMode] Whether to assume debugging mode. If true, code is included for - * unsupported translators, and code originally retrieved from the - * repo is re-retrieved from Zotero Standalone. - */ - this.getAllForType = async function (type, debugMode) { - if(!_initialized) await Zotero.Translators.init(); - var translators = _cache[type].slice(0); - var codeGetter = new Zotero.Translators.CodeGetter(translators, debugMode); - await codeGetter.getAll(); - return translators; - }; - - /** - * Gets web translators for a specific location - * - * NOTE: Keep in sync with the bookmarklet version - * - * @param {String} uri The URI for which to look for translators - * @return {Promise} - A promise for a 2-item array containing an array of translators and - * an array of functions for converting URLs from proper to proxied forms - */ - this.getWebTranslatorsForLocation = async function (URI, rootURI, callback) { - await Zotero.initDeferred.promise; - if (callback) { - // If callback is present then this call is coming from an injected frame, - // so we may as well treat it as if it's a root-frame - rootURI = URI; - } else { - // Hopefully a temporary hard-coded list - for (let str of _fullFrameDetectionWhitelist) { - if (URI.includes(str)) { - rootURI = URI; - break; - } - } - } - var isFrame = URI !== rootURI; - if(!_initialized) await Zotero.Translators.init(); - var allTranslators = _cache["web"]; - var potentialTranslators = []; - var proxies = []; - - var rootSearchURIs = Zotero.Proxies.getPotentialProxies(rootURI); - var frameSearchURIs = isFrame ? Zotero.Proxies.getPotentialProxies(URI) : rootSearchURIs; - - Zotero.debug("Translators: Looking for translators for "+Object.keys(frameSearchURIs).join(', ')); - - for(var i=0; i translator.deleted) - .map(translator => translator.translatorID); - - for (let id of deletedTranslators) { - // Already deleted - if (! _translators.hasOwnProperty(id)) continue; - - hasChanged = true; - Zotero.debug(`Translators: Removing ${_translators[id].label}`); - delete _translators[id]; - } - - if(!hasChanged) return; - - // Serialize translators - for(var i in _translators) { - var serializedTranslator = this.serialize(_translators[i], Zotero.Translator.TRANSLATOR_CACHING_PROPERTIES); - - serializedTranslators.push(serializedTranslator); - } - } - - // Store - if (Zotero.isBrowserExt || Zotero.isSafari) { - Zotero.Prefs.set('translatorMetadata', serializedTranslators); - Zotero.debug("Translators: Saved updated translator list ("+serializedTranslators.length+" translators)"); - } - - // Reinitialize - await Zotero.Translators.init(serializedTranslators); - } -} - -/** - * A class to get the code for a set of translators at once - * - * @param {Zotero.Translator[]} translators Translators for which to retrieve code - */ -Zotero.Translators.CodeGetter = function(translators) { - this._translators = translators; - this._concurrency = 2; -}; - -Zotero.Translators.CodeGetter.prototype.getCodeFor = async function(i) { - let translator = this._translators[i]; - try { - translator.code = await Zotero.Translators.getCodeForTranslator(translator); - } catch (e) { - Zotero.debug(`Failed to retrieve code for ${translator.translatorID}`) - } - return translator.code; -}; - -Zotero.Translators.CodeGetter.prototype.getAll = async function () { - let codes = []; - // Chain promises with some level of concurrency. If unchained, fires - // off hundreds of xhttprequests on connectors and crashes the extension - for (let i = 0; i < this._translators.length; i++) { - if (i < this._concurrency) { - codes.push(this.getCodeFor(i)); - } else { - codes.push(codes[i-this._concurrency].then(() => this.getCodeFor(i))); - } - } - return Promise.all(codes); -}; diff --git a/zotero-connectors/src/common/ui/ModalPrompt.jsx b/zotero-connectors/src/common/ui/ModalPrompt.jsx deleted file mode 100644 index a547b025..00000000 --- a/zotero-connectors/src/common/ui/ModalPrompt.jsx +++ /dev/null @@ -1,220 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -window.Zotero = window.Zotero || {}; -Zotero.UI = Zotero.UI || {}; - -/** - * Displays a prompt which is overlaid over the screen. - */ -Zotero.UI.ModalPrompt = class ModalPrompt extends React.Component { - constructor(props) { - super(props); - this.state = { - checkboxChecked: this.props.checkboxChecked || false, - checkboxBlocked: this.props.checkboxBlock && !this.props.checkboxChecked || false, - onButton: this.props.onButton || this.props.onClose, - inputText: this.props.inputText || "", - }; - - this.escListener = this.escListener.bind(this); - this.onInputChange = this.onInputChange.bind(this); - this.onCheckboxChange = this.onCheckboxChange.bind(this); - this.onInputChange = this.onInputChange.bind(this); - } - - componentDidMount() { - document.addEventListener('keyup', this.escListener); - setTimeout(() => this.refs.button1.focus()); - } - - componentWillUnmount() { - document.removeEventListener('keyup', this.escListener); - } - - // With synthetic React events you cannot stop event propagation - attachButtonListeners() { - window.requestAnimationFrame(function() { - for (let a of document.querySelectorAll('.ModalPrompt-buttons input[type=button]')) { - a.addEventListener('click', (event) => { - event.stopPropagation(); - this.state.onButton(this.state, event); - }, false); - } - }.bind(this)); - } - - escListener(event) { - if (event.key == "Escape") { - this.props.onClose(this.state); - event.preventDefault(); - } - } - - onCheckboxChange() { - this.setState({checkboxChecked: !this.state.checkboxChecked, - checkboxBlocked: this.props.checkboxBlock && this.state.checkboxChecked}); - } - - onInputChange(event) { - this.setState({inputText: event.value}); - } - - render() { - var checkbox, input, buttons = ["", "", ""]; - checkbox = input = ""; - - if (this.props.checkbox) { - checkbox = (

    - -

    ); - } - - if (this.props.input) { - input = (

    - -

    ); - } - - for (let i = 1; i <= 3; i++) { - if (this.props[`button${i}Text`].length) { - buttons[i-1] = - } - } - - this.attachButtonListeners(); - - let onClickOutside = e => { - e.stopPropagation(); - if (this.props.clickOutsideToClose - && e.target.classList.contains('z-modal-overlay')) { - this.props.onClose(this.state, e); - } - }; - - let message = this.props.children || this.props.message; - if (typeof message == "string") { - message = - } - return (
    -
    -

    - {this.props.title} -

    -

    - {message} -

    - {checkbox} - {input} -
    - {buttons[2]} - - {buttons[1]} - {buttons[0]} -
    -
    -
    ) - } -}; - -Zotero.UI.ModalPrompt.defaultProps = { - title: "Zotero Connector", - checkbox: false, - checkboxText: "", - checkboxBlock: false, - input: false, - inputPlaceholder: "", - button1Text: "OK", - button2Text: "Cancel", - button3Text: "", - clickOutsideToClose: false -}; - -Zotero.UI.ModalPrompt.PropTypes = { - title: PropTypes.string, - /** - * Show/hide checkbox - */ - checkbox: PropTypes.bool, - checkboxChecked: PropTypes.bool, - /** - * Whether unchecked checkbox should block pressing button1 - */ - checkboxBlock: PropTypes.bool, - /** - * Show/hide input box - */ - input: PropTypes.bool, - /** - * Rightmost button. Empty string hides button. - * @default Ok - */ - button1Text: PropTypes.string, - /** - * Second to the right button. Empty string hides button. - * @default Cancel - */ - button2Text: PropTypes.string, - /** - * Leftmost button. Empty string hides button. - * @default '' - */ - button3Text: PropTypes.string, - /** - * Whether clicking outside the prompt should cause it to close - * @default false - */ - clickOutsideToClose: PropTypes.bool, - /** - * Triggered on clicking outside of the prompt and on Cancel, unless overriden. - * - * This is required because the component does not know how to remove itself from the DOM. - */ - onClose: PropTypes.func.isRequired, - /** - * Triggered on clicking a button. Defaults to onClose - * @default onClose - */ - onButton: PropTypes.func, - /** - * The body of the prompt to be displayed. Can be a react element or a html string. - * Newlines are NOT converted into
    - */ - message: PropTypes.any, - children: PropTypes.any -}; diff --git a/zotero-connectors/src/common/ui/Notification.js b/zotero-connectors/src/common/ui/Notification.js deleted file mode 100644 index ab6bdf21..00000000 --- a/zotero-connectors/src/common/ui/Notification.js +++ /dev/null @@ -1,167 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { -var win = Zotero.isBookmarklet ? window.parent : window, - doc = Zotero.isBookmarklet ? window.parent.document : window.document; -win.Zotero = win.Zotero || {}; -Zotero.UI = Zotero.UI || {}; - -/** - * @param {String} text notification text - * @param {Object[]} buttons (right to left) - * - {String} title - * - {Function} onClick - * - {Boolean} dismiss - whether the button click dismisses/removes the notification - * @constructor - */ -Zotero.UI.Notification = function(text, buttons) { - this.text = text; - if (!buttons) { - buttons = [{ - title: "✕", - dismiss: true - }] - } - for (let i = 0; i < buttons.length; i++) { - let button = buttons[i]; - if (button.onClick && button.dismiss) { - button.onClick = this.dismiss.bind(this, button.onClick, i); - } else if (!button.onClick) { - // if onClick undefined we dismiss - button.onClick = this.dismiss.bind(this, null, i); - } - } - this.buttons = buttons; - this.elems = {}; -}; - -// TODO: Put styles in a stylesheet that we insert, so we can use pseudo-classes properly, do proper -// resetting, etc. -Zotero.UI.Notification.rootStyle = { - // Stay on top of other page elements - position: "relative", - zIndex: 2147483647, - /* Copy the notification style from Firefox */ - background: "linear-gradient(#ffe13e, #ffc703)", - color: "rgba(0,0,0,0.95)", - borderBottom: "1px solid #bf8a01", - padding: "3px 10px 4px", - display: "flex", - flexDirection: "row", - alignItems: "center", - boxSizing: "border-box", - cursor: "default", - transition: "margin-top 300ms, opacity 300ms" -}; - -Zotero.UI.Notification.textStyle = { - fontFamily: "Lucida Grande, Tahoma, sans", - fontSize: "8.5pt", - lineHeight: "1.4em", - fontWeight: "bold", - color: "rgba(0,0,0,0.95)" -}; - -Zotero.UI.Notification.buttonStyle = Object.assign({ - padding: "3px", - textDecoration: "none", - margin: "0", - marginLeft: "30px", - whiteSpace: "nowrap" -}, Zotero.UI.Notification.textStyle); - -Zotero.UI.Notification.prototype = { - show: function() { - if (this.deferred) return deferred.promise; - this.deferred = Zotero.Promise.defer(); - var elem = doc.createElement('div'); - for (let param in Zotero.UI.Notification.rootStyle) { - elem.style[param] = Zotero.UI.Notification.rootStyle[param]; - } - for (let param in Zotero.UI.Notification.textStyle) { - elem.style[param] = Zotero.UI.Notification.textStyle[param]; - } - let margins = ['marginTop', 'marginRight', 'marginLeft']; - let bodyStyle = getComputedStyle(doc.body); - for (let margin of margins) { - elem.style[margin] = '-' + bodyStyle[margin]; - } - this.elems.root = elem; - elem.classList.add('zotero-notificaton'); - - elem = doc.createElement('span'); - elem.innerHTML = this.text; - elem.style.flexGrow = 1; - this.elems.text = elem; - this.elems.root.appendChild(elem); - - elem = doc.createElement('span'); - elem.style.minWidth = "30px"; - this.elems.root.appendChild(elem); - - this.elems.buttons = []; - for (let i = this.buttons.length-1; i >= 0; i--) { - let button = this.buttons[i]; - elem = doc.createElement('a'); - elem.dataset.id = i; - elem.setAttribute('href', 'javascript:void(0)'); - for (let param in Zotero.UI.Notification.buttonStyle) { - elem.style[param] = Zotero.UI.Notification.buttonStyle[param]; - } - for (let param in Zotero.UI.Notification.textStyle) { - elem.style[param] = Zotero.UI.Notification.textStyle[param]; - } - this.elems.buttons.push(elem); - this.elems.root.appendChild(elem); - button.onClick && elem.addEventListener('click', button.onClick); - - elem = doc.createTextNode(button.title); - this.elems.buttons[this.buttons.length-1-i].appendChild(elem); - } - - doc.body.insertBefore(this.elems.root, doc.body.firstChild); - - return this.deferred.promise; - }, - - dismiss: function(onClick, id) { - onClick && onClick(this); - if (!this.elems.root) return; - doc.body.removeChild(this.elems.root); - this.deferred.resolve(id); - this.deferred = null; - } -}; -})(); - -window.addEventListener('load', function () { - var style = document.createElement('style'); - style.type = 'text/css'; - style.innerHTML = ` - .zotero-notification a:hover { color: rgba(0,0,0,0.95) !important; } - `; - document.getElementsByTagName('head')[0].appendChild(style); -}); diff --git a/zotero-connectors/src/common/ui/ProgressWindow.jsx b/zotero-connectors/src/common/ui/ProgressWindow.jsx deleted file mode 100644 index 0eaa690e..00000000 --- a/zotero-connectors/src/common/ui/ProgressWindow.jsx +++ /dev/null @@ -1,944 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -window.Zotero = window.Zotero || {}; -Zotero.UI = Zotero.UI || {}; -Zotero.UI.style = Zotero.UI.style || {}; - -if (Zotero.isBookmarklet) { - Zotero.UI.style.imageBase = ZOTERO_CONFIG.BOOKMARKLET_URL + "images/"; -} -else if (typeof browser != 'undefined') { - Zotero.UI.style.imageBase = browser.runtime.getURL("images/"); -} -else if (typeof chrome != 'undefined') { - Zotero.UI.style.imageBase = chrome.extension.getURL("images/"); -} -else { - Zotero.UI.style.imageBase = `${safari.extension.baseURI}safari/` + "images/"; -} - -function getTargetType(id) { - return id.startsWith('L') ? 'library': 'collection'; -} - -function getParent(rows, id) { - var pos = rows.findIndex(row => row.id == id); - var row = rows[pos]; - var level = row.level; - if (!level) return null; - while (true) { - pos--; - // This shouldn't happen unless a root is missing - if (!rows[pos]) { - return rows[pos + 1]; - } - // If item's level is one below the current one or is a root, that's the parent - if (rows[pos].level == level - 1 || !rows[pos].level) { - return rows[pos]; - } - } -} - -Zotero.UI.ProgressWindow = class ProgressWindow extends React.PureComponent { - constructor(props) { - super(props); - this.state = this.getInitialState(); - - this.nArcs = 20; - - this.text = { - more: Zotero.getString('general_more'), - done: Zotero.getString('general_done'), - tagsPlaceholder: Zotero.getString('progressWindow_tagPlaceholder') - }; - - this.headlineSelectNode = React.createRef(); - - this.handleMouseEnter = this.handleMouseEnter.bind(this); - this.handleMouseLeave = this.handleMouseLeave.bind(this); - this.handleUserInteraction = this.handleUserInteraction.bind(this); - this.handleHeadlineSelectFocus = this.handleHeadlineSelectFocus.bind(this); - this.onHeadlineSelectChange = this.onHeadlineSelectChange.bind(this); - this.onDisclosureChange = this.onDisclosureChange.bind(this); - this.handleDisclosureKeyPress = this.handleDisclosureKeyPress.bind(this); - this.onTargetChange = this.onTargetChange.bind(this); - this.handleExpandRows = this.handleExpandRows.bind(this); - this.handleCollapseRows = this.handleCollapseRows.bind(this); - this.handleRowToggle = this.handleRowToggle.bind(this); - this.handleKeyDown = this.handleKeyDown.bind(this); - this.handleKeyPress = this.handleKeyPress.bind(this); - this.onTagsChange = this.onTagsChange.bind(this); - this.onTagsKeyPress = this.onTagsKeyPress.bind(this); - this.onTagsFocus = this.onTagsFocus.bind(this); - this.onTagsBlur = this.onTagsBlur.bind(this); - this.handleDone = this.handleDone.bind(this); - } - - getInitialState() { - return { - headlineText: "", - target: null, - targets: null, - targetSelectorShown: false, - tags: "", - itemProgress: new Map(), - errors: [] - }; - } - - componentDidMount() { - for (let evt of ['changeHeadline', 'makeReadOnly', 'updateProgress', 'addError']) { - this.addMessageListener(`progressWindowIframe.${evt}`, (data) => this[evt](...data)); - } - this.addMessageListener('progressWindowIframe.shown', this.handleShown.bind(this)); - this.addMessageListener('progressWindowIframe.hidden', this.handleHidden.bind(this)); - this.addMessageListener('progressWindowIframe.reset', () => this.setState(this.getInitialState())); - - document.addEventListener('visibilitychange', this.handleVisibilityChange.bind(this)); - - // Preload other disclosure triangle state - (new Image()).src = 'disclosure-open.svg'; - - this.sendMessage('registered'); - } - - - componentDidUpdate() { - // Focus the recents drop-down - if (this.focusHeadlineSelect) { - this.focusHeadlineSelect = false; - if (this.headlineSelectNode.current) { - // Don't count this focus as a user interaction - this.ignoreHeadlineSelectFocus = true; - this.headlineSelectNode.current.focus(); - } - } - // Focus the focused tree - else if (this.focusTreeOnUpdate) { - this.focusTreeOnUpdate = false; - // This is a hacky approach, but figuring out when the focused tree row was rendered - // would be way more convoluted. - setTimeout(function () { - var focused = document.querySelector('.focused'); - if (focused) { - focused.click(); - } - }, 100); - } - - // Let the parent window know it has to resize the iframe - window.requestAnimationFrame(() => { - if (this.lastHeight != this.rootNode.scrollHeight - // In Firefox this ends up being 0 when the pane closes - && this.rootNode.scrollHeight != 0) { - this.lastHeight = this.rootNode.scrollHeight; - this.sendMessage('resized', { height: this.rootNode.scrollHeight }); - } - }); - } - - - // - // State update - // - changeHeadline(text, target, targets) { - // Target selector mode - if (targets) { - // On initialization or if collapsed, focus the recents drop-down - if (!this.state.targets || !this.state.targetSelectorShown) { - this.focusHeadlineSelect = true; - } - - // Auto-expand libraries - targets.forEach((t) => { - if (getTargetType(t.id) == 'library') { - t.expanded = true; - } - }); - - // Expand to selected node - let parent = getParent(targets, target.id); - while (parent) { - if (parent.expanded) { - break; - } - parent.expanded = true; - parent = getParent(targets, parent.id); - } - } - - var state = { - headlineText: text, - target, - targets - }; - // If client is closed after a successful save with the target selector open and then the - // button is clicked again and save-to-server is enabled, we need to collapse the pane - if (!targets) { - state.targetSelectorShown = false; - } - this.setState(state); - } - - makeReadOnly(target) { - this.setState({ - targetSelectorShown: false, - target, - targets: null - }); - } - - updateProgress(id, params = {}) { - // Assign a random id if not provided. This row won't be able to be updated. - if (!id) { - id = Math.floor(Math.random() * 99999999); - } - - this.setState((prevState, props) => { - var iconSrc = params.iconSrc; - var title = params.title; - var parentItem = params.parentItem; - var progress = params.progress; - - var newState = { - itemProgress: new Map(prevState.itemProgress) - }; - - var p = prevState.itemProgress.get(id); - if (!p) { - p = {id, iconSrc, title}; - newState.itemProgress.set(id, p); - p.order = prevState.itemProgress.size - 1; - } - p.title = title; - if (iconSrc) { - p.iconSrc = iconSrc; - } - if (parentItem) { - p.parentItem = parentItem; - } - if (progress === false) { - p.failed = true; - } - // Just remove the line if an optional PDF wasn't found - else if (progress == -1) { - newState.itemProgress.delete(id); - } - else if (typeof progress == 'number') { - p.percentage = progress; - } - return newState; - }); - } - - addError() { - this.setState((prevState) => { - let errors = [...prevState.errors]; - let newError = Array.from(arguments); - // Add error if new - if (!errors.find(e => JSON.stringify(e) == JSON.stringify(newError))) { - errors.push(newError); - } - return { errors }; - }); - } - - // - // Messaging - // - sendMessage(name, data = {}) { - if (!Zotero.isBookmarklet) { - return Zotero.Messaging.sendMessage(`progressWindowIframe.${name}`, data); - } - return window.top.postMessage([`progressWindowIframe.${name}`, data], "*"); - } - - addMessageListener(name, handler) { - if (!Zotero.isBookmarklet) { - return Zotero.Messaging.addMessageListener(name, handler); - } - window.addEventListener('message', function(event) { - if (event.data && event.data[0] == name) { - handler(event.data[1]); - } - }); - } - - sendUpdate() { - this.sendMessage('updated', { target: this.target, tags: this.tags }); - } - - // - // Handlers - // - handleShown() { - // If previously hidden and now reopened with the target selector shown, focus the tree - if (this.state.targetSelectorShown) { - this.focusTreeOnUpdate = true; - } - } - - handleHidden() { - } - - handleMouseEnter() { - this.sendMessage('mouseenter'); - } - - handleMouseLeave() { - this.sendMessage('mouseleave'); - } - - handleMouseMove() { - this.sendMessage('mousemove'); - } - - handleVisibilityChange() { - // When the tab becomes visible, check whether the mouse is over the frame and trigger a - // mouseenter/mouseleave accordingly. We don't trigger a mouseleave when the tab becomes - // hidden so that the popup doesn't change state in the background, but we skip the - // delaySync() request in the setInterval() in progressWindow_inject.js when it's hidden. - if (!document.hidden) { - // This is a hack to synchronously check whether we're over the iframe, using a no-op - // CSS property on hover - let hovering = window.getComputedStyle(this.rootNode) - .getPropertyValue('background-size') == 'cover'; - if (hovering) { - this.handleMouseEnter(); - } - else { - this.handleMouseLeave(); - } - } - } - - handleUserInteraction() { - // After the user has interacted with the popup, let the parent know when the document - // is blurred in case it wants to close the frame - document.body.onblur = this.onDocumentBlur.bind(this); - } - - onDocumentBlur() { - document.body.onblur = null; - this.sendMessage('blurred'); - } - - handleHeadlineSelectFocus() { - // The select sometimes gets auto-focused, and we don't want to count those as user interaction - if (this.ignoreHeadlineSelectFocus) { - this.ignoreHeadlineSelectFocus = false; - return; - } - this.handleUserInteraction(); - } - - onHeadlineSelectChange(event) { - if (event.target.value == 'more') { - this.focusTreeOnUpdate = true; - this.setState({ - targetSelectorShown: true - }); - return; - } - - // TODO: Choose recent - this.onTargetChange(event.target.value); - } - - onDisclosureChange() { - var show = !this.state.targetSelectorShown; - if (show) { - this.focusTreeOnUpdate = true; - } - this.setState({ - targetSelectorShown: show - }); - } - - handleDisclosureKeyPress(event) { - if (event.key == 'Enter') { - event.stopPropagation(); - } - } - - onTargetChange(id) { - var target = this.state.targets.find(row => row.id == id); - this.setState({target}); - this.target = target; - this.handleUserInteraction(); - this.sendUpdate(); - } - - handleExpandRows(ids) { - ids = new Set(ids); - this.setState((prevState) => { - return { - targets: [...prevState.targets.map((target) => { - return ids.has(target.id) - ? Object.assign({}, target, { expanded: true }) - : target; - })] - }; - }); - } - - handleCollapseRows(ids) { - ids = new Set(ids); - this.setState((prevState) => { - return { - targets: [...prevState.targets.map((target) => { - return ids.has(target.id) - ? Object.assign({}, target, { expanded: false }) - : target; - })] - }; - }); - } - - handleRowToggle(id) { - this.setState((prevState) => { - return { - targets: [...prevState.targets.map((target) => { - if (target.id != id) return target; - return Object.assign({}, target, { expanded: !target.expanded }); - })] - }; - }); - } - - handleKeyDown(event) { - if (event.key == 'Escape') { - this.handleDone(); - } - // Consider directional navigation of the drop-down equivalent to clicking in the popup - else if (event.target.localName == 'select') { - switch (event.key) { - case 'ArrowUp': - case 'ArrowDown': - case 'Home': - case 'End': - this.sendMessage('mouseenter'); - this.handleUserInteraction(); - break; - } - } - } - - handleKeyPress(event) { - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (event.key == 'Enter') { - this.handleDone(); - } - // Consider keyboard navigation of the drop-down equivalent to clicking in the popup - else { - this.sendMessage('mouseenter'); - this.handleUserInteraction(); - } - } - - onTagsChange(event) { - this.setState({tags: event.target.value}); - this.tags = event.target.value; - } - - onTagsKeyPress(event) { - // Commit tags and close popup on Enter - if (event.which == 13) { - this.sendUpdate(); - this.handleDone(); - } - } - - onTagsFocus() { - this.sendMessage('tagsfocus'); - } - - onTagsBlur() { - this.sendMessage('tagsblur'); - this.sendUpdate(); - } - - handleDone() { - //this.headlineSelectNode.current.focus(); - this.sendMessage('close'); - } - - // - // Render - // - renderHeadline() { - return ( -
    - {this.state.headlineText} - {this.state.targets - ? this.renderHeadlineSelect() - : (this.state.target ? this.renderHeadlineTarget() : "")} -
    - ); - } - - renderHeadlineSelect() { - var rowTargets = [ - this.state.target, - // Show recent targets - ...this.state.targets.filter(t => t.recent && t.id != this.state.target.id) - ]; - if (!this.state.targetSelectorShown) { - rowTargets.push({ - id: "more", - name: this.text.more - }); - } - - return ( - - - - - - : "" - ); - } - - /** - * Container for item progress lines - */ - renderProgress() { - // Sort items by order, and then sort child items under parents - var items = Array.from(this.state.itemProgress.values()); - items.sort((a, b) => a.order - b.order); - var childItems = items.filter(item => item.parentItem); - items = items.filter(item => !item.parentItem); - var newItems = []; - for (let item of items) { - newItems.push(item); - while (childItems.length && item.id == childItems[0].parentItem) { - newItems.push(childItems.shift()); - } - } - items = newItems; - - return ( -
    - {items.map(item => this.renderItem(item))} -
    - ); - } - - /** - * Item progress lines - */ - renderItem(item) { - var itemStyle = Object.assign( - {}, - // Start at 50% opacity - { - opacity: (item.percentage || 0) / 200 + .5 - }, - item.parentItem && { - marginTop: "4px", - marginLeft: "12px" - }, - item.failed && { - opacity: "1", - color: "red" - } - ); - var iconStyle = Object.assign( - {}, - // Indent child items - { - left: `${item.parentItem ? '22' : '12'}px` - }, - item.failed && { - backgroundImage: `url('${Zotero.UI.style.imageBase}cross.png')`, - backgroundPosition: "" - }, - // Use circular indicator for partial progress - item.percentage && item.percentage != 100 && { - backgroundImage: `url('${Zotero.UI.style.imageBase}progress_arcs.png')`, - backgroundPosition: "-" + (Math.round(item.percentage / 100 * this.nArcs) * 16) + "px 0", - backgroundSize: "auto" - }, - // Show item type icon on completion - (!item.failed && (!item.percentage || item.percentage == 100)) && { - backgroundImage: `url('${item.iconSrc}')`, - backgroundPosition: "", - backgroundSize: "contain" - }, - ); - - return ( -
    -
    -
    - {item.title} -
    -
    - ); - } - - renderErrors() { - return ( -
    - {this.state.errors.map((row, index) => this.renderError(row, index))} -
    - ); - } - - renderError(row, index) { - var err = row[0]; - var args = row.slice(1); - - var contents = ""; - - if (err === "translationError") { - let url = "https://www.zotero.org/support/troubleshooting_translator_issues"; - let pageName = Zotero.getString('progressWindow_error_troubleshootingTranslatorIssues'); - let pageLink = `${pageName}`; - let html = { - __html: Zotero.getString("progressWindow_error_translation", pageLink) - }; - contents = ; - } - else if (err === "fallback") { - let t1 = `${args[0]}` - let t2 = `${args[1]}` - let html = { - __html: Zotero.getString('progressWindow_error_fallback', [t1, t2]) - }; - contents = ; - } - else if (err === "noTranslator") { - contents = "No items could be saved because this website " - + "is not supported by any Zotero translator. If Zotero is not open, try opening " - + "it to increase the number of supported sites."; - } - else if (err === "collectionNotEditable") { - contents = "The currently selected collection is not editable. " - + "Please select a different collection in Zotero."; - } - else if (err === "clientRequired") { - contents = "This item could not be saved because Zotero is not open or is unreachable. " - + "Please open Zotero and try again."; - } - else if (err === "upgradeClient") { - let clientName = ZOTERO_CONFIG.CLIENT_NAME; - let url = ZOTERO_CONFIG.CLIENT_DOWNLOAD_URL; - let pageName = Zotero.getString('progressWindow_error_upgradeClient_latestVersion'); - let pageLink = `${pageName}`; - let html = { - __html: Zotero.getString("progressWindow_error_upgradeClient", [clientName, pageLink]) - }; - contents = ; - } - else if (err === "siteAccessLimits") { - const translator = `${args[0]}`; - const siteAccessURL = "https://www.zotero.org/support/kb/site_access_limits"; - const siteAccessTitle = Zotero.getString('progressWindow_error_siteAccessLimits'); - let siteAccessLink = `${siteAccessTitle}`; - let html = { - __html: Zotero.getString("progressWindow_error_siteAccessLimitsError", [translator, siteAccessLink]) - }; - contents = ; - } - else if (err === "unexpectedError") { - let url = "https://www.zotero.org/support/getting_help"; - contents = - An error occurred while saving this item. Try again, and if the issue persists - see Getting Help for more information. - ; - } - - return ( -
    - {contents} -
    - ); - } - - render() { - return ( -
    {this.rootNode = el}} - className="ProgressWindow-box" - onMouseEnter={this.handleMouseEnter} - onMouseLeave={this.handleMouseLeave} - onClick={this.handleUserInteraction} - onKeyDown={this.handleKeyDown} - onKeyPress={this.handleKeyPress}> - {this.renderHeadline()} - {this.renderTargetSelector()} - {this.renderProgress()} - {this.renderErrors()} -
    - ); - } -} - - -class TargetIcon extends React.Component { - render() { - var image = this.props.type == 'library' - ? "treesource-library.png" - : "treesource-collection.png"; - var style = { - backgroundImage: `url('${Zotero.UI.style.imageBase}${image}')` - }; - return
    ; - } -} - - -class TargetTree extends React.Component { - static propTypes = { - rows: PropTypes.object.isRequired, - focused: PropTypes.object, - onExpandRows: PropTypes.func.isRequired, - onCollapseRows: PropTypes.func.isRequired, - onRowToggle: PropTypes.func.isRequired, - onRowFocus: PropTypes.func.isRequired, - onKeyPress: PropTypes.func - }; - - constructor(props) { - super(props); - } - - static getDerivedStateFromProps(nextProps) { - return { - expanded: new Set(nextProps.rows.filter(row => row.expanded).map(t => t.id)) - }; - } - - getRoots() { - return this.props.rows.filter(row => !row.level); - } - - getChildren(id) { - var rows = this.props.rows; - var pos = rows.findIndex(row => row.id == id); - var row = rows[pos]; - var level = row.level || 0; - var children = []; - while (rows[++pos] && rows[pos].level > level) { - if (rows[pos].level == level + 1) { - children.push(rows[pos]); - } - } - return children; - } - - itemIsExpanded(id) { - return this.state.expanded.has(id); - } - - handleRowFocus(item) { - if (!item) { - return; - } - this.props.onRowFocus(item.id); - } - - handleKeyPress(event) { - if (!event.altKey && !event.ctrlKey && !event.metaKey) { - // Collapse/expand current library on "-" or "+" - if (event.key == '-') { - this.collapseCurrentLibrary(); - } - else if (event.key == '+') { - this.expandCurrentLibrary(); - } - else { - // TODO: Find-as-you-type navigation - } - } - - if (this.props.onKeyPress) { - this.props.onKeyPress(event); - } - } - - collapseCurrentLibrary() { - var focused = this.props.focused; - var pos = this.props.rows.findIndex(row => row.id == focused.id); - var collapse = []; - // First find the last row in the library - while (pos + 1 < this.props.rows.length) { - pos++; - let current = this.props.rows[pos].id; - // If we hit another library, go back one - if (getTargetType(current) == 'library') { - pos--; - break; - } - } - - while (true) { - if (pos == -1) break; - let current = this.props.rows[pos]; - collapse.push(current.id); - // When we reach a library, select it and stop - if (getTargetType(current.id) == 'library') { - this.props.onRowFocus(current.id); - break; - } - pos--; - } - this.props.onCollapseRows(collapse); - } - - - expandCurrentLibrary() { - var focused = this.props.focused; - var pos = this.props.rows.findIndex(row => row.id == focused.id); - var expand = []; - // First find the library row - while (pos >= 0) { - let current = this.props.rows[pos].id; - if (getTargetType(current) == 'library') { - break; - } - pos--; - } - var libraryID = this.props.rows[pos].id; - - while (true) { - if (pos == this.props.rows.length) break; - let current = this.props.rows[pos]; - // When we reach another library, select it and stop - if (getTargetType(current.id) == 'library' && current.id != libraryID) { - break; - } - // If the next row exists, isn't a library, and is one level higher, expand this row - let next = this.props.rows[pos + 1]; - if (next && getTargetType(next.id) != 'library' && next.level > current.level) { - expand.push(current.id); - } - pos++; - } - this.props.onExpandRows(expand); - } - - - render() { - return React.createElement( - Tree, - { - onKeyPress: event => this.handleKeyPress(event), - - itemHeight: 20, // px - - getRoots: () => this.getRoots(), - getKey: item => item.id, - getParent: item => getParent(this.props.rows, item.id), - getChildren: item => this.getChildren(item.id), - isExpanded: item => this.itemIsExpanded(item.id), - - renderItem: (item, depth, isFocused, arrow, isExpanded) => { - let className = ""; - if (isFocused) { - className += "focused"; - } - - return ( -
    - {/* Add toggle on arrow click, since we disabled it in tree.js for - clicking on the row itself. If the tree is updated to have less - annoying behavior, this can be reverted. */} - this.props.onRowToggle(item.id)}>{arrow} - - {item.name} -
    - ); - }, - - focused: this.props.focused, - - onFocus: item => this.handleRowFocus(item), - onExpand: item => this.props.onExpandRows([item.id]), - onCollapse: item => this.props.onCollapseRows([item.id]), - - autoExpandAll: false, - autoExpandDepth: 0 - } - ); - } -} diff --git a/zotero-connectors/src/common/ui/tree/tree.js b/zotero-connectors/src/common/ui/tree/tree.js deleted file mode 100644 index 5b609203..00000000 --- a/zotero-connectors/src/common/ui/tree/tree.js +++ /dev/null @@ -1,820 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Modified by Zotero -- skip dependencies that are included externally -//import React from "react"; -const { Component, createFactory, createElement } = React; -//import dom from "react-dom-factories"; -const dom = ReactDOMFactories; -//import PropTypes from "prop-types"; -//import InlineSVG from "svg-inline-react"; -//import svgArrow from "./images/arrow.svg"; - -//require("./tree.css"); - -const AUTO_EXPAND_DEPTH = 0; // depth - -/** - * An arrow that displays whether its node is expanded (▼) or collapsed - * (▶). When its node has no children, it is hidden. - */ -class ArrowExpander extends Component { - static get propTypes() { - return { - expanded: PropTypes.bool, - }; - } - - shouldComponentUpdate(nextProps, nextState) { - return this.props.expanded !== nextProps.expanded; - } - - render() { - const { - expanded, - } = this.props; - - const classNames = ["arrow"]; - if (expanded) { - classNames.push("expanded"); - } - // Modified by Zotero - // - //return createElement(InlineSVG, { - // className: classNames.join(" "), - // src: svgArrow - //}); - // Inline the SVG to avoid needing svg-inline-react - var svg = { - __html: '' - }; - return createElement('span', { - className: classNames.join(" "), - dangerouslySetInnerHTML: svg - }); - } -} - -const treeIndent = dom.span({className: "tree-indent"}, "\u200B"); - -class TreeNode extends Component { - static get propTypes() { - return { - id: PropTypes.any.isRequired, - index: PropTypes.number.isRequired, - depth: PropTypes.number.isRequired, - focused: PropTypes.bool.isRequired, - expanded: PropTypes.bool.isRequired, - item: PropTypes.any.isRequired, - isExpandable: PropTypes.bool.isRequired, - onClick: PropTypes.func, - renderItem: PropTypes.func.isRequired, - }; - } - - shouldComponentUpdate(nextProps) { - return this.props.item !== nextProps.item || - this.props.focused !== nextProps.focused || - this.props.expanded !== nextProps.expanded; - } - - render() { - const { - depth, - id, - item, - focused, - expanded, - renderItem, - isExpandable, - } = this.props; - - const arrow = isExpandable - ? ArrowExpanderFactory({ - item, - expanded, - }) - : null; - - let ariaExpanded; - if (this.props.isExpandable) { - ariaExpanded = false; - } - if (this.props.expanded) { - ariaExpanded = true; - } - - const indents = Array.from({length: depth}).fill(treeIndent); - let items = indents.concat(renderItem(item, depth, focused, arrow, expanded)); - - return dom.div( - { - id, - className: "tree-node" + (focused ? " focused" : ""), - onClick: this.props.onClick, - role: "treeitem", - "aria-level": depth, - "aria-expanded": ariaExpanded, - "data-expandable": this.props.isExpandable - }, - ...items - ); - } -} - -const ArrowExpanderFactory = createFactory(ArrowExpander); -const TreeNodeFactory = createFactory(TreeNode); - -/** - * Create a function that calls the given function `fn` only once per animation - * frame. - * - * @param {Function} fn - * @returns {Function} - */ -function oncePerAnimationFrame(fn) { - let animationId = null; - let argsToPass = null; - return function (...args) { - argsToPass = args; - if (animationId !== null) { - return; - } - - animationId = requestAnimationFrame(() => { - fn.call(this, ...argsToPass); - animationId = null; - argsToPass = null; - }); - }; -} - -/** - * A generic tree component. See propTypes for the public API. - * - * This tree component doesn't make any assumptions about the structure of your - * tree data. Whether children are computed on demand, or stored in an array in - * the parent's `_children` property, it doesn't matter. We only require the - * implementation of `getChildren`, `getRoots`, `getParent`, and `isExpanded` - * functions. - * - * This tree component is well tested and reliable. See the tests in ./tests - * and its usage in the performance and memory panels in mozilla-central. - * - * This tree component doesn't make any assumptions about how to render items in - * the tree. You provide a `renderItem` function, and this component will ensure - * that only those items whose parents are expanded and which are visible in the - * viewport are rendered. The `renderItem` function could render the items as a - * "traditional" tree or as rows in a table or anything else. It doesn't - * restrict you to only one certain kind of tree. - * - * The tree comes with basic styling for the indent, the arrow, as well as hovered - * and focused styles which can be override in CSS. - * - * ### Example Usage - * - * Suppose we have some tree data where each item has this form: - * - * { - * id: Number, - * label: String, - * parent: Item or null, - * children: Array of child items, - * expanded: bool, - * } - * - * Here is how we could render that data with this component: - * - * class MyTree extends Component { - * static get propTypes() { - * // The root item of the tree, with the form described above. - * return { - * root: PropTypes.object.isRequired - * }; - * }, - * - * render() { - * return Tree({ - * itemHeight: 20, // px - * - * getRoots: () => [this.props.root], - * - * getParent: item => item.parent, - * getChildren: item => item.children, - * getKey: item => item.id, - * isExpanded: item => item.expanded, - * - * renderItem: (item, depth, isFocused, arrow, isExpanded) => { - * let className = "my-tree-item"; - * if (isFocused) { - * className += " focused"; - * } - * return dom.div({ - * className, - * }, - * arrow, - * // And here is the label for this item. - * dom.span({ className: "my-tree-item-label" }, item.label) - * ); - * }, - * - * onExpand: item => dispatchExpandActionToRedux(item), - * onCollapse: item => dispatchCollapseActionToRedux(item), - * }); - * } - * } - */ -class Tree extends Component { - static get propTypes() { - return { - // Required props - - // A function to get an item's parent, or null if it is a root. - // - // Type: getParent(item: Item) -> Maybe - // - // Example: - // - // // The parent of this item is stored in its `parent` property. - // getParent: item => item.parent - getParent: PropTypes.func.isRequired, - - // A function to get an item's children. - // - // Type: getChildren(item: Item) -> [Item] - // - // Example: - // - // // This item's children are stored in its `children` property. - // getChildren: item => item.children - getChildren: PropTypes.func.isRequired, - - // A function which takes an item and ArrowExpander component instance and - // returns a component, or text, or anything else that React considers - // renderable. - // - // Type: renderItem(item: Item, - // depth: Number, - // isFocused: Boolean, - // arrow: ReactComponent, - // isExpanded: Boolean) -> ReactRenderable - // - // Example: - // - // renderItem: (item, depth, isFocused, arrow, isExpanded) => { - // let className = "my-tree-item"; - // if (isFocused) { - // className += " focused"; - // } - // return dom.div( - // { - // className, - // style: { marginLeft: depth * 10 + "px" } - // }, - // arrow, - // dom.span({ className: "my-tree-item-label" }, item.label) - // ); - // }, - renderItem: PropTypes.func.isRequired, - - // A function which returns the roots of the tree (forest). - // - // Type: getRoots() -> [Item] - // - // Example: - // - // // In this case, we only have one top level, root item. You could - // // return multiple items if you have many top level items in your - // // tree. - // getRoots: () => [this.props.rootOfMyTree] - getRoots: PropTypes.func.isRequired, - - // A function to get a unique key for the given item. This helps speed up - // React's rendering a *TON*. - // - // Type: getKey(item: Item) -> String - // - // Example: - // - // getKey: item => `my-tree-item-${item.uniqueId}` - getKey: PropTypes.func.isRequired, - - // A function to get whether an item is expanded or not. If an item is not - // expanded, then it must be collapsed. - // - // Type: isExpanded(item: Item) -> Boolean - // - // Example: - // - // isExpanded: item => item.expanded, - isExpanded: PropTypes.func.isRequired, - - // Optional props - - // The currently focused item, if any such item exists. - focused: PropTypes.any, - - // Handle when a new item is focused. - onFocus: PropTypes.func, - - // The depth to which we should automatically expand new items. - autoExpandDepth: PropTypes.number, - // Should auto expand all new items or just the new items under the first - // root item. - autoExpandAll: PropTypes.bool, - - // Note: the two properties below are mutually exclusive. Only one of the - // label properties is necessary. - // ID of an element whose textual content serves as an accessible label for - // a tree. - labelledby: PropTypes.string, - // Accessibility label for a tree widget. - label: PropTypes.string, - - // Optional event handlers for when items are expanded or collapsed. Useful - // for dispatching redux events and updating application state, maybe lazily - // loading subtrees from a worker, etc. - // - // Type: - // onExpand(item: Item) - // onCollapse(item: Item) - // - // Example: - // - // onExpand: item => dispatchExpandActionToRedux(item) - onExpand: PropTypes.func, - onCollapse: PropTypes.func, - isExpandable: PropTypes.func, - // Additional classes to add to the root element. - className: PropTypes.string, - // style object to be applied to the root element. - style: PropTypes.object, - }; - } - - static get defaultProps() { - return { - autoExpandDepth: AUTO_EXPAND_DEPTH, - autoExpandAll: true - }; - } - - constructor(props) { - super(props); - - this.state = { - seen: new Set(), - }; - - this._onExpand = oncePerAnimationFrame(this._onExpand).bind(this); - this._onCollapse = oncePerAnimationFrame(this._onCollapse).bind(this); - this._focusPrevNode = oncePerAnimationFrame(this._focusPrevNode).bind(this); - this._focusNextNode = oncePerAnimationFrame(this._focusNextNode).bind(this); - this._focusParentNode = oncePerAnimationFrame(this._focusParentNode).bind(this); - - this._autoExpand = this._autoExpand.bind(this); - this._preventArrowKeyScrolling = this._preventArrowKeyScrolling.bind(this); - this._dfs = this._dfs.bind(this); - this._dfsFromRoots = this._dfsFromRoots.bind(this); - this._focus = this._focus.bind(this); - this._scrollNodeIntoView = this._scrollNodeIntoView.bind(this); - this._onBlur = this._onBlur.bind(this); - this._onKeyDown = this._onKeyDown.bind(this); - this._nodeIsExpandable = this._nodeIsExpandable.bind(this); - } - - componentDidMount() { - this._autoExpand(); - if (this.props.focused) { - this._scrollNodeIntoView(this.props.focused); - } - } - - componentWillReceiveProps(nextProps) { - this._autoExpand(); - } - - componentDidUpdate(prevProps, prevState) { - if (prevProps.focused !== this.props.focused) { - this._scrollNodeIntoView(this.props.focused); - } - } - - _autoExpand() { - if (!this.props.autoExpandDepth) { - return; - } - - // Automatically expand the first autoExpandDepth levels for new items. Do - // not use the usual DFS infrastructure because we don't want to ignore - // collapsed nodes. - const autoExpand = (item, currentDepth) => { - if (currentDepth >= this.props.autoExpandDepth || - this.state.seen.has(item)) { - return; - } - - this.props.onExpand(item); - this.state.seen.add(item); - - const children = this.props.getChildren(item); - const length = children.length; - for (let i = 0; i < length; i++) { - autoExpand(children[i], currentDepth + 1); - } - }; - - const roots = this.props.getRoots(); - const length = roots.length; - if (this.props.autoExpandAll) { - for (let i = 0; i < length; i++) { - autoExpand(roots[i], 0); - } - } else if (length != 0) { - autoExpand(roots[0], 0); - } - } - - _preventArrowKeyScrolling(e) { - switch (e.key) { - case "ArrowUp": - case "ArrowDown": - case "ArrowLeft": - case "ArrowRight": - e.preventDefault(); - e.stopPropagation(); - if (e.nativeEvent) { - if (e.nativeEvent.preventDefault) { - e.nativeEvent.preventDefault(); - } - if (e.nativeEvent.stopPropagation) { - e.nativeEvent.stopPropagation(); - } - } - } - } - - /** - * Perform a pre-order depth-first search from item. - */ - _dfs(item, maxDepth = Infinity, traversal = [], _depth = 0) { - traversal.push({ item, depth: _depth }); - - if (!this.props.isExpanded(item)) { - return traversal; - } - - const nextDepth = _depth + 1; - - if (nextDepth > maxDepth) { - return traversal; - } - - const children = this.props.getChildren(item); - const length = children.length; - for (let i = 0; i < length; i++) { - this._dfs(children[i], maxDepth, traversal, nextDepth); - } - - return traversal; - } - - /** - * Perform a pre-order depth-first search over the whole forest. - */ - _dfsFromRoots(maxDepth = Infinity) { - const traversal = []; - - const roots = this.props.getRoots(); - const length = roots.length; - for (let i = 0; i < length; i++) { - this._dfs(roots[i], maxDepth, traversal); - } - - return traversal; - } - - /** - * Expands current row. - * - * @param {Object} item - * @param {Boolean} expandAllChildren - */ - _onExpand(item, expandAllChildren) { - if (this.props.onExpand) { - this.props.onExpand(item); - - if (expandAllChildren) { - const children = this._dfs(item); - const length = children.length; - for (let i = 0; i < length; i++) { - this.props.onExpand(children[i].item); - } - } - } - } - - /** - * Collapses current row. - * - * @param {Object} item - */ - _onCollapse(item) { - if (this.props.onCollapse) { - this.props.onCollapse(item); - } - } - - /** - * Sets the passed in item to be the focused item. - * - * @param {Object|undefined} item - * The item to be focused, or undefined to focus no item. - * - * @param {Object|undefined} options - * An options object which can contain: - * - dir: "up" or "down" to indicate if we should scroll the element to the - * top or the bottom of the scrollable container when the element is - * off canvas. - */ - _focus(item, options) { - this._scrollNodeIntoView(item, options); - if (this.props.onFocus) { - this.props.onFocus(item); - } - } - - /** - * Sets the passed in item to be the focused item. - * - * @param {Object|undefined} item - * The item to be scrolled to. - * - * @param {Object|undefined} options - * An options object which can contain: - * - dir: "up" or "down" to indicate if we should scroll the element to the - * top or the bottom of the scrollable container when the element is - * off canvas. - */ - _scrollNodeIntoView(item, options = {}) { - if (item !== undefined) { - const treeElement = this.treeRef; - const element = document.getElementById(this.props.getKey(item)); - if (element) { - const {top, bottom} = element.getBoundingClientRect(); - const closestScrolledParent = node => { - if (node == null) { - return null; - } - - if (node.scrollHeight > node.clientHeight) { - return node; - } - return closestScrolledParent(node.parentNode); - }; - const scrolledParent = closestScrolledParent(treeElement); - // Modified by Zotero to work when the scrolled parent isn't at the top of the page. - // Previously this used 0 and clientHeight. - var scrolledParentTop = 0; - var scrolledParentBottom = 0; - if (scrolledParent) { - scrolledParentTop = scrolledParent.getBoundingClientRect().top; - scrolledParentBottom = scrolledParent.getBoundingClientRect().bottom; - } - const isVisible = !scrolledParent - || ( - top >= scrolledParentTop - && bottom <= scrolledParentBottom - ); - - if (!isVisible) { - let scrollToTop = - (!options.alignTo && top < scrolledParentTop) - || options.alignTo === "top"; - element.scrollIntoView(scrollToTop); - } - } - } - } - - /** - * Sets the state to have no focused item. - */ - _onBlur() { - this._focus(undefined); - } - - /** - * Handles key down events in the tree's container. - * - * @param {Event} e - */ - _onKeyDown(e) { - if (this.props.focused == null) { - return; - } - - // Allow parent nodes to use navigation arrows with modifiers. - if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) { - return; - } - - this._preventArrowKeyScrolling(e); - - switch (e.key) { - case "ArrowUp": - this._focusPrevNode(); - return; - - case "ArrowDown": - this._focusNextNode(); - return; - - case "ArrowLeft": - if (this.props.isExpanded(this.props.focused) - && this._nodeIsExpandable(this.props.focused)) { - this._onCollapse(this.props.focused); - } else { - this._focusParentNode(); - } - return; - - case "ArrowRight": - if (this._nodeIsExpandable(this.props.focused) - && !this.props.isExpanded(this.props.focused)) { - this._onExpand(this.props.focused); - } else { - this._focusNextNode(); - } - } - } - - /** - * Sets the previous node relative to the currently focused item, to focused. - */ - _focusPrevNode() { - // Start a depth first search and keep going until we reach the currently - // focused node. Focus the previous node in the DFS, if it exists. If it - // doesn't exist, we're at the first node already. - - let prev; - - const traversal = this._dfsFromRoots(); - const length = traversal.length; - for (let i = 0; i < length; i++) { - const item = traversal[i].item; - if (item === this.props.focused) { - break; - } - prev = item; - } - if (prev === undefined) { - return; - } - - this._focus(prev, {alignTo: "top"}); - } - - /** - * Handles the down arrow key which will focus either the next child - * or sibling row. - */ - _focusNextNode() { - // Start a depth first search and keep going until we reach the currently - // focused node. Focus the next node in the DFS, if it exists. If it - // doesn't exist, we're at the last node already. - const traversal = this._dfsFromRoots(); - const length = traversal.length; - let i = 0; - - while (i < length) { - if (traversal[i].item === this.props.focused) { - break; - } - i++; - } - - if (i + 1 < traversal.length) { - this._focus(traversal[i + 1].item, {alignTo: "bottom"}); - } - } - - /** - * Handles the left arrow key, going back up to the current rows' - * parent row. - */ - _focusParentNode() { - const parent = this.props.getParent(this.props.focused); - if (!parent) { - this._focusPrevNode(this.props.focused); - return; - } - - const traversal = this._dfsFromRoots(); - const length = traversal.length; - let parentIndex = 0; - for (; parentIndex < length; parentIndex++) { - if (traversal[parentIndex].item === parent) { - break; - } - } - - this._focus(parent, {alignTo: "top"}); - } - - _nodeIsExpandable(item) { - return this.props.isExpandable - ? this.props.isExpandable(item) - : !!this.props.getChildren(item).length; - } - - render() { - const traversal = this._dfsFromRoots(); - const { - focused, - } = this.props; - - const nodes = traversal.map((v, i) => { - const { item, depth } = traversal[i]; - const key = this.props.getKey(item, i); - return TreeNodeFactory({ - key, - id: key, - index: i, - item, - depth, - renderItem: this.props.renderItem, - focused: focused === item, - expanded: this.props.isExpanded(item), - isExpandable: this._nodeIsExpandable(item), - onExpand: this._onExpand, - onCollapse: this._onCollapse, - onClick: (e) => { - this._focus(item); - // Modified by Zotero - // - // Don't toggle row open state on click -- instead, toggle on arrow click in - // ProgressWindow.jsx - /*if (this.props.isExpanded(item)) { - this.props.onCollapse(item); - } else { - this.props.onExpand(item, e.altKey); - }*/ - }, - }); - }); - - const style = Object.assign({}, this.props.style || {}, { - padding: 0, - margin: 0 - }); - - return dom.div( - { - className: `tree ${this.props.className ? this.props.className : ""}`, - ref: el => { - this.treeRef = el; - }, - role: "tree", - tabIndex: "0", - onKeyDown: this._onKeyDown, - onKeyPress: (event) => { - this._preventArrowKeyScrolling(event); - - // Added by Zotero - if (this.props.onKeyPress) { - this.props.onKeyPress(event); - } - }, - onKeyUp: this._preventArrowKeyScrolling, - onFocus: ({nativeEvent}) => { - if (focused || !nativeEvent || !this.treeRef) { - return; - } - - let { explicitOriginalTarget } = nativeEvent; - // Only set default focus to the first tree node if the focus came - // from outside the tree (e.g. by tabbing to the tree from other - // external elements). - if (explicitOriginalTarget !== this.treeRef && - !this.treeRef.contains(explicitOriginalTarget)) { - this._focus(traversal[0].item); - } - }, - onBlur: this._onBlur, - onClick: () => { - // Focus should always remain on the tree container itself. - this.treeRef.focus(); - }, - "aria-label": this.props.label, - "aria-labelledby": this.props.labelledby, - "aria-activedescendant": focused && this.props.getKey(focused), - style, - }, - nodes - ); - } -} - -//export default Tree; diff --git a/zotero-connectors/src/common/utilities.js b/zotero-connectors/src/common/utilities.js deleted file mode 100644 index f7624fc0..00000000 --- a/zotero-connectors/src/common/utilities.js +++ /dev/null @@ -1,57 +0,0 @@ - - /* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(function() { - -"use strict"; - -Zotero.Utilities = Zotero.Utilities || {}; - -Zotero.Utilities.kbEventToShortcutString = function(e) { - const keymap = [ - ['ctrlKey', 'Ctrl+'], - ['shiftKey', 'Shift+'], - ['altKey', 'Alt+'], - ['metaKey', '⌘'], - ]; - let val= ""; - for (let [key, value] of keymap) { - if (e[key]) { - val += value; - } - } - val += e.key.length == 1 ? e.key.toUpperCase() : ''; - return val; -} - -if (!Zotero.Utilities.Internal) { - Zotero.Utilities.Internal = {}; -} -Zotero.Utilities.Internal.filterStack = function (stack) { - return stack; -} - -})(); \ No newline at end of file diff --git a/zotero-connectors/src/common/zotero.js b/zotero-connectors/src/common/zotero.js deleted file mode 100644 index 906e156b..00000000 --- a/zotero-connectors/src/common/zotero.js +++ /dev/null @@ -1,534 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -var Zotero = window.Zotero = new function() { - this.version = "5.0"; - this.locale = navigator.languages[0]; - this.isConnector = true; - this.isFx = false; // Old flag for 4.0 connector, probably not used anymore - /* this.isBookmarklet = SET IN BUILD SCRIPT */; - /* this.allowRepoTranslatorTester = SET IN BUILD SCRIPT */; - - this.initialized = false; - this.initDeferred = {}; - this.initDeferred.promise = new Promise(function(resolve, reject) { - this.initDeferred.resolve = resolve; - this.initDeferred.reject = reject; - }.bind(this)); - - // Safari global page detection - if (typeof globalThis != "undefined" && typeof browser == "undefined") { - this.isSafari = true; - this.isMac = true; - } else { - // Browser check adopted from: - // http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - // Internet Explorer 6-11 - this.isIE = /*@cc_on!@*/false || !!document.documentMode;; - if (this.isBookmarklet) { - // Firefox 1.0+ - this.isFirefox = typeof InstallTrigger !== 'undefined'; - // Edge 20+ - this.isEdge = !this.isIE && !!window.StyleMedia; - // Chrome and Chromium - this.isChrome = window.navigator.userAgent.indexOf("Chrome") !== -1 || window.navigator.userAgent.indexOf("Chromium") !== -1; - // At least Safari 10+ - this.isSafari = window.navigator.userAgent.includes("Safari") && !this.isChrome; - this.isBrowserExt = this.isFirefox || this.isEdge || this.isChrome; - - this.isMac = (window.navigator.platform.substr(0, 3) == "Mac"); - this.isWin = (window.navigator.platform.substr(0, 3) == "Win"); - this.isLinux = (window.navigator.platform.substr(0, 5) == "Linux"); - } else { - /* this.isFirefox = SET IN BUILD SCRIPT */; - /* this.isSafari = SET IN BUILD SCRIPT */; - // CHANGED: We are a browser extension, no question - this.isBrowserExt = true; - - this.isChrome = this.isEdge = false; - if (this.isBrowserExt && !this.isFirefox) { - if (window.navigator.userAgent.includes("Edg/")) { - this.isEdge = true; - } else { - // If browser ext is not fx or edge then treat it as Chrome - // since it's probably installed with compatible browsers such as Opera from the - // Chrome extension store - this.isChrome = true; - } - } - } - - this.isMac = (window.navigator.platform.substr(0, 3) == "Mac"); - this.isWin = (window.navigator.platform.substr(0, 3) == "Win"); - this.isLinux = (window.navigator.platform.substr(0, 5) == "Linux"); - } - - if (this.isFirefox) { - this.browser = "g"; - this.clientName = 'Firefox'; - } else if (this.isSafari) { - this.browser = "s"; - this.clientName = 'Safari'; - } else if (this.isIE) { - this.browser = "i"; - this.clientName = 'Internet Explorer'; // ? - } else if (this.isEdge) { - this.browser = "c"; - this.clientName = 'Edge'; - } else if (this.isChrome) { - this.browser = "c"; - this.clientName = 'Chrome'; - } else { - // Assume this is something with no more capabilities than IE - this.browser = "i"; - this.clientName = window.navigator.appName; - } - this.appName = `${ZOTERO_CONFIG.CLIENT_NAME} Connector for ${this.clientName}`; - - if (!this.isBookmarklet) { - if (this.isBrowserExt) { - // CHANGED: Version hard coded (not sure why) - this.version = "5.0.0"; - } - } - - // window.Promise and Promise differ (somehow) in Firefox and when certain - // async promise resolution conditions arise upon calling Zotero.Promise.all().then(result => ) - // somehow the result array doesn't properly have result[1] bound, even though - // Array.from(result)[1] is there. Magic of code. - // this.Promise = window.Promise; - this.Promise = Promise; - - this.migrate = async function() { - let lastVersion = Zotero.Prefs.get('lastVersion') || Zotero.version; - var [major, minor, patch] = lastVersion.split('.'); - Zotero.Prefs.set('lastVersion', Zotero.version); - // If coming from a version before 5.0.24, reset the - // auto-associate setting for all existing proxies, since it wasn't being set properly for - // proxies imported from the client - if (major == 5 && minor == 0 && patch < 24 && Zotero.Prefs.get('proxies.clientChecked')) { - for (let proxy of Zotero.Proxies.proxies) { - proxy.autoAssociate = true; - } - Zotero.Proxies.storeProxies(); - } - if (major == 5 && minor == 0 && patch < 32 && Zotero.Proxies.proxies.length > 1) { - let pairs = []; - // merge pairs of proxies with http and https protocols - for (let i = 0; i < Zotero.Proxies.proxies.length; i++) { - if (Zotero.Proxies.length == i + 1) break; - let proxy1 = Zotero.Proxies.proxies[i]; - let scheme = proxy1.scheme.replace('https', '').replace('http', ''); - for (let j = i + 1; j < Zotero.Proxies.proxies.length; j++) { - let proxy2 = Zotero.Proxies.proxies[j]; - if (scheme == proxy2.scheme.replace('https', '').replace('http', '')) { - pairs.push([proxy1, proxy2]); - break; - } - } - } - for (let [proxy1, proxy2] of pairs) { - let json = proxy1.toJSON(); - delete json.id; - let proxy = new Zotero.Proxy(json); - proxy.dotsToHyphens = true; - proxy.hosts = proxy1.hosts.concat(proxy2.hosts); - proxy.scheme = proxy.scheme.replace('http://', '').replace('https://', ''); - Zotero.Proxies.remove(proxy1); - Zotero.Proxies.remove(proxy2); - Zotero.Proxies.save(proxy); - } - // remove protocols of single protocolless - for (let proxy of Zotero.Proxies.proxies) { - if (proxy.scheme.includes('://')) { - proxy.scheme = proxy.scheme.substr(proxy.scheme.indexOf('://') + 3); - proxy.compileRegexp(); - Zotero.Proxies.save(proxy); - } - } - } - // Botched dotsToHyphen pref migration to protocolless schemes in 5.0.32 - if (major == 5 && minor == 0 && patch < 35) { - for (let proxy of Zotero.Proxies.proxies) { - if (proxy.scheme.indexOf('%h') == 0) { - proxy.dotsToHyphens = true; - } - } - Zotero.Proxies.storeProxies(); - } - // Skip first-use dialog for existing users when enabled for non-Firefox browsers - if (major == 5 && minor == 0 && patch < 87 && !this.isFirefox) { - Zotero.Prefs.set('firstUse', false); - } - }; - - /** - * Initializes Zotero services for the global page in Chrome or Safari - */ - this.initGlobal = async function() { - Zotero.isBackground = true; - - if (Zotero.isBrowserExt) { - browser.runtime.getPlatformInfo().then(function(info) { - switch (info.os) { - case 'mac': - case 'win': - this.platform = info.os; - break; - - default: - this.platform = 'unix'; - } - }.bind(this)); - } else if (Zotero.isSafari) { - this.platform = 'mac'; - } else { - // IE and the likes? Who knows - this.platform = 'win'; - } - - // Add browser version info - if (this.isFirefox) { - browser.runtime.getBrowserInfo().then(info => { - this.browserVersion = info.version; - this.browserMajorVersion = parseInt(info.version.match(/^[0-9]+/)[0]); - }); - } - - Zotero.Messaging.init(); - if (Zotero.isSafari) { - this.version = await Zotero.Connector_Browser.getExtensionVersion(); - window.safari = { - extension: { - baseURI: await Zotero.Messaging.sendMessage('Swift.getBaseURI') - } - }; - } - Zotero.Connector_Types.init(); - await Zotero.Prefs.init(); - - Zotero.Debug.init(); - if (Zotero.isBrowserExt) { - Zotero.WebRequestIntercept.init(); - } - if (!Zotero.isBookmarklet) { - await Zotero.i18n.init(); - Zotero.Repo.init(); - Zotero.Proxies.init(); - } - if (Zotero.isBrowserExt) { - await Zotero.GoogleDocsPluginManager.init(); - } - let xhr = await Zotero.HTTP.request('GET', Zotero.getExtensionURL('utilities/resource/dateFormats.json'), { responseType: 'json' }); - Zotero.Date.init(xhr.response); - Zotero.initDeferred.resolve(); - Zotero.initialized = true; - - await Zotero.migrate(); - }; - - /** - * Initializes Zotero services for injected pages and the inject side of the bookmarklet - */ - this.initInject = async function() { - Zotero.isInject = true; - Zotero.Messaging.init(); - if (Zotero.isSafari) { - await Zotero.i18n.init(); - } - if (!Zotero.isBookmarklet) { - //Zotero.ConnectorIntegration.init(); - } - Zotero.Connector_Types.init(); - Zotero.Schema.init(); - let xhr = await Zotero.HTTP.request('GET', Zotero.getExtensionURL('utilities/resource/dateFormats.json'), { responseType: 'json' }); - Zotero.Date.init(xhr.response); - Zotero.Prefs.loadNamespace(['translators.', 'downloadAssociatedFiles', 'automaticSnapshots', - 'reportTranslationFailure', 'capitalizeTitles' - ]); - await Zotero.Prefs.loadNamespace('debug'); - - Zotero.Debug.init(); - Zotero.initDeferred.resolve(); - Zotero.initialized = true; - }; - - - /** - * Get versions, platform, etc. - */ - this.getSystemInfo = async function() { - var info; - if (Zotero.isSafari && Zotero.isBackground) { - info = { - connector: "true", - version: this.version, - platform: "Safari App Extension", - }; - } else { - info = { - connector: "true", - version: this.version, - platform: navigator.platform, - locale: navigator.language, - userAgent: navigator.userAgent - }; - } - - info.appName = Zotero.appName; - info.zoteroAvailable = !!(await Zotero.Connector.checkIsOnline()); - - var str = ''; - for (var key in info) { - str += key + ' => ' + info[key] + ', '; - } - if (Zotero.isBackground && Zotero.isChrome) { - let granted = await browser.permissions.contains({ - permissions: ['management'] - }); - if (granted) { - str += 'extensions => '; - let extensions = await browser.management.getAll(); - for (let extension of extensions) { - if (!extension.enabled || extension.name == Zotero.appName) continue; - str += `${extension.name} (${extension.version}, ${extension.type}), `; - } - } - } - str = str.substr(0, str.length - 2); - return str; - }; - - /** - * Writes a line to the debug console - */ - this.debug = function(message, level) { - Zotero.Debug.log(message, level); - }; - - this.logError = function(err) { - if (!window.console) return; - - // Firefox uses this - var fileName = (err.fileName ? err.fileName : null); - var lineNumber = (err.lineNumber ? err.lineNumber : null); - - // Safari uses this - if (!fileName && err.sourceURL) fileName = err.sourceURL; - if (!lineNumber && err.line) lineNumber = err.line; - - // Chrome only gives a stack - if (!fileName && !lineNumber && err.stack) { - const stackRe = /^\s+at (?:[^(\n]* \()?([^\n]*):([0-9]+):([0-9]+)\)?$/m; - var m = stackRe.exec(err.stack); - if (m) { - fileName = m[1]; - lineNumber = m[2]; - } - } - - if (!fileName && !lineNumber && Zotero.isIE && typeof err === "object") { - // IE can give us a line number if we re-throw the exception, but we wrap this in a - // setTimeout call so that we won't throw in the middle of a function - window.setTimeout(function() { - window.onerror = function(errmsg, fileName, lineNumber) { - try { - Zotero.Errors.log("message" in err ? err.message : err.toString(), fileName, lineNumber); - } catch (e) {}; - return true; - }; - throw err; - window.onerror = undefined; - }, 0); - return; - } - - if (fileName && lineNumber) { - console.error(err + " at " + fileName + ":" + lineNumber); - } else { - console.error(err); - } - - if (err.stack) { - if (!Zotero.isChrome) { - Zotero.Errors.log(err.message + '\n' + err.stack); - } else { - Zotero.Errors.log(err.stack); - } - } else { - Zotero.Errors.log(err.message ? err.message : err.toString(), fileName, lineNumber); - } - }; - - this.getString = function() { - return Zotero.i18n.getString(...arguments); - }; - - this.getExtensionURL = function(path) { - let url; - if (Zotero.isBookmarklet) { - url = ZOTERO_CONFIG.BOOKMARKLET_URL + path; - } - else if (Zotero.isSafari) { - url = `${safari.extension.baseURI}safari/` + path; - } - else { - url = browser.runtime.getURL(path); - } - return url; - } -} - -Zotero.Prefs = new function() { - const DEFAULTS = { - "debug.log": false, - "debug.stackTrace": false, - "debug.store": false, - "debug.store.limit": 750000, - "debug.level": 5, - "debug.time": false, - "lastVersion": "", - "downloadAssociatedFiles": true, - "automaticSnapshots": true, // only affects saves to zotero.org. saves to client governed by pref in the client - "connector.repo.lastCheck.localTime": 0, - "connector.repo.lastCheck.repoTime": 0, - "connector.url": 'http://127.0.0.1:23119/', - "capitalizeTitles": false, - "interceptKnownFileTypes": true, - "allowedCSLExtensionHosts": ["raw.githubusercontent.com"], - "allowedInterceptHosts": [], - "firstUse": true, - "firstSaveToServer": true, - "reportTranslationFailure": true, - "translatorMetadata": [], - - "proxies.transparent": true, - "proxies.autoRecognize": true, - "proxies.showRedirectNotification": true, - "proxies.disableByDomain": false, - "proxies.disableByDomainString": '.edu', - "proxies.proxies": [], - "proxies.clientChecked": false, - - "integration.googleDocs.enabled": true, - // TODO: Add a remote repo URL (with trailing slash) once it is set up - "integration.googleDocs.codeRepositoryURL": "", - "integration.googleDocs.repoCheckInterval": 24 * 60 * 60 * 1000, // 24hrs - - "shortcuts.cite": {ctrlKey: true, altKey: true, key: 'c'} - }; - - if (Zotero.isMac) { - DEFAULTS['shortcuts.cite'] = { - metaKey: true, - ctrlKey: true, - key: 'c' - } - } - - this.syncStorage = {}; - - /** - * Should override per browser and load data into this.syncStorage - */ - this.init = function() { - throw new Error("Prefs initialization not overriden"); - }; - - this.get = function(pref) { - try { - if (!(pref in this.syncStorage)) throw new Error(`Prefs.get: ${pref} not preloaded`); - return this.syncStorage[pref]; - } catch (e) { - if (DEFAULTS.hasOwnProperty(pref)) return DEFAULTS[pref]; - if (Zotero.isBackground) { - throw new Error("Zotero.Prefs: Invalid preference " + pref); - } else { - throw e; - } - } - }; - - this.getAll = function() { - let prefs = Object.assign({}, DEFAULTS, this.syncStorage); - delete prefs['translatorMetadata']; - return Zotero.Promise.resolve(prefs); - }; - - this.getAsync = function(pref) { - return new Zotero.Promise(function(resolve, reject) { - try { - if (typeof pref === "object") { - var prefData = {}; - for (var i = 0; i < pref.length; i++) { - prefData[pref[i]] = Zotero.Prefs.get(pref[i]); - } - resolve(prefData); - } else { - resolve(Zotero.Prefs.get(pref)); - } - } catch (e) { - reject(e); - } - }); - }; - - /** - * Pre-load a namespace of prefs that can then be accessed synchronously. - * Only needed in injected code - * - * @param namespace {String|String[]} - */ - this.loadNamespace = function(namespaces) { - if (Zotero.isBackground) throw new Error('trying to load namespace in background. all prefs are available via the sync API'); - if (!Array.isArray(namespaces)) namespaces = [namespaces]; - return this.getAll().then(function(prefs) { - let keys = Object.keys(prefs); - for (let namespace of namespaces) { - keys.filter((key) => key.indexOf(namespace) === 0) - .forEach((key) => this.syncStorage[key] = prefs[key]); - } - }.bind(this)); - }; - - /** - * Should override per browser - * @param pref - * @param value - */ - this.set = function(pref, value) { - Zotero.debug("Setting " + pref + " to " + JSON.stringify(value).substr(0, 100)); - this.syncStorage[pref] = value; - }; - - /** - * Should override per browser - * @param pref - */ - this.clear = function(pref) { - if (Array.isArray(pref)) return pref.forEach((p) => this.clear(p)); - delete this.syncStorage[pref]; - } -} diff --git a/zotero-connectors/src/common/zotero_config.js b/zotero-connectors/src/common/zotero_config.js deleted file mode 100644 index e1270c76..00000000 --- a/zotero-connectors/src/common/zotero_config.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -const ZOTERO_CONFIG = { - CLIENT_NAME: 'Zotero', - DOMAIN_NAME: 'zotero.org', - REPOSITORY_URL: 'https://repo.zotero.org/repo/', - REPOSITORY_CHECK_INTERVAL: 86400, // 24 hours - REPOSITORY_RETRY_INTERVAL: 3600, // 1 hour - REPOSITORY_CHANNEL: 'trunk', - BASE_URI: 'https://zotero.org/', - WWW_BASE_URL: 'https://www.zotero.org/', - CLIENT_DOWNLOAD_URL: 'https://www.zotero.org/download', - API_URL: 'https://api.zotero.org/', - GOOGLE_DOCS_API_URL: "https://script.googleapis.com/v1/scripts/1yB-M2ynZPu5fDKJW96sCvNTenn9VRRgJi1e-b_Kq6TJjMs_F2rdxXK30:run", - OAUTH: { - ZOTERO: { - REQUEST_URL: 'https://www.zotero.org/oauth/request', - ACCESS_URL: 'https://www.zotero.org/oauth/access', - AUTHORIZE_URL: 'https://www.zotero.org/oauth/authorize', - CALLBACK_URL: 'https://www.zotero.org/connector_auth_complete', - CLIENT_KEY: '05a4e25d3d9af8922eb9', - CLIENT_SECRET: '8dda1d6aa188bdd3126e' - }, - GOOGLE_DOCS: { - AUTHORIZE_URL: 'https://accounts.google.com/o/oauth2/v2/auth', - ACCESS_URL: 'https://www.googleapis.com/oauth2/v3/tokeninfo', - CALLBACK_URL: 'https://www.zotero.org/connector_auth_complete', - CLIENT_KEY: '222339878061-13uqre19u268oo9pdapuaifklbu8d6js.apps.googleusercontent.com', - } - }, - GOOGLE_DOCS_DEV_MODE: false -}; \ No newline at end of file diff --git a/zotero-connectors/src/messages.json b/zotero-connectors/src/messages.json deleted file mode 100644 index 2977bccf..00000000 --- a/zotero-connectors/src/messages.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "general_saveTo": { - "message": "Save to $1" - }, - "general_more": { - "message": "More…" - }, - "general_moreInfo": { - "message": "More Info…" - }, - "general_needHelp": { - "message": "Need help?" - }, - "general_done": { - "message": "Done" - }, - "general_yes": { - "message": "Yes" - }, - "general_no": { - "message": "No" - }, - "general_tryAgain": { - "message": "Try Again" - }, - "general_warning": { - "message": "Warning" - }, - "general_cancel": { - "message": "Cancel" - }, - "general_pleaseWait": { - "message": "Please wait…" - }, - "general_copyToClipboard": { - "message": "Copy to Clipboard" - }, - - "progressWindow_savingTo": { - "message": "Saving to" - }, - "progressWindow_tagPlaceholder": { - "message": "Tags (separated by commas)" - }, - "progressWindow_error_translation": { - "message": "An error occurred while saving this item. See $1 for more information." - }, - "progressWindow_error_siteAccessLimitsError": { - "message": "An error occurred while saving this item. $1 may limit the number of items you can save at once. See $2 for more information.", - "description": "The placeholders are for the failing translator label (e.g., Google Scholar) and the Site Access Limits link" - }, - "progressWindow_error_troubleshootingTranslatorIssues": { - "message": "Troubleshooting Translator Issues" - }, - "progressWindow_error_siteAccessLimits": { - "message": "Site Access Limits" - }, - "progressWindow_error_fallback": { - "message": "An error occurred saving with $1. Attempting to save using $2 instead.", - "description": "The placeholders will contain the names of Zotero translators (e.g., JSTOR or Embedded Metadata)." - }, - "progressWindow_error_upgradeClient": { - "message": "This feature is not supported by your version of $1. Please upgrade to the $2.", - "description": "$2 will be a link with the localized text 'latest version'." - }, - "progressWindow_error_upgradeClient_latestVersion": { - "message": "latest version" - }, - - "appConnector": { - "message": "$1 Connector" - }, - "upgradeApp": { - "message": "Upgrade $1" - }, - - "firstRun_title": { - "message": "You’ve installed the $1 Connector!" - }, - "firstRun_text1": { - "message": "The $1 Connector enables you to save items to $1 from your browser in a single click." - }, - "firstRun_text2": { - "message": "If you haven’t yet, download the standalone $1 application for the best experience." - }, - "firstRun_acceptButton": { - "message": "Got it", - "description": "The Accept button for the first-run dialog" - }, - - "error_connection_isAppRunning": { - "message": "Is $1 Running?" - }, - "error_connection_save": { - "message": "The $1 was unable to communicate with the $2 desktop application. The Connector can save some pages directly to your $3 account, but for best results you should make sure $2 is open before attempting to save.", - "description": "$1 will contain the localized string 'Zotero Connector'. $2 will contain the app name. $3 will contain the domain name." - }, - "error_connection_downloadOrTroubleshoot": { - "message": "You can download $2 or troubleshoot the connection if necessary." - }, - "error_connection_enableSavingToOnlineLibrary": { - "message": "Enable Saving to Online Library" - }, - - "reports_report_submitted": { - "message": "Your error report has been submitted.\n\nReport ID: $1\n\nPlease post a message to the Zotero Forums with this Report ID, a description of the problem, and any steps necessary to reproduce it.\n\nError reports are not reviewed unless referred to in the forums." - }, - - "reports_debug_output_submitted": { - "message": "Your debug output has been submitted.\n\nThe Debug ID is $1." - }, - - "reports_submission_failed": { - "message": "An error occurred submitting your report.\n\n$1\n\nPlease check your internet connection. If the problem persists, post a message to the Zotero Forums.", - "description": "$1 will be the error message sent to the Zotero servers" - }, - - "integration_error_clientUpgrade": { - "message": "Web-based citing requires $1 or later." - }, - "integration_error_connection": { - "message": "The $1 was unable to communicate with the $2 desktop application. $2 must be open to use web-based citing.", - "description": "$1 will be the localized string for the extension (e.g., Zotero Connector). $2 will be the app name (e.g., Zotero)." - }, - - "integration_googleDocs_unlinkBeforeSaving_warning": { - "message": "This document contains active Zotero citations that will appear as zotero.org links in a downloaded copy." - }, - "integration_googleDocs_unlinkBeforeSaving_instructions": { - "message": "To generate a version suitable for sharing, select Make a copy… from the File menu, select Unlink Citations from the Zotero menu in the new document, and then download the unlinked version. Keep this original linked document in case you need to make further changes." - }, - "integration_googleDocs_unlinkBeforeSaving_downloadAnyway": { - "message": "Download Linked Version Anyway" - }, - "integration_googleDocs_updating": { - "message": "$1 is updating your document." - }, - "integration_googleDocs_docxAlert": { - "message": "$1 integration is not available when editing Microsoft Word .docx files directly in Google Docs. Choose File → Save as Google Docs to enable this functionality.

    If you want to transfer a Word document with $1 citations to Google Docs, see Moving Documents Between Word Processors." - }, - "integration_googleDocs_documentLocked": { - "message": "The document citations are being edited by another $1 user. Please try again later." - }, - "integration_googleDocs_documentLocked_moreInfo": { - "message": "$1 locks your document to prevent multiple users from editing citations at the same time. Concurrent citation editing in the document may lead to citation or document corruption. Certain unforeseeable circumstances, such as network failures, may lead to your document becoming permanently locked. If you believe this has happened, you can override the lock.

    Would you like to override the document lock?" - }, - "integration_googleDocs_documentPermissionError": { - "message": "The Google account you selected does not have permission to edit this document. Please try again, and be sure to choose the account with editing access." - }, - - "integration_googleDocs_orphanedCitations_buttonTooltip": { - "message": "Show unlinked $1 citations" - }, - "integration_googleDocs_orphanedCitations_alert": { - "message": "The citation you are trying to edit has become unlinked from $1." - }, - "integration_googleDocs_orphanedCitations_alertButton": { - "message": "Relink Citation" - }, - "integration_googleDocs_orphanedCitations_disclaimer": { - "message": "These citations have become unlinked from $1. You will need to relink them before they will update or appear in your bibliography." - } -} \ No newline at end of file diff --git a/zotero-connectors/src/safari/global.html b/zotero-connectors/src/safari/global.html deleted file mode 100644 index ae05bcb7..00000000 --- a/zotero-connectors/src/safari/global.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/zotero-connectors/src/safari/global.js b/zotero-connectors/src/safari/global.js deleted file mode 100644 index ea818f98..00000000 --- a/zotero-connectors/src/safari/global.js +++ /dev/null @@ -1,347 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -(async function() { -let tabs = {}; - -// TODO: Garbage collect -function getTab(tabId) { - if (tabs[tabId]) return tabs[tabId]; - return tabs[tabId] = {id: tabId}; -} - -Zotero.Connector_Browser = new function() { - var _selectCallbacksForTabIDs = {}; - var _incompatibleVersionMessageShown; - var _zoteroButton; - - this.getTab = getTab; - this.closeTab = function(tab) { - Zotero.Messaging.sendMessage('Swift.closeTab', [tab.id]); - } - - this.getExtensionVersion = async function() { - return Zotero.Messaging.sendMessage("Swift.getVersion"); - } - - /** - * Called when a new page has been loaded to clear previous translators - */ - this.onPageLoad = function(title, url, tab) { - tab.title = title; - tab.url = url; - tab.instanceID = 0; - if (Zotero.Proxies.transparent) { - Zotero.Proxies.onPageLoadSafari(tab); - } - - if (tab.translators) { - tab.isPDFFrame = false; - tab.translators = null; - } - _updateButtonStatus(tab); - }; - - this.onTabFocus = _updateButtonStatus; - - /** - * If there's a frame with a PDF mimeType this gets invoked - * @param frameURL - * @param tabId - */ - this.onPDFFrame = function(frameURL, instanceID, tab) { - if (tab.translators && tab.translators.length) { - return; - } - tab.isPDFFrame = true; - tab.instanceID = instanceID; - _updateButtonStatus(tab); - } - - - /** - * Called when translators are available for a given page - */ - this.onTranslators = function(translators, instanceID, contentType, tab) { - tab.contentType = contentType; - if (!translators.length) { - return _updateButtonStatus(tab); - } - - let existingTranslators = tab.translators; - // If translators already exist for tab we need to figure out if the new translators - // are more important/higher priority - if (existingTranslators && existingTranslators.length) { - let existingTranslatorsHaveHigherPriority = existingTranslators[0].priority < translators[0].priority; - if (existingTranslatorsHaveHigherPriority) return; - - let priorityEqual = translators[0].priority == existingTranslators[0].priority; - let newTranslatorsAreFromTopFrame = instanceID == 0; - if (priorityEqual && !newTranslatorsAreFromTopFrame) return; - } - - tab.translators = translators; - tab.instanceID = instanceID; - tab.isPDFFrame = false; - - _updateButtonStatus(tab); - } - - /** - * Called when Zotero button is pressed - */ - this.onPerformCommand = function(tab) { - if (_isDisabledForURL(tab.url)) return; - if (tab.translators && tab.translators.length) { - Zotero.Connector_Browser.saveWithTranslator(tab, - tab.translators[0].translatorID, {fallbackOnFailure: true}); - } else { - var withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - Zotero.Connector_Browser.saveAsWebpage(tab, { snapshot: withSnapshot }); - } - } - - - /** - * Called when Zotero goes online or offline - */ - this.onStateChange = function() { - if (Zotero.Connector.isOnline) { - Zotero.Prefs.set('firstSaveToServer', true); - } - }; - - // Received after global page init and restart - this.onTabData = function(data, tab) { - Object.assign(tab, data); - _updateButtonStatus(tab); - }; - - this.saveWithTranslator = function(tab, translatorID, options) { - return Zotero.Messaging.sendMessage( - "translate", - [ - tab.instanceID, - translatorID, - options - ], - tab - ); - } - - this.saveAsWebpage = function(tab, options) { - let title = tab.title.split('/'); - title = title[title.length-1]; - return Zotero.Messaging.sendMessage( - "saveAsWebpage", - [ - tab.instanceID || 0, - [ - title, - options - ] - ], - tab - ); - } - - // To say that we have some indirection here would be an understatement - // but we want to maintain as compatible an API with browserExt as possible - this.openWindow = function(url, options={}) { - let args = [url]; - if (typeof options.onClose == 'function') { - args.push(options.onClose); - } - Zotero.Messaging.sendMessage('Swift.openWindow', args); - }; - - this.openTab = function(url) { - Zotero.Messaging.sendMessage('Swift.openTab', [url]); - }; - - this.bringToFront = async function() { - // Unlikely to do anything - Zotero.Messaging.sendMessage('Swift.activate'); - }; - - this.openPreferences = function(paneID="") { - Zotero.Connector_Browser.openTab(`${safari.extension.baseURI}safari/` + `preferences/preferences.html#${paneID}`); - }; - - this.openConfigEditor = function() { - Zotero.Connector_Browser.openTab(`${safari.extension.baseURI}safari/` + "preferences/config.html"); - }; - - this.isIncognito = function(tab) { - return false; - } - - /** - * Display an old-school firefox notification by injecting HTML directly into DOM. - * This has a side-effect of navigation (user-initiated or JS-redirect-based) - * removing the notification so we keep on re-injecting it into DOM. - * - * The timeout argument specifies how long the notification has to be displayed for - * without navigation, before it is considered "seen" and further navigation on the tab - * will not make it re-appear. - * - * @param {String} text - * @param {String[]} buttons - labels for buttons - * @param {Number} [seenTimeout=5000] - * @param {Tab} [tab=currentTab] - * @returns {Promise{Number}} button pressed idx or undefined if timed-out and navigated away from - */ - this.notify = async function(text, buttons, seenTimeout=5000, tab) { - await Zotero.Promise.delay(1000); - let timedOut = false; - seenTimeout && setTimeout(() => timedOut = true, seenTimeout); - var response = await Zotero.Messaging.sendMessage('notify', [text, buttons, null, 'complete'], tab); - if (response != undefined || timedOut) return response; - - // Tab url changed or tab got removed, hence the undefined response - // Wait a sec to not run a busy-waiting loop - await Zotero.Promise.delay(1000); - return this.notify(text, buttons, seenTimeout, tab); - } - - this.onContextMenuItem = function(args, tab) { - const [translatorID] = args; - switch (translatorID) { - case "prefs": - Zotero.Connector_Browser.openPreferences(); - break; - case "withSnapshot": - case "withoutSnapshot": - Zotero.Connector_Browser.saveAsWebpage(tab, { - snapshot: translatorID == "withSnapshot" - }); - break; - default: - Zotero.Connector_Browser.saveWithTranslator(tab, translatorID, {fallbackOnFailure: false}); - } - }; - - function _isDisabledForURL(url) { - return !url || url.includes('file://') || url.startsWith(`${safari.extension.baseURI}safari/`); - } - - /** - * Update status and tooltip of Zotero button - * - * Called on changing tabs, translator update or when Zotero goes online/offline - */ - async function _updateButtonStatus(tab) { - var translators = tab.translators; - var isPDF = tab.contentType == 'application/pdf' || tab.isPDFFrame; - let image, tooltip; - if (_isDisabledForURL(tab.url)) { - [image, tooltip] = await _showZoteroStatus(tab); - Zotero.Messaging.sendMessage("Swift.updateButton", [image, tooltip, []], tab); - return; - } - - let contextItemList = []; - const finalItems = [ - ["withSnapshot", "Save to Zotero (Web Page with Snapshot)"], - ["withoutSnapshot", "Save to Zotero (Web Page without Snapshot)"] - ]; - - if (translators && translators.length) { - for (let translator of translators) { - contextItemList.push([translator.translatorID, _getTranslatorLabel(translator)]) - } - [image, tooltip] = _showTranslatorIcon(translators[0], tab); - } else if (isPDF) { - contextItemList.push(["pdf", "Save to Zotero (PDF)"]); - [image, tooltip] = _showPDFIcon(tab); - } else { - [image, tooltip] = _showWebpageIcon(tab); - } - Zotero.Messaging.sendMessage("Swift.updateButton", [image, tooltip, contextItemList.concat(finalItems)], tab) - } - - async function _showZoteroStatus() { - let isOnline = await Zotero.Connector.checkIsOnline(); - let image, tooltip; - if (isOnline) { - image = "images/toolbar/zotero-new-z-16px.png"; - tooltip = "Zotero is Online"; - } else { - image = "images/toolbar/zotero-z-16px-offline.png"; - tooltip = "Zotero is Offline"; - } - return [image, tooltip] - } - - function _showTranslatorIcon(translator) { - let image = "images/toolbar/treesource-collection.png"; - if (translator.itemType !== "multiple") { - image = Zotero.ItemTypes.getImageSrc(translator.itemType).replace('images/', 'images/toolbar/') - .replace(`${safari.extension.baseURI}safari/`, ''); - - } - let tooltip = _getTranslatorLabel(translator); - return [image, tooltip] - } - - function _showWebpageIcon() { - let withSnapshot = Zotero.Connector.isOnline ? Zotero.Connector.automaticSnapshots : - Zotero.Prefs.get('automaticSnapshots'); - let image = Zotero.ItemTypes.getImageSrc("webpage-gray").replace('images/', 'images/toolbar/') - .replace(`${safari.extension.baseURI}safari/`, ''); - let tooltip = `"Save to Zotero (Web Page with${withSnapshot ? "" : "out"} Snapshot)"`; - return [image, tooltip]; - } - - function _showPDFIcon() { - let image = "images/toolbar/pdf.png"; - let tooltip = "Save to Zotero (PDF)"; - return [image, tooltip] - } - - function _getTranslatorLabel(translator) { - var translatorName = translator.label; - if(translator.runMode === Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE) { - translatorName += " via Zotero Standalone"; - } - - return "Save to Zotero (" + translatorName + ")"; - } - -}; - -let globalInitialized = false; -Zotero.Messaging.addMessageListener("buttonClick", Zotero.Connector_Browser.onPerformCommand); -Zotero.Messaging.addMessageListener("onContextMenuItem", Zotero.Connector_Browser.onContextMenuItem); -Zotero.Messaging.addMessageListener('ping', () => globalInitialized); - -await Zotero.initGlobal(); -// Setting `${safari.extension.baseURI}safari/` for consistent access of resources in -// injected and global pages -globalInitialized = true; -Zotero.Messaging.sendMessage('Swift.globalAvailable'); - -})(); diff --git a/zotero-connectors/src/safari/http_global.js b/zotero-connectors/src/safari/http_global.js deleted file mode 100644 index 8218d8fb..00000000 --- a/zotero-connectors/src/safari/http_global.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2019 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.HTTP.request = async function(method, url, options={}) { - let args = { - method, - // Swift's URL class does not deal well with non-standard URL symbols - // Also this is a bit of a flaky solution here, but sometimes translators - // provide already URL encoded URLs, other times they do not, and there - // is no good way to check whether an URL is already encoded - url: url.includes('%') ? url : encodeURI(url) - }; - options.method = method; - - let logBody = ''; - if (['GET', 'HEAD'].includes(method)) { - if (!(typeof options.body == 'undefined' || options.body == null)) { - throw new Error(`HTTP ${method} cannot have a request body (${options.body})`) - } - } else if(options.body) { - options.body = typeof options.body == 'string' ? options.body : JSON.stringify(options.body); - - if (!options.headers) options.headers = {}; - if (!options.headers["Content-Type"]) { - options.headers["Content-Type"] = "application/x-www-form-urlencoded"; - } - else if (options.headers["Content-Type"] == 'multipart/form-data') { - // Allow XHR to set Content-Type with boundary for multipart/form-data - delete options.headers["Content-Type"]; - } - - logBody = `: ${options.body.substr(0, options.logBodyLength)}` + - options.body.length > options.logBodyLength ? '...' : ''; - // TODO: make sure below does its job in every API call instance - // Don't display password or session id in console - logBody = logBody.replace(/password":"[^"]+/, 'password":"********'); - logBody = logBody.replace(/password=[^&]+/, 'password=********'); - } - Zotero.debug(`HTTP ${method} ${url}${logBody}`); - args.options = options; - - try { - var response = await Zotero.Messaging.sendMessage('HTTP.request', args); - var [status, responseText, headers] = response; - } catch (err) { - status = 0; - headers = {}; - responseText = err.message; - } - let invalidDefaultStatus = options.successCodes === null && - (status < 200 || status >= 300); - let invalidStatus = Array.isArray(options.successCodes) && !options.successCodes.includes(status); - if (invalidDefaultStatus || invalidStatus) { - throw new Zotero.HTTP.StatusError({status, responseText}, url); - } - - let headerString = Object.keys(headers).map(key => `${key}: ${headers[key]}`).join("\n"); - Object.keys(headers).forEach(key => headers[key.toLowerCase()] = headers[key]); - return { - status, responseText, - responseHeaders: headerString, - getAllResponseHeaders: () => headerString, - getResponseHeader: name => headers[name.toLowerCase()] - }; -} - -// Alias as COHTTP = Cross-origin HTTP; this is how we will call it from children -// For injected scripts, this get overwritten in messaging.js (see messages.js) -Zotero.COHTTP = { - request: Zotero.HTTP.request -}; - diff --git a/zotero-connectors/src/safari/i18n.js b/zotero-connectors/src/safari/i18n.js deleted file mode 100644 index 542e9abc..00000000 --- a/zotero-connectors/src/safari/i18n.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2018 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * This is a trivial class for BrowserExt, but we need a non-trivial one for Safari - */ -Zotero.i18n = { - init: async function() { - if (Zotero.isBackground) { - this.localeJSON = await Zotero.Messaging.sendMessage('Swift.getLocale'); - this.localeJSON = JSON.parse(this.localeJSON); - } else { - this.localeJSON = await Zotero.i18n.getStrings(); - } - }, - getString: function(name, substitutions) { - if (!this.localeJSON) { - Zotero.logError(new Error(`i18n.getString called for ${name} before i18n.localeJSON was loaded.`)); - return '{' + name + '}'; - } - var str = this.localeJSON[name] && this.localeJSON[name].message; - if (!str) { - Zotero.logError(new Error(`Localized string '${name}' is not defined.`)); - return '{' + name + '}'; - } - if (substitutions != undefined) { - if (!Array.isArray(substitutions)) { - substitutions = [substitutions]; - } - for (let i = 0; i < substitutions.length; i++) { - let sub = substitutions[i]; - str = str.replace(new RegExp(`\\$${i+1}`, 'g'), sub) - } - } - - return str; - }, - // Used to load the localeJSON in the injected pages - getStrings: function() { - return this.localeJSON; - } -}; diff --git a/zotero-connectors/src/safari/images/toolbar/treeitem-webpage-gray.png b/zotero-connectors/src/safari/images/toolbar/treeitem-webpage-gray.png deleted file mode 100644 index 7b6c2ed9..00000000 Binary files a/zotero-connectors/src/safari/images/toolbar/treeitem-webpage-gray.png and /dev/null differ diff --git a/zotero-connectors/src/safari/images/toolbar/treeitem-webpage-gray@2x.png b/zotero-connectors/src/safari/images/toolbar/treeitem-webpage-gray@2x.png deleted file mode 100644 index f48428ba..00000000 Binary files a/zotero-connectors/src/safari/images/toolbar/treeitem-webpage-gray@2x.png and /dev/null differ diff --git a/zotero-connectors/src/safari/images/toolbar/zotero-z-16px-offline.png b/zotero-connectors/src/safari/images/toolbar/zotero-z-16px-offline.png deleted file mode 100644 index fe469d9a..00000000 Binary files a/zotero-connectors/src/safari/images/toolbar/zotero-z-16px-offline.png and /dev/null differ diff --git a/zotero-connectors/src/safari/inject_safari.js b/zotero-connectors/src/safari/inject_safari.js deleted file mode 100644 index e9e2eabe..00000000 --- a/zotero-connectors/src/safari/inject_safari.js +++ /dev/null @@ -1,125 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2019 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -const cssZoteroFrameDimmer = { - background: "rgba(0, 0, 0, 0.5)", - position: "fixed", - top: "0px", - bottom: "0px", - left: "0px", - right: "0px", - zIndex: "16777270", - height: "100%", - width: "100%", - filter: "alpha(opacity = 50);" -}; -const cssZoteroFrame = { - borderStyle: "none", - position: "fixed", - zIndex: "16777271", - top: "50%", - left: "50%", - background: "white", - display: "block" -}; - -/** - * Creates a new frame with the specified width and height - * @constructor - */ -class ZoteroFrame { - constructor(url, width, height) { - // Make sure iframe is not bigger than window - height = Math.min(window.innerHeight-10, height); - width = Math.min(window.innerWidth-10, width); - - this._dimmer = document.createElement("div"); - for (let key in cssZoteroFrameDimmer) { - this._dimmer.style[key] = cssZoteroFrameDimmer[key]; - } - document.body.appendChild(this._dimmer); - - // Add iframe - this._frame = document.createElement("iframe"); - this._frame.src = url; - for (let key in cssZoteroFrame) this._frame.style[key] = cssZoteroFrame[key]; - this._frame.style.margin = "-"+height/2+"px 0 0 -"+width/2+"px"; - this._frame.style.width = width+"px"; - this._frame.style.height = height+"px"; - this._frame.setAttribute("frameborder", "0"); - - this._dimmer.appendChild(this._frame); - } - - remove() { - document.body.removeChild(this._dimmer); - } -} - -Zotero.Inject.onSafariSelect = async function(items) { - var frame = new ZoteroFrame(`${safari.extension.baseURI}safari/`+"itemSelector/itemSelector.html#" - +encodeURIComponent(JSON.stringify([null, items])), 600, 350); - - let deferred = Zotero.Promise.defer(); - Zotero.Inject._selectCallback = deferred.resolve; - let returnItems = await deferred.promise; - frame.remove(); - return returnItems -} - -// BrowserExt handles these in the background page -window.addEventListener('focus', function() { - Zotero.Connector.reportActiveURL(document.location.href); - Zotero.Connector_Browser.onTabFocus(); -}, true); - -var isTopWindow = false; -if(window.top) { - try { - isTopWindow = window.top == window; - } catch(e) {} -} - -if (isTopWindow) { - setInterval(() => safari.extension.dispatchMessage("ping", {}), 1000); - - window.addEventListener('popstate', function() { - if (document.hasFocus()) { - Zotero.Connector.reportActiveURL(document.location.href); - } - }, true); - - if (document.hasFocus()) { - Zotero.Connector.reportActiveURL(document.location.href); - } - - Zotero.Messaging.addMessageListener('buttonClick', function() { - Zotero.Connector_Browser.onPerformCommand(); - }); - - Zotero.Messaging.addMessageListener("selectDone", function(returnItems) { - Zotero.Inject._selectCallback(returnItems); - }); -} diff --git a/zotero-connectors/src/safari/itemSelector/itemSelector_browserSpecific.js b/zotero-connectors/src/safari/itemSelector/itemSelector_browserSpecific.js deleted file mode 100644 index bab27317..00000000 --- a/zotero-connectors/src/safari/itemSelector/itemSelector_browserSpecific.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2010 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Sends a message back to the connector parent - */ -function sendMessage() { - if(responseSent) return; - responseSent = true; - // send message - const requestID = Math.floor(Math.random() * 1e12); - safari.extension.dispatchMessage('message', { - message: "Messaging.sendMessage", - messageId: requestID, - args: ['selectDone', items] - }); - window.close(); -} diff --git a/zotero-connectors/src/safari/jscontext_shim.js b/zotero-connectors/src/safari/jscontext_shim.js deleted file mode 100644 index 40177028..00000000 --- a/zotero-connectors/src/safari/jscontext_shim.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2019 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -// These are shims to bring the Apple JSContext running in Swift -// closer to what a real browser is so that we can run our global page properly - -const consFuncs = ['log', 'info', 'error', 'warn']; -for (const prop of consFuncs) { - if (typeof console[prop] == "undefined") continue; - const func = console[prop]; - console[prop] = function() { - func.apply(this, arguments); - typeof _consoleLog != "undefined" && _consoleLog(`console.${prop}: ` + arguments[0]); - } -} - -// Default variable name for "the global" variable in the JSContext -var window = globalThis; diff --git a/zotero-connectors/src/safari/messaging_global.js b/zotero-connectors/src/safari/messaging_global.js deleted file mode 100644 index 12cb4de2..00000000 --- a/zotero-connectors/src/safari/messaging_global.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2019 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -const MESSAGE_TIMEOUT = 5 * 60 * 1000; - -Zotero.Messaging._responseListeners = {}; -Zotero.Messaging.receiveSwiftMessage = async function(messageName, id, data=[], tabId=-1) { - // Zotero.debug(`Swift message received: ${messageName}, ${JSON.stringify(data).substr(0, 500)}`); - if (messageName == 'response') { - let callback = Zotero.Messaging._responseListeners[id]; - if (!callback) return; - if (data[0] == "error") data[1] = JSON.stringify(data[1]); - let response = callback(data, Zotero.Connector_Browser.getTab(tabId)); - // await for the response for error handling - if (response && response.then) { - await response; - } - return; - } - await Zotero.initDeferred.promise; - try { - var result = await Zotero.Messaging.receiveMessage(messageName, data, Zotero.Connector_Browser.getTab(tabId)); - } catch (err) { - Zotero.logError(err); - result = ["error", JSON.stringify(Object.assign({ - name: err.name, - message: err.message, - stack: err.stack - }, err))]; - } - sendMessage(messageName+MESSAGE_SEPARATOR+"Response", id, result, tabId); -}; - -Zotero.Messaging.sendMessage = async function(messageName, args=[], tab, messageId, deferred) { - try { - messageId = messageId || Math.floor(Math.random()*1e12); - deferred = deferred || Zotero.Promise.defer(); - const tabId = tab ? tab.id : tab; - const messageTimeout = Zotero.initialized ? MESSAGE_TIMEOUT : 2000; - var resolved = false; - - function respond(payload) { - resolved = true; - if (payload && payload[0] == 'error') { - var errJSON = JSON.parse(payload[1]); - let e = new Error(errJSON.message); - for (let key in errJSON) e[key] = errJSON[key]; - deferred.reject(e); - } - deferred.resolve(payload); - } - - Zotero.Messaging._responseListeners[messageId] = respond; - - sendMessage(messageName, messageId, args, tabId); - // Make sure we don't slowly gobble up memory with callbacks - // The drawback is that Google Docs users will timeout in MESSAGE_TIMEOUT - // (at the time of writing this is 5min) - var timeout = setTimeout(function() { - if (!resolved) { - if (Zotero.initialized) { - deferred.reject(new Error(`Message ${messageName} response timed out`)); - delete Zotero.Messaging._responseListeners[messageId]; - } else { - // If Zotero is not initialized we need to keep trying until the extension actually boots up - console.log('Swift initialization message did not receive a response. Retrying'); - Zotero.Messaging.sendMessage(messageName, args, tab, messageId, deferred); - } - } - }, messageTimeout); - var response = await deferred.promise; - } - finally { - clearTimeout(timeout); - } - return response; -} diff --git a/zotero-connectors/src/safari/messaging_inject.js b/zotero-connectors/src/safari/messaging_inject.js deleted file mode 100644 index 84a52391..00000000 --- a/zotero-connectors/src/safari/messaging_inject.js +++ /dev/null @@ -1,195 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @namespace - * See messages.js for an overview of the message handling process. - */ -Zotero.Messaging = new function() { - var _callbacks = {}; - var _messageListeners = {}; - - /** - * Add a message listener - */ - this.addMessageListener = function(messageName, callback) { - _messageListeners[messageName] = Zotero.Promise.method(callback); - } - - /** - * Adds messaging functions to injected script. This adds Zotero.xxx.yyy functions for all - * entries in MESSAGES. These will send a message to the global script and return immediately. - * When a message is received, they will call the callback function, which should be passed - * as the last argument to Zotero.xxx.yyy. - */ - this.init = function() { - Zotero.Messaging.addMessageListener('globalAvailable', async function() { - // If we receive globalAvailable it means the global page was killed - // and is back online. We need to refresh the tab data before - // we can issue any other commands to it - const messageId = Math.floor(Math.random() * 1e12); - let onTabDataPromise = generateResponsePromise(messageId, true); - safari.extension.dispatchMessage('message', { - message: 'Connector_Browser.onTabData', - messageId, - args: [{ - url: document.location.href, - title: document.title, - translators: Zotero.Inject.translators, - contentType: document.contentType, - instanceID: 0 - }] - }); - }); - - for (let ns in MESSAGES) { - if( !Zotero[ns]) Zotero[ns] = {}; - for (let meth in MESSAGES[ns]) { - Zotero[ns][meth] = new function() { - var messageName = ns+MESSAGE_SEPARATOR+meth; - var messageConfig = MESSAGES[ns][meth]; - return function() { - // see if last argument is a callback - var callback, callbackArg = null; - if(messageConfig) { - callbackArg = (messageConfig.callbackArg - ? messageConfig.callbackArg : arguments.length-1); - callback = arguments[callbackArg]; - if(typeof callback !== "function") { - // Zotero.debug("Message `"+messageName+"` has no callback arg. It should use the returned promise"); - callbackArg = null; - callback = null; - } - } - - // copy arguments to newArgs - var newArgs = new Array(arguments.length); - for(var i=0; i - - - - - - - -
  • Save to Zotero (Web Page with Snapshot)
  • -
  • Save to Zotero (Web Page without Snapshot)
  • - -
    -
  • Zotero Preferences
  • -
    - - - \ No newline at end of file diff --git a/zotero-connectors/src/safari/prefs.js b/zotero-connectors/src/safari/prefs.js deleted file mode 100644 index fa5e7c65..00000000 --- a/zotero-connectors/src/safari/prefs.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2017 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Stored via Swift UserDefaults - */ -Zotero.Prefs = Object.assign(Zotero.Prefs, { - init: async function() { - let prefsJSON = await Zotero.Messaging.sendMessage('Swift.getPrefs'); - let prefs = JSON.parse(prefsJSON); - this.syncStorage = Object.assign({}, prefs); - }, - - set: async function(pref, value) { - Zotero.debug("Setting "+pref+" to "+JSON.stringify(value).substr(0, 100)); - this.syncStorage[pref] = value; - await Zotero.Messaging.sendMessage('Swift.setPrefs', JSON.stringify(this.syncStorage)); - }, - - clear: async function(pref) { - if (!Array.isArray(pref)) { - pref = [pref] - } - pref.forEach((p) => { - delete this.syncStorage[p]; - }); - await Zotero.Messaging.sendMessage('Swift.setPrefs', JSON.stringify(this.syncStorage)); - } -}); diff --git a/zotero-connectors/src/translate/.gitmodules b/zotero-connectors/src/translate/.gitmodules deleted file mode 100644 index 71850e41..00000000 --- a/zotero-connectors/src/translate/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "modules/utilities"] - path = modules/utilities - url = https://github.com/zotero/utilities.git diff --git a/zotero-connectors/src/translate/COPYING b/zotero-connectors/src/translate/COPYING deleted file mode 100644 index eefbfb54..00000000 --- a/zotero-connectors/src/translate/COPYING +++ /dev/null @@ -1,681 +0,0 @@ -Zotero is Copyright © 2018-2021 Corporation for Digital Scholarship, -Vienna, Virginia, USA http://digitalscholar.org - -Copyright © 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 -Roy Rosenzweig Center for History and New Media, George Mason University, -Fairfax, Virginia, USA http://zotero.org - -The Corporation for Digital Scholarship distributes the Zotero source code -under the GNU Affero General Public License, version 3 (AGPLv3). The full text -of this license is given below. - -The Zotero name is a registered trademark of the Corporation for Digital Scholarship. -See http://zotero.org/trademark for more information. - -Third-party copyright in this distribution is noted where applicable. - -All rights not expressly granted are reserved. - -========================================================================= - - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/zotero-connectors/src/translate/README.md b/zotero-connectors/src/translate/README.md deleted file mode 100644 index 1ec06caf..00000000 --- a/zotero-connectors/src/translate/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Zotero Translate - -This repository contains the Zotero translation architecture code responsible for -parsing Zotero translators and running them on live and static web pages to retrieve -Zotero items. - -A consumer of this repository needs to implement the following interfaces: - -- `Zotero.Translators` found in `translators.js` -- `Zotero.HTTP` found in `http.js` -- `Zotero.Translate.ItemSaver` found in `translation/translate_item.js` - -You also need to: -- Call `Zotero.Schema.init(data)` with Zotero `schema.json`. -- Call `Zotero.Date.init(json)` with the JSON from `utilities/resource/dateFormats.json` -- If running in a ModuleJS environment (e.g. Node.js) call `require('../utilities/cachedTypes').setTypeSchema(typeSchema)` -with the result of `utilities/resource/zoteroTypeSchemaData.js`. - -Please bundle translators and Zotero schema with the translation architecture. -Do not load them from a remote server. - -You may also want to reimplement or modify: - -- `Zotero.Repo` found in `repo.js` to set up periodic translator update retrieval -- `Zotero.Debug` found in `debug.js` to customize debug logging -- `Zotero` and `Zotero.Prefs` found in `zotero.js` to set up the environment and -long-term preference storage -- `Zotero.Translate.ItemGetter` found in `translation/translate_item.js` for export -translation -- `Zotero.Translate.SandboxManager` found in `translation/sandboxManager.js` for -a tighter Sandbox environment if available on your the platform - -### Example - -See `example/index.html` for file loading order. - -To run the example: -```bash -$ git submodule update --init -$ google-chrome --disable-web-security --user-data-dir=/tmp/chromeTemvar -``` - -Open `example/index.html` in the CORS ignoring Google Chrome \ No newline at end of file diff --git a/zotero-connectors/src/translate/example/http.js b/zotero-connectors/src/translate/example/http.js deleted file mode 100644 index 4cc0d804..00000000 --- a/zotero-connectors/src/translate/example/http.js +++ /dev/null @@ -1,249 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2021 Corporation for Digital Scholarship - Vienna, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Functions for performing HTTP requests, both via XMLHTTPRequest and using a hidden browser - * @namespace - */ -Zotero.HTTP = new function() { - this.StatusError = function(xmlhttp, url) { - this.message = `HTTP request to ${url} rejected with status ${xmlhttp.status}`; - this.status = xmlhttp.status; - try { - this.responseText = typeof xmlhttp.responseText == 'string' ? xmlhttp.responseText : undefined; - } catch (e) {} - }; - this.StatusError.prototype = Object.create(Error.prototype); - - this.TimeoutError = function(ms) { - this.message = `HTTP request has timed out after ${ms}ms`; - }; - this.TimeoutError.prototype = Object.create(Error.prototype); - - /** - * Get a promise for a HTTP request - * - * @param {String} method The method of the request ("GET", "POST", "HEAD", or "OPTIONS") - * @param {String} url URL to request - * @param {Object} [options] Options for HTTP request:
      - *
    • body - The body of a POST request
    • - *
    • headers - Object of HTTP headers to send with the request
    • - *
    • debug - Log response text and status code
    • - *
    • logBodyLength - Length of request body to log
    • - *
    • timeout - Request timeout specified in milliseconds [default 15000]
    • - *
    • responseType - The response type of the request from the XHR spec
    • - *
    • responseCharset - The charset the response should be interpreted as
    • - *
    • successCodes - HTTP status codes that are considered successful, or FALSE to allow all
    • - *
    - * @return {Promise} A promise resolved with the XMLHttpRequest object if the - * request succeeds, or rejected if the browser is offline or a non-2XX status response - * code is received (or a code not in options.successCodes if provided). - */ - this.request = function(method, url, options = {}) { - // Default options - options = Object.assign({ - body: null, - headers: {}, - debug: false, - logBodyLength: 1024, - timeout: 15000, - responseType: '', - responseCharset: null, - successCodes: null - }, options); - - - let logBody = ''; - if (['GET', 'HEAD'].includes(method)) { - if (options.body != null) { - throw new Error(`HTTP ${method} cannot have a request body (${options.body})`) - } - } else if(options.body) { - options.body = typeof options.body == 'string' ? options.body : JSON.stringify(options.body); - - if (!options.headers) options.headers = {}; - if (!options.headers["Content-Type"]) { - options.headers["Content-Type"] = "application/x-www-form-urlencoded"; - } - else if (options.headers["Content-Type"] == 'multipart/form-data') { - // Allow XHR to set Content-Type with boundary for multipart/form-data - delete options.headers["Content-Type"]; - } - - logBody = `: ${options.body.substr(0, options.logBodyLength)}` + - options.body.length > options.logBodyLength ? '...' : ''; - // TODO: make sure below does its job in every API call instance - // Don't display password or session id in console - logBody = logBody.replace(/password":"[^"]+/, 'password":"********'); - logBody = logBody.replace(/password=[^&]+/, 'password=********'); - } - Zotero.debug(`HTTP ${method} ${url}${logBody}`); - - var xmlhttp = new XMLHttpRequest(); - xmlhttp.timeout = options.timeout; - var promise = Zotero.HTTP._attachHandlers(url, xmlhttp, options); - - xmlhttp.open(method, url, true); - - for (let header in options.headers) { - xmlhttp.setRequestHeader(header, options.headers[header]); - } - - xmlhttp.responseType = options.responseType || ''; - - // Maybe should provide "mimeType" option instead. This is xpcom legacy, where responseCharset - // could be controlled manually - if (options.responseCharset) { - xmlhttp.overrideMimeType("text/plain; charset=" + options.responseCharset); - } - - xmlhttp.send(options.body); - - return promise.then(function(xmlhttp) { - if (options.debug) { - if (xmlhttp.responseType == '' || xmlhttp.responseType == 'text') { - Zotero.debug(`HTTP ${xmlhttp.status} response: ${xmlhttp.responseText}`); - } - else { - Zotero.debug(`HTTP ${xmlhttp.status} response`); - } - } - - let invalidDefaultStatus = options.successCodes === null && !xmlhttp.responseURL.startsWith("file://") && - (xmlhttp.status < 200 || xmlhttp.status >= 300); - let invalidStatus = Array.isArray(options.successCodes) && !options.successCodes.includes(xmlhttp.status); - if (invalidDefaultStatus || invalidStatus) { - throw new Zotero.HTTP.StatusError(xmlhttp, url); - } - return xmlhttp; - }); - }; - /** - * Send an HTTP GET request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} responseCharset - * @param {N/A} cookieSandbox Not used in Connector - * @param {Object} headers HTTP headers to include with the request - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doGet = function(url, onDone, responseCharset, cookieSandbox, headers) { - Zotero.debug('Zotero.HTTP.doGet is deprecated. Use Zotero.HTTP.request'); - this.request('GET', url, {responseCharset, headers}) - .then(onDone, function(e) { - onDone({status: e.status, responseText: e.responseText}); - throw (e); - }); - return true; - }; - - /** - * Send an HTTP POST request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {String|Object[]} body Request body - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} headers Request HTTP headers - * @param {String} responseCharset - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doPost = function(url, body, onDone, headers, responseCharset) { - Zotero.debug('Zotero.HTTP.doPost is deprecated. Use Zotero.HTTP.request'); - this.request('POST', url, {body, responseCharset, headers}) - .then(onDone, function(e) { - onDone({status: e.status, responseText: e.responseText}); - throw (e); - }); - return true; - }; - - - /** - * Adds a ES6 Proxied location attribute - * @param doc - * @param docUrl - */ - this.wrapDocument = function(doc, docURL) { - let url = require('url'); - docURL = url.parse(docURL); - docURL.toString = () => this.href; - var wrappedDoc = new Proxy(doc, { - get: function (t, prop) { - if (prop === 'location') { - return docURL; - } - else if (prop == 'evaluate') { - // If you pass the document itself into doc.evaluate as the second argument - // it fails, because it receives a proxy, which isn't of type `Node` for some reason. - // Native code magic. - return function() { - if (arguments[1] == wrappedDoc) { - arguments[1] = t; - } - return t.evaluate.apply(t, arguments) - } - } - else { - if (typeof t[prop] == 'function') { - return t[prop].bind(t); - } - return t[prop]; - } - } - }); - return wrappedDoc; - }; - - - /** - * Adds request handlers to the XMLHttpRequest and returns a promise that resolves when - * the request is complete. xmlhttp.send() still needs to be called, this just attaches the - * handler - * - * See {@link Zotero.HTTP.request} for parameters - * @private - */ - this._attachHandlers = function(url, xmlhttp, options) { - var deferred = Zotero.Promise.defer(); - xmlhttp.onload = () => deferred.resolve(xmlhttp); - xmlhttp.onerror = xmlhttp.onabort = function() { - var e = new Zotero.HTTP.StatusError(xmlhttp, url); - if (options.successCodes === false) { - deferred.resolve(xmlhttp); - } else { - deferred.reject(e); - } - }; - xmlhttp.ontimeout = function() { - var e = new Zotero.HTTP.TimeoutError(xmlhttp.timeout); - Zotero.logError(e); - deferred.reject(e); - }; - return deferred.promise; - }; -} diff --git a/zotero-connectors/src/translate/example/index.html b/zotero-connectors/src/translate/example/index.html deleted file mode 100644 index ccb8e3f2..00000000 --- a/zotero-connectors/src/translate/example/index.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - Zotero Translate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    -
    
    -
    -
    diff --git a/zotero-connectors/src/translate/example/index.js b/zotero-connectors/src/translate/example/index.js
    deleted file mode 100644
    index 4a0a5c77..00000000
    --- a/zotero-connectors/src/translate/example/index.js
    +++ /dev/null
    @@ -1,108 +0,0 @@
    -/*
    -	***** BEGIN LICENSE BLOCK *****
    -	
    -	Copyright © 2019 Center for History and New Media
    -					George Mason University, Fairfax, Virginia, USA
    -					http://zotero.org
    -	
    -	This file is part of Zotero.
    -	
    -	Zotero is free software: you can redistribute it and/or modify
    -	it under the terms of the GNU Affero General Public License as published by
    -	the Free Software Foundation, either version 3 of the License, or
    -	(at your option) any later version.
    -	
    -	Zotero is distributed in the hope that it will be useful,
    -	but WITHOUT ANY WARRANTY; without even the implied warranty of
    -	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -	GNU Affero General Public License for more details.
    -
    -	You should have received a copy of the GNU Affero General Public License
    -	along with Zotero.  If not, see .
    -	
    -	***** END LICENSE BLOCK *****
    -*/
    -
    -window.doTranslate = async function translate() {
    -	const url = document.querySelector('#url').value || "https://forums.zotero.org/discussion/80255/available-for-beta-testing-zotero-connector-for-safari-13";
    -	const html = document.querySelector('#html').value;
    -	const doc = addLocationPropToDoc(new DOMParser().parseFromString(html, 'text/html'), url);
    -
    -	// Set up a translate instance
    -	const translate = new Zotero.Translate.Web();
    -	translate.setDocument(doc);
    -	// TODO: Manage cookies
    -	// translate.setCookieSandbox(cookieSandbox);
    -
    -	// Get translators
    -	let translators;
    -	try {
    -		translators = await translate.getTranslators();
    -	} catch (e) {
    -		Zotero.logError(e);
    -		setResult(e);
    -		return;
    -	}
    -
    -	if (!translators.length) {
    -		setResult(`No translators available for ${url}`);
    -	}
    -
    -	// set handlers for translation
    -	translate.setHandler("select", (translate, item, callback) => {
    -
    -		setResult("select handler called: "+ JSON.stringify(item));
    -		setTimeout(() => callback(item), 3000);
    -	});
    -		
    -	translate.setHandler("error", function(obj, err) {
    -		setResult(err);
    -		Zotero.logError(err);
    -	});
    -
    -	let items = await translate.translate();
    -	setResult(JSON.stringify(items));
    -};
    -
    -function setResult(str) {
    -	document.querySelector('#result').innerHTML = str.toString();
    -}
    -
    -function addLocationPropToDoc(doc, docURL) {
    -	docURL = new URL(docURL);
    -	docURL.toString = () => this.href;
    -	var wrappedDoc = new Proxy(doc, {
    -		get: function (t, prop) {
    -			if (prop === 'location') {
    -				return docURL;
    -			}
    -			else if (prop == 'evaluate') {
    -				// If you pass the document itself into doc.evaluate as the second argument
    -				// it fails, because it receives a proxy, which isn't of type `Node` for some reason.
    -				// Native code magic.
    -				return function() {
    -					if (arguments[1] == wrappedDoc) {
    -						arguments[1] = t;
    -					}
    -					return t.evaluate.apply(t, arguments)
    -				}
    -			}
    -			else {
    -				if (typeof t[prop] == 'function') {
    -					return t[prop].bind(t);
    -				}
    -				return t[prop];
    -			}
    -		}
    -	});
    -	return wrappedDoc;
    -};
    -
    -window.addEventListener('DOMContentLoaded', async function() {
    -	Zotero.Debug.init(1);
    -	await Zotero.Translators.init();
    -	let xhr = await Zotero.HTTP.request('GET', 'https://api.zotero.org/schema', { responseType: 'json' });
    -	Zotero.Schema.init(xhr.response);
    -	xhr = await Zotero.HTTP.request('GET', '../modules/utilities/resource/dateFormats.json', { responseType: 'json' });
    -	Zotero.Date.init(xhr.response);
    -});
    \ No newline at end of file
    diff --git a/zotero-connectors/src/translate/example/translate_item.js b/zotero-connectors/src/translate/example/translate_item.js
    deleted file mode 100644
    index 358da1d9..00000000
    --- a/zotero-connectors/src/translate/example/translate_item.js
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -/*
    -	***** BEGIN LICENSE BLOCK *****
    -	
    -	Copyright © 2021 Corporation for Digital Scholarship
    -                     Vienna, Virginia, USA
    -					http://zotero.org
    -	
    -	This file is part of Zotero.
    -	
    -	Zotero is free software: you can redistribute it and/or modify
    -	it under the terms of the GNU Affero General Public License as published by
    -	the Free Software Foundation, either version 3 of the License, or
    -	(at your option) any later version.
    -	
    -	Zotero is distributed in the hope that it will be useful,
    -	but WITHOUT ANY WARRANTY; without even the implied warranty of
    -	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -	GNU Affero General Public License for more details.
    -
    -	You should have received a copy of the GNU Affero General Public License
    -	along with Zotero.  If not, see .
    -	
    -	***** END LICENSE BLOCK *****
    -*/
    -
    -Zotero.Translate.ItemSaver.prototype.saveItems = async function (jsonItems) {
    -	this.items = (this.items || []).concat(jsonItems);
    -	return jsonItems
    -}
    \ No newline at end of file
    diff --git a/zotero-connectors/src/translate/example/translators.js b/zotero-connectors/src/translate/example/translators.js
    deleted file mode 100644
    index eafccd45..00000000
    --- a/zotero-connectors/src/translate/example/translators.js
    +++ /dev/null
    @@ -1,130 +0,0 @@
    -/*
    -	***** BEGIN LICENSE BLOCK *****
    -	
    -	Copyright © 2021 Corporation for Digital Scholarship
    -                     Vienna, Virginia, USA
    -					http://zotero.org
    -	
    -	This file is part of Zotero.
    -	
    -	Zotero is free software: you can redistribute it and/or modify
    -	it under the terms of the GNU Affero General Public License as published by
    -	the Free Software Foundation, either version 3 of the License, or
    -	(at your option) any later version.
    -	
    -	Zotero is distributed in the hope that it will be useful,
    -	but WITHOUT ANY WARRANTY; without even the implied warranty of
    -	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -	GNU Affero General Public License for more details.
    -
    -	You should have received a copy of the GNU Affero General Public License
    -	along with Zotero.  If not, see .
    -	
    -	***** END LICENSE BLOCK *****
    -*/
    -
    -// Enumeration of types of translators
    -window.TRANSLATOR_TYPES = {"import":1, "export":2, "web":4, "search":8};
    -
    -window.TRANSLATOR_CACHING_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES.concat(["browserSupport", "targetAll"]);
    -
    -/**
    - * Singleton to handle loading and caching of translators
    - * @namespace
    - */
    -Zotero.Translators = Object.assign(Zotero.Translators, new function() {
    -	this._cache = {"import":[], "export":[], "web":[], "search":[]};
    -	this._initialized = false;
    -	
    -	/**
    -	 * Initializes translator cache, loading all relevant translators into memory
    -	 * @param {Zotero.Translate[]} [translators] List of translators. If not specified, it will be
    -	 *                                           retrieved from storage.
    -	 */
    -	this.init = async function() {
    -		var translators = await Zotero.Repo.getAllTranslatorMetadata();
    -		
    -		this._cache = {"import":[], "export":[], "web":[], "search":[]};
    -		_translators = {};
    -		
    -		// Build caches
    -		for(var i=0; i b.priority) {
    -				return 1;
    -			}
    -			else if (a.priority < b.priority) {
    -				return -1;
    -			}
    -		}
    -		for(var type in this._cache) {
    -			this._cache[type].sort(cmp);
    -		}
    -		this._initialized = true;
    -	}
    -
    -	/**
    -	 * Gets the translator code that corresponds to a given ID
    -	 * @param {Zotero.Translator} translator
    -	 * @return {String} translator code
    -	 */
    -	this.getCodeForTranslator = Zotero.Promise.method(async function (translator) {
    -		if (translator.code) return translator.code;
    -		let code = await Zotero.Repo.getTranslatorCode(translator.translatorID);
    -		translator.code = code;
    -		return code;
    -	});
    -	
    -	/**
    -	 * Gets the translator that corresponds to a given ID
    -	 *
    -	 * @param {String} id The ID of the translator
    -	 */
    -	this.get = async function (id) {
    -		if (!this._initialized) await Zotero.Translators.init();
    -		var translator = _translators[id];
    -		if (!translator) {
    -			return false;
    -		}
    -		
    -		// only need to get code if it is of some use
    -		if (translator.runMode === Zotero.Translator.RUN_MODE_IN_BROWSER
    -				&& !translator.hasOwnProperty("code")) {
    -				
    -			translator.code = await Zotero.Translators.getCodeForTranslator(translator);
    -			return translator;
    -		} else {
    -			return translator;
    -		}
    -	};
    -	
    -	/**
    -	 * Gets all translators for a specific type of translation
    -	 * @param {String} type The type of translators to get (import, export, web, or search)
    -	 */
    -	this.getAllForType = async function (type) {
    -		if(!this._initialized) await Zotero.Translators.init();
    -		var translators = this._cache[type].slice(0);
    -		var codeGetter = new Zotero.Translators.CodeGetter(translators);
    -		await codeGetter.getAll();
    -		return translators;
    -	};
    -});
    diff --git a/zotero-connectors/src/translate/modules/utilities b/zotero-connectors/src/translate/modules/utilities
    deleted file mode 160000
    index 44f9c8dd..00000000
    --- a/zotero-connectors/src/translate/modules/utilities
    +++ /dev/null
    @@ -1 +0,0 @@
    -Subproject commit 44f9c8dd253627e35ba6e7932e92dc6c40f206a2
    diff --git a/zotero-connectors/src/translate/src/debug.js b/zotero-connectors/src/translate/src/debug.js
    deleted file mode 100644
    index 68a2ad4f..00000000
    --- a/zotero-connectors/src/translate/src/debug.js
    +++ /dev/null
    @@ -1,186 +0,0 @@
    -/*
    -    ***** BEGIN LICENSE BLOCK *****
    -    
    -    Copyright © 2009 Center for History and New Media
    -                     George Mason University, Fairfax, Virginia, USA
    -                     http://zotero.org
    -    
    -    This file is part of Zotero.
    -    
    -    Zotero is free software: you can redistribute it and/or modify
    -    it under the terms of the GNU Affero General Public License as published by
    -    the Free Software Foundation, either version 3 of the License, or
    -    (at your option) any later version.
    -    
    -    Zotero is distributed in the hope that it will be useful,
    -    but WITHOUT ANY WARRANTY; without even the implied warranty of
    -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -    GNU Affero General Public License for more details.
    -    
    -    You should have received a copy of the GNU Affero General Public License
    -    along with Zotero.  If not, see .
    -    
    -    ***** END LICENSE BLOCK *****
    -*/
    -
    -Zotero.Debug = new function () {
    -	var _console, _store, _level, _lastTime, _output = [];
    -	var _slowTime = false;
    -	var _consoleViewer = false;
    -	
    -	/**
    -	 * Initialize debug logging
    -	 */
    -	this.init = function (enabled=true) {
    -		this.enabled = enabled;
    -	}
    -	
    -	this.log = function (message, level, maxDepth, stack) {
    -		if (!this.enabled) {
    -			return;
    -		}
    -		
    -		if (typeof message != 'string') {
    -			message = Zotero.Utilities.varDump(message, 0, maxDepth);
    -		}
    -		
    -		if (!level) {
    -			level = 3;
    -		}
    -		
    -		// If level above debug.level value, don't display
    -		if (level > _level) {
    -			return;
    -		}
    -		
    -		var deltaStr = '';
    -		var deltaStrStore = '';
    -		var delta = 0;
    -		var d = new Date();
    -		if (_lastTime) {
    -			delta = d - _lastTime;
    -		}
    -		_lastTime = d;
    -		var slowPrefix = "";
    -		var slowSuffix = "";
    -		if (_slowTime && delta > _slowTime) {
    -			slowPrefix = "\x1b[31;40m";
    -			slowSuffix = "\x1b[0m";
    -		}
    -		
    -		delta = ("" + delta).padStart(7, "0");
    -		
    -		deltaStr = "(" + slowPrefix + "+" + delta + slowSuffix + ")";
    -		if (_store) {
    -			deltaStrStore = "(+" + delta + ")";
    -		}
    -		
    -		if (stack === true) {
    -			stack = new Error().stack.substr('Error'.length);
    -		}
    -		
    -		if (stack) {
    -			message += '\n' + this.stackToString(stack);
    -		}
    -		
    -		var output = '(' + level + ')' + deltaStr + ': ' + message;
    -		console.log(output+"\n");
    -		
    -		if (_store) {
    -			if (Math.random() < 1/1000) {
    -				// Remove initial lines if over limit
    -				var overage = this.count() - Zotero.Prefs.get('debug.store.limit');
    -				if (overage > 0) {
    -					_output.splice(0, Math.abs(overage));
    -				}
    -			}
    -			_output.push('(' + level + ')' + deltaStrStore + ': ' + message);
    -		}
    -	}
    -	
    -	
    -	this.get = Zotero.Promise.method(function(maxChars, maxLineLength) {
    -		var output = _output;
    -		var total = output.length;
    -		
    -		if (total == 0) {
    -			return "";
    -		}
    -		
    -		if (maxLineLength) {
    -			for (var i=0, len=output.length; i maxLineLength) {
    -					output[i] = Zotero.Utilities.ellipsize(output[i], maxLineLength, false, true);
    -				}
    -			}
    -		}
    -		
    -		output = output.join('\n\n');
    -		
    -		if (maxChars) {
    -			output = output.substr(maxChars * -1);
    -			// Cut at two newlines
    -			let matches = output.match(/^[\n]*\n\n/);
    -			if (matches) {
    -				output = output.substr(matches[0].length);
    -			}
    -		}
    -
    -		return output;
    -	});
    -	
    -	
    -	this.setStore = function (enable) {
    -		if (enable) {
    -			this.clear();
    -		}
    -		_store = enable;
    -		this.updateEnabled();
    -		this.storing = _store;
    -	}
    -	
    -	
    -	this.updateEnabled = function () {
    -		this.enabled = _console || _consoleViewer || _store;
    -	};
    -	
    -	
    -	this.count = function () {
    -		return _output.length;
    -	}
    -	
    -	
    -	this.clear = function () {
    -		_output = [];
    -	}
    -	
    -	/**
    -	 * Format a stack trace for output in the same way that Error.stack does
    -	 * @param {Components.stack} stack
    -	 * @param {Integer} [lines=5] Number of lines to format
    -	 */
    -	this.stackToString = function (stack, lines) {
    -		if (!lines) lines = 5;
    -		var str = '';
    -		while(stack && lines--) {
    -			str += '\n  ' + (stack.name || '') + '@' + stack.filename
    -				+ ':' + stack.lineNumber;
    -			stack = stack.caller;
    -		}
    -		return this.filterStack(str).substr(1);
    -	};
    -	
    -	
    -	/**
    -	 * Strip Bluebird lines from a stack trace
    -	 *
    -	 * @param {String} stack
    -	 */
    -	this.filterStack = function (stack) {
    -		return stack.split(/\n/).filter(line => line.indexOf('zotero/bluebird') == -1).join('\n');
    -	}
    -}
    -
    -if (typeof process === 'object' && process + '' === '[object process]'){
    -	module.exports = Zotero.Debug;
    -}
    diff --git a/zotero-connectors/src/translate/src/http.js b/zotero-connectors/src/translate/src/http.js
    deleted file mode 100644
    index 988a8d36..00000000
    --- a/zotero-connectors/src/translate/src/http.js
    +++ /dev/null
    @@ -1,145 +0,0 @@
    -/*
    -    ***** BEGIN LICENSE BLOCK *****
    -    
    -    Copyright © 2011 Center for History and New Media
    -                     George Mason University, Fairfax, Virginia, USA
    -                     http://zotero.org
    -    
    -    This file is part of Zotero.
    -    
    -    Zotero is free software: you can redistribute it and/or modify
    -    it under the terms of the GNU Affero General Public License as published by
    -    the Free Software Foundation, either version 3 of the License, or
    -    (at your option) any later version.
    -    
    -    Zotero is distributed in the hope that it will be useful,
    -    but WITHOUT ANY WARRANTY; without even the implied warranty of
    -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -    GNU Affero General Public License for more details.
    -    
    -    You should have received a copy of the GNU Affero General Public License
    -    along with Zotero.  If not, see .
    -    
    -    ***** END LICENSE BLOCK *****
    -*/
    -
    -/**
    - * Functions for performing HTTP requests, both via XMLHTTPRequest and using a hidden browser
    - * @namespace
    - */
    -Zotero.HTTP = new function() {
    -	this.StatusError = function(xmlhttp, url) {
    -		this.message = `HTTP request to ${url} rejected with status ${xmlhttp.status}`;
    -		this.status = xmlhttp.status;
    -		try {
    -			this.responseText = typeof xmlhttp.responseText == 'string' ? xmlhttp.responseText : undefined;
    -		} catch (e) {}
    -	};
    -	this.StatusError.prototype = Object.create(Error.prototype);
    -
    -	this.TimeoutError = function(ms) {
    -		this.message = `HTTP request has timed out after ${ms}ms`;
    -	};
    -	this.TimeoutError.prototype = Object.create(Error.prototype);
    -	
    -	/**
    -	 * Get a promise for a HTTP request
    -	 *
    -	 * @param {String} method The method of the request ("GET", "POST", "HEAD", or "OPTIONS")
    -	 * @param {String}	url				URL to request
    -	 * @param {Object} [options] Options for HTTP request:
      - *
    • body - The body of a POST request
    • - *
    • headers - Object of HTTP headers to send with the request
    • - *
    • debug - Log response text and status code
    • - *
    • logBodyLength - Length of request body to log
    • - *
    • timeout - Request timeout specified in milliseconds [default 15000]
    • - *
    • responseType - The response type of the request from the XHR spec
    • - *
    • responseCharset - The charset the response should be interpreted as
    • - *
    • successCodes - HTTP status codes that are considered successful, or FALSE to allow all
    • - *
    - * @return {Promise} A promise resolved with the XMLHttpRequest object if the - * request succeeds, or rejected if the browser is offline or a non-2XX status response - * code is received (or a code not in options.successCodes if provided). - */ - this.request = async function(method, url, options = {}) { - // Default options - options = Object.assign({ - body: null, - headers: {}, - debug: false, - logBodyLength: 1024, - timeout: 15000, - responseType: '', - responseCharset: null, - successCodes: null - }, options); - - throw new Error(`Zotero.HTTP.request(): not implemented`); - }; - /** - * Send an HTTP GET request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} responseCharset - * @param {N/A} cookieSandbox Not used in Connector - * @param {Object} headers HTTP headers to include with the request - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doGet = function(url, onDone, responseCharset, cookieSandbox, headers) { - Zotero.debug('Zotero.HTTP.doGet is deprecated. Use Zotero.HTTP.request'); - this.request('GET', url, {responseCharset, headers}) - .then(onDone, function(e) { - onDone({status: e.status, responseText: e.responseText}); - throw (e); - }); - return true; - }; - - /** - * Send an HTTP POST request via XMLHTTPRequest - * - * @deprecated Use {@link Zotero.HTTP.request} - * @param {String} url URL to request - * @param {String|Object[]} body Request body - * @param {Function} onDone Callback to be executed upon request completion - * @param {String} headers Request HTTP headers - * @param {String} responseCharset - * @return {Boolean} True if the request was sent, or false if the browser is offline - */ - this.doPost = function(url, body, onDone, headers, responseCharset) { - Zotero.debug('Zotero.HTTP.doPost is deprecated. Use Zotero.HTTP.request'); - this.request('POST', url, {body, responseCharset, headers}) - .then(onDone, function(e) { - onDone({status: e.status, responseText: e.responseText}); - throw (e); - }); - return true; - }; - - - /** - * Load one or more documents - * - * @param {String|String[]} urls - URL(s) of documents to load - * @param {Function} processor - Callback to be executed for each document loaded - * @param {Object} options.headers Headers object - * @param {CookieJar} options.cookieSandbox Cookie sandbox object - * @return {Promise} - A promise for an array of results from the processor runs - */ - this.processDocuments = async function (urls, processor, options = {}) { - // Handle old signature: urls, processor, onDone, onError - if (arguments.length > 3) { - Zotero.debug("Zotero.HTTP.processDocuments() now takes only 2 arguments -- update your code"); - var onDone = arguments[3]; - var onError = arguments[4]; - } - - throw new Error(`Zotero.HTTP.processDocuments(): not implemented`); - }; -}; - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = Zotero.HTTP; -} diff --git a/zotero-connectors/src/translate/src/promise.js b/zotero-connectors/src/translate/src/promise.js deleted file mode 100644 index 6fb076c4..00000000 --- a/zotero-connectors/src/translate/src/promise.js +++ /dev/null @@ -1,73 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/* - * Polyfill some of bluebirds methods to retain code readability in shared - * translator code. - */ - -Zotero.Promise = Promise; - -Zotero.Promise.method = function(fn) { - return function() { - try { - var val = fn.apply(this, arguments); - var promise; - let isResolved = false; - if (val && val.then) { - promise = val; - } else { - promise = Promise.resolve(val); - isResolved = true; - } - if (typeof promise.isResolved === 'undefined') { - promise.then(() => isResolved = true); - promise.isResolved = () => isResolved; - } - return promise; - } catch (e) { - return Promise.reject(e); - } - } -}; - -Zotero.Promise.defer = function() { - var deferred = {}; - deferred.promise = new Promise(function(resolve, reject) { - deferred.resolve = resolve; - deferred.reject = reject; - }); - return deferred; -} - -Zotero.Promise.delay = function (timeout) { - return new Promise(function (resolve) { - setTimeout(resolve, timeout); - }); -} - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = Zotero.Promise; -} diff --git a/zotero-connectors/src/translate/src/proxy.js b/zotero-connectors/src/translate/src/proxy.js deleted file mode 100644 index 65d697c3..00000000 --- a/zotero-connectors/src/translate/src/proxy.js +++ /dev/null @@ -1,345 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2016 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -/** - * Intercepts web requests to detect and redirect proxies. Loosely based on Zotero for Firefox proxy code. - * - */ - -(function() { - -"use strict"; - -Zotero.Proxies = new function() { - - /** - * Check the url for potential proxies and deproxify, providing a schema to build - * a proxy object. - * - * @param URL - * @returns {Object} Unproxied url to proxy object - */ - this.getPotentialProxies = function(URL) { - var urlToProxy = {}; - // If it's a known proxied URL just return it - if (Zotero.Proxies.transparent) { - for (var proxy of Zotero.Proxies.proxies) { - if (proxy.regexp) { - var m = proxy.regexp.exec(URL); - if (m) { - let proper = proxy.toProper(m); - urlToProxy[proper] = proxy.toJSON(); - return urlToProxy; - } - } - } - } - urlToProxy[URL] = null; - - // if there is a subdomain that is also a TLD, also test against URI with the domain - // dropped after the TLD - // (i.e., www.nature.com.mutex.gmu.edu => www.nature.com) - var m = /^(https?:\/\/)([^\/]+)/i.exec(URL); - if (m) { - // First, drop the 0- if it exists (this is an III invention) - var host = m[2]; - if (host.substr(0, 2) === "0-") host = host.substr(2); - var hostnameParts = [host.split(".")]; - if (m[1] == 'https://') { - // try replacing hyphens with dots for https protocol - // to account for EZProxy HttpsHypens mode - hostnameParts.push(host.split('.')); - hostnameParts[1].splice(0, 1, ...(hostnameParts[1][0].replace(/-/g, '.').split('.'))); - } - - for (let i=0; i < hostnameParts.length; i++) { - let parts = hostnameParts[i]; - // If hostnameParts has two entries, then the second one is with replaced hyphens - let dotsToHyphens = i == 1; - // skip the lowest level subdomain, domain and TLD - for (let j=1; j=0; i--) { - var param = this.parameters[i]; - re = re.replace(Zotero_Proxy_schemeParameterRegexps[param], "$1"+Zotero_Proxy_schemeParameters[param]); - } - - this.regexp = new RegExp(re); -} - -/** - * Converts a proxied URL to an unproxied URL using this proxy - * - * @param m {Array} The match from running this proxy's regexp against a URL spec - * @type String - */ -Zotero.Proxy.prototype.toProper = function(m) { - if (!Array.isArray(m)) { - let match = this.regexp.exec(m); - if (!match) { - return m - } else { - m = match; - } - } - let hostIdx = this.parameters.indexOf("%h"); - let scheme = m[0].indexOf('https') == 0 ? 'https://' : 'http://'; - if (hostIdx != -1) { - var properURL = scheme+m[hostIdx+1]+"/"; - } else { - var properURL = scheme+this.hosts[0]+"/"; - } - - // Replace `-` with `.` in https to support EZProxy HttpsHyphens. - // Potentially troublesome with domains that contain dashes - if (this.dotsToHyphens || - (this.dotsToHyphens == undefined && scheme == "https://") || - !properURL.includes('.')) { - properURL = properURL.replace(/-/g, '.'); - } - - if (this.indices["%p"]) { - properURL += m[this.parameters.indexOf("%p")+1]; - } else { - var dir = m[this.parameters.indexOf("%d")+1]; - var file = m[this.parameters.indexOf("%f")+1]; - if (dir !== "") properURL += dir+"/"; - properURL += file; - } - - return properURL; -} - -/** - * Converts an unproxied URL to a proxied URL using this proxy - * - * @param {Object|String} uri The URI corresponding to the unproxied URL - * @type String - */ -Zotero.Proxy.prototype.toProxy = function(uri) { - if (typeof uri == "string") { - uri = new URL(uri); - } - if (this.regexp.exec(uri.href) || Zotero.Proxies._isBlacklisted(uri.hostname)) { - return uri.href; - } - var proxyURL = this.scheme; - - for(var i=this.parameters.length-1; i>=0; i--) { - var param = this.parameters[i]; - var value = ""; - if (param == "%h") { - value = (this.dotsToHyphens && uri.protocol == 'https:') ? uri.hostname.replace(/\./g, '-') : uri.hostname; - } else if (param == "%p") { - value = uri.pathname.substr(1); - } else if (param == "%d") { - value = uri.pathname.substr(0, uri.path.lastIndexOf("/")); - } else if (param == "%f") { - value = uri.pathname.substr(uri.path.lastIndexOf("/")+1) - } - - proxyURL = proxyURL.substr(0, this.indices[param])+value+proxyURL.substr(this.indices[param]+2); - } - - if (proxyURL.includes('://')) { - return proxyURL; - } - return uri.protocol + '//' + proxyURL; -} - -/** - * Generate a display name for the proxy (e.g., "proxy.example.edu (HTTPS)") - * - * @return {String} - */ -Zotero.Proxy.prototype.toDisplayName = function () { - try { - var parts = this.scheme.match(/^(?:(?:[^:]+):\/\/)?([^\/]+)/); - var domain = parts[1] - // Include part after %h, if it's present - .split('%h').pop() - // Trim leading punctuation after the %h - .match(/\W(.+)/)[1]; - return domain; - } - catch (e) { - Zotero.logError(`Invalid proxy ${this.scheme}: ${e}`); - return this.scheme; - } -} - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = { Proxy: Zotero.Proxy, Proxies: Zotero.Proxies }; -} - -})(); diff --git a/zotero-connectors/src/translate/src/rdf/identity.js b/zotero-connectors/src/translate/src/rdf/identity.js deleted file mode 100644 index aebdff6c..00000000 --- a/zotero-connectors/src/translate/src/rdf/identity.js +++ /dev/null @@ -1,503 +0,0 @@ -// Identity management and indexing for RDF -// -// This file provides IndexedFormula a formula (set of triples) which -// indexed by predicate, subject and object. -// -// It "smushes" (merges into a single node) things which are identical -// according to owl:sameAs or an owl:InverseFunctionalProperty -// or an owl:FunctionalProperty -// -// -// 2005-10 Written Tim Berners-Lee -// 2007 Changed so as not to munge statements from documents when smushing -// -// -/*jsl:option explicit*/ -// Turn on JavaScriptLint variable declaration checking - -if (typeof process === 'object' && process + '' === '[object process]'){ - this.$rdf = require('./init'); -} - -$rdf.IndexedFormula = function () { - - var owl_ns = "http://www.w3.org/2002/07/owl#"; - // var link_ns = "http://www.w3.org/2007/ont/link#"; - /* hashString functions are used as array indeces. This is done to avoid - ** conflict with existing properties of arrays such as length and map. - ** See issue 139. - */ - $rdf.Literal.prototype.hashString = $rdf.Literal.prototype.toNT; - $rdf.Symbol.prototype.hashString = $rdf.Symbol.prototype.toNT; - $rdf.BlankNode.prototype.hashString = $rdf.BlankNode.prototype.toNT; - $rdf.Collection.prototype.hashString = $rdf.Collection.prototype.toNT; - - - //Stores an associative array that maps URIs to functions - $rdf.IndexedFormula = function (features) { - this.statements = []; // As in Formula - this.optional = []; - this.propertyActions = []; // Array of functions to call when getting statement with {s X o} - //maps to [f(F,s,p,o),...] - this.classActions = []; // Array of functions to call when adding { s type X } - this.redirections = []; // redirect to lexically smaller equivalent symbol - this.aliases = []; // reverse mapping to redirection: aliases for this - this.HTTPRedirects = []; // redirections we got from HTTP - this.subjectIndex = []; // Array of statements with this X as subject - this.predicateIndex = []; // Array of statements with this X as subject - this.objectIndex = []; // Array of statements with this X as object - this.whyIndex = []; // Array of statements with X as provenance - this.index = [this.subjectIndex, this.predicateIndex, this.objectIndex, this.whyIndex]; - this.namespaces = {} // Dictionary of namespace prefixes - if(features === undefined) features = ["sameAs", - "InverseFunctionalProperty", "FunctionalProperty"]; - // this.features = features - // Callbackify? - function handleRDFType(formula, subj, pred, obj, why) { - if(formula.typeCallback != undefined) - formula.typeCallback(formula, obj, why); - - var x = formula.classActions[obj.hashString()]; - var done = false; - if(x) { - for(var i = 0; i < x.length; i++) { - done = done || x[i](formula, subj, pred, obj, why); - } - } - return done; // statement given is not needed if true - } //handleRDFType - //If the predicate is #type, use handleRDFType to create a typeCallback on the object - this.propertyActions[''] = [handleRDFType]; - - // Assumption: these terms are not redirected @@fixme - if($rdf.Util.ArrayIndexOf(features, "sameAs") >= 0) - this.propertyActions[''] = [ - function (formula, subj, pred, obj, why) { - // $rdf.log("Equating "+subj.uri+" sameAs "+obj.uri); //@@ - formula.equate(subj, obj); - return true; // true if statement given is NOT needed in the store - }]; //sameAs -> equate & don't add to index - if($rdf.Util.ArrayIndexOf(features, "InverseFunctionalProperty") >= 0) - this.classActions["<" + owl_ns + "InverseFunctionalProperty>"] = [ - function (formula, subj, pred, obj, addFn) { - return formula.newPropertyAction(subj, handle_IFP); // yes subj not pred! - }]; //IFP -> handle_IFP, do add to index - if($rdf.Util.ArrayIndexOf(features, "FunctionalProperty") >= 0) - this.classActions["<" + owl_ns + "FunctionalProperty>"] = [ - function (formula, subj, proj, obj, addFn) { - return formula.newPropertyAction(subj, handle_FP); - } - ]; //FP => handleFP, do add to index - function handle_IFP(formula, subj, pred, obj) { - var s1 = formula.any(undefined, pred, obj); - if(s1 == undefined) return false; // First time with this value - // $rdf.log("Equating "+s1.uri+" and "+subj.uri + " because IFP "+pred.uri); //@@ - formula.equate(s1, subj); - return true; - } //handle_IFP - function handle_FP(formula, subj, pred, obj) { - var o1 = formula.any(subj, pred, undefined); - if(o1 == undefined) return false; // First time with this value - // $rdf.log("Equating "+o1.uri+" and "+obj.uri + " because FP "+pred.uri); //@@ - formula.equate(o1, obj); - return true; - } //handle_FP - } /* end IndexedFormula */ - - $rdf.IndexedFormula.prototype = new $rdf.Formula(); - $rdf.IndexedFormula.prototype.constructor = $rdf.IndexedFormula; - $rdf.IndexedFormula.SuperClass = $rdf.Formula; - - $rdf.IndexedFormula.prototype.newPropertyAction = function newPropertyAction(pred, action) { - //$rdf.log("newPropertyAction: "+pred); - var hash = pred.hashString(); - if(this.propertyActions[hash] == undefined) - this.propertyActions[hash] = []; - this.propertyActions[hash].push(action); - // Now apply the function to to statements already in the store - var toBeFixed = this.statementsMatching(undefined, pred, undefined); - var done = false; - for(var i = 0; i < toBeFixed.length; i++) { // NOT optimized - sort toBeFixed etc - done = done || action(this, toBeFixed[i].subject, pred, toBeFixed[i].object); - } - return done; - } - - $rdf.IndexedFormula.prototype.setPrefixForURI = function (prefix, nsuri) { - //TODO:This is a hack for our own issues, which ought to be fixed post-release - //See http://dig.csail.mit.edu/cgi-bin/roundup.cgi/$rdf/issue227 - if(prefix == "tab" && this.namespaces["tab"]) { - return; - } - this.namespaces[prefix] = nsuri - } - - // Deprocated ... name too generic - $rdf.IndexedFormula.prototype.register = function (prefix, nsuri) { - this.namespaces[prefix] = nsuri - } - - - /** simplify graph in store when we realize two identifiers are equivalent - -We replace the bigger with the smaller. - -*/ - $rdf.IndexedFormula.prototype.equate = function (u1, u2) { - // $rdf.log("Equating "+u1+" and "+u2); // @@ - //@@JAMBO Must canonicalize the uris to prevent errors from a=b=c - //03-21-2010 - u1 = this.canon(u1); - u2 = this.canon(u2); - var d = u1.compareTerm(u2); - if(!d) return true; // No information in {a = a} - var big, small; - if(d < 0) { // u1 less than u2 - return this.replaceWith(u2, u1); - } else { - return this.replaceWith(u1, u2); - } - } - - // Replace big with small, obsoleted with obsoleting. - // - $rdf.IndexedFormula.prototype.replaceWith = function (big, small) { - //$rdf.log("Replacing "+big+" with "+small) // @@ - var oldhash = big.hashString(); - var newhash = small.hashString(); - - var moveIndex = function (ix) { - var oldlist = ix[oldhash]; - if(oldlist == undefined) return; // none to move - var newlist = ix[newhash]; - if(newlist == undefined) { - ix[newhash] = oldlist; - } else { - ix[newhash] = oldlist.concat(newlist); - } - delete ix[oldhash]; - } - - // the canonical one carries all the indexes - for(var i = 0; i < 4; i++) { - moveIndex(this.index[i]); - } - - this.redirections[oldhash] = small; - if(big.uri) { - //@@JAMBO: must update redirections,aliases from sub-items, too. - if(this.aliases[newhash] == undefined) - this.aliases[newhash] = []; - this.aliases[newhash].push(big); // Back link - if(this.aliases[oldhash]) { - for(var i = 0; i < this.aliases[oldhash].length; i++) { - this.redirections[this.aliases[oldhash][i].hashString()] = small; - this.aliases[newhash].push(this.aliases[oldhash][i]); - } - } - - //this.add(small, this.sym('http://www.w3.org/2007/ont/link#uri'), big.uri) - - // If two things are equal, and one is requested, we should request the other. - if(this.sf) { - this.sf.nowKnownAs(big, small) - } - } - - moveIndex(this.classActions); - moveIndex(this.propertyActions); - - $rdf.log("Equate done. "+big+" now links to "+small) - return true; // true means the statement does not need to be put in - }; - - // Return the symbol with canonical URI as smushed - $rdf.IndexedFormula.prototype.canon = function (term) { - if(term == undefined) return term; - var y = this.redirections[term.hashString()]; - if(y == undefined) return term; - return y; - } - - // Compare by canonical URI as smushed - $rdf.IndexedFormula.prototype.sameThings = function (x, y) { - if(x.sameTerm(y)) return true; - var x1 = this.canon(x); - // $rdf.log('x1='+x1); - if(x1 == undefined) return false; - var y1 = this.canon(y); - // $rdf.log('y1='+y1); //@@ - if(y1 == undefined) return false; - return(x1.uri == y1.uri); - } - - // A list of all the URIs by which this thing is known - $rdf.IndexedFormula.prototype.uris = function (term) { - var cterm = this.canon(term) - var terms = this.aliases[cterm.hashString()]; - if(!cterm.uri) return [] - var res = [cterm.uri] - if(terms != undefined) { - for(var i = 0; i < terms.length; i++) { - res.push(terms[i].uri) - } - } - return res - } - - // On input parameters, convert constants to terms - // - function RDFMakeTerm(formula, val, canonicalize) { - if(typeof val != 'object') { - if(typeof val == 'string') - return new $rdf.Literal(val); - if(typeof val == 'number') - return new $rdf.Literal(val); // @@ differet types - if(typeof val == 'boolean') - return new $rdf.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean); - if(typeof val == 'undefined') - return undefined; - else // @@ add converting of dates and numbers - throw "Can't make Term from " + val + " of type " + typeof val; - } - return val; - } - - // Add a triple to the store - // - // Returns the statement added - // (would it be better to return the original formula for chaining?) - // - $rdf.IndexedFormula.prototype.add = function (subj, pred, obj, why) { - var actions, st; - if(why == undefined) why = this.fetcher ? this.fetcher.appNode : this.sym("chrome:theSession"); //system generated - //defined in source.js, is this OK with identity.js only user? - subj = RDFMakeTerm(this, subj); - pred = RDFMakeTerm(this, pred); - obj = RDFMakeTerm(this, obj); - why = RDFMakeTerm(this, why); - - if(this.predicateCallback != undefined) - this.predicateCallback(this, pred, why); - - // Action return true if the statement does not need to be added - var actions = this.propertyActions[this.canon(pred).hashString()]; - var done = false; - if(actions) { - // $rdf.log('type: '+typeof actions +' @@ actions='+actions); - for(var i = 0; i < actions.length; i++) { - done = done || actions[i](this, subj, pred, obj, why); - } - } - - //If we are tracking provenanance, every thing should be loaded into the store - //if (done) return new Statement(subj, pred, obj, why); // Don't put it in the store - // still return this statement for owl:sameAs input - var hash = [this.canon(subj).hashString(), this.canon(pred).hashString(), - this.canon(obj).hashString(), this.canon(why).hashString()]; - var st = new $rdf.Statement(subj, pred, obj, why); - for(var i = 0; i < 4; i++) { - var ix = this.index[i]; - var h = hash[i]; - if(ix[h] == undefined) ix[h] = []; - ix[h].push(st); // Set of things with this as subject, etc - } - - //$rdf.log("ADDING {"+subj+" "+pred+" "+obj+"} "+why); - this.statements.push(st); - return st; - }; //add - // Find out whether a given URI is used as symbol in the formula - $rdf.IndexedFormula.prototype.mentionsURI = function (uri) { - var hash = '<' + uri + '>'; - return (!!this.subjectIndex[hash] - || !!this.objectIndex[hash] - || !!this.predicateIndex[hash]); - } - - // Find an unused id for a file being edited: return a symbol - // (Note: Slow iff a lot of them -- could be O(log(k)) ) - $rdf.IndexedFormula.prototype.nextSymbol = function (doc) { - for(var i = 0;; i++) { - var uri = doc.uri + '#n' + i; - if(!this.mentionsURI(uri)) return this.sym(uri); - } - } - - - $rdf.IndexedFormula.prototype.anyStatementMatching = function (subj, pred, obj, why) { - var x = this.statementsMatching(subj, pred, obj, why, true); - if(!x || x == []) return undefined; - return x[0]; - }; - - - // Return statements matching a pattern - // ALL CONVENIENCE LOOKUP FUNCTIONS RELY ON THIS! - $rdf.IndexedFormula.prototype.statementsMatching = function (subj, pred, obj, why, justOne) { - //$rdf.log("Matching {"+subj+" "+pred+" "+obj+"}"); - var pat = [subj, pred, obj, why]; - var pattern = []; - var hash = []; - var wild = []; // wildcards - var given = []; // Not wild - for(var p = 0; p < 4; p++) { - pattern[p] = this.canon(RDFMakeTerm(this, pat[p])); - if(pattern[p] == undefined) { - wild.push(p); - } else { - given.push(p); - hash[p] = pattern[p].hashString(); - } - } - if(given.length == 0) { - return this.statements; - } - if(given.length == 1) { // Easy too, we have an index for that - var p = given[0]; - var list = this.index[p][hash[p]]; - if(list && justOne) { - if(list.length > 1) - list = list.slice(0, 1); - } - return list == undefined ? [] : list; - } - - // Now given.length is 2, 3 or 4. - // We hope that the scale-free nature of the data will mean we tend to get - // a short index in there somewhere! - var best = 1e10; // really bad - var best_i; - for(var i = 0; i < given.length; i++) { - var p = given[i]; // Which part we are dealing with - var list = this.index[p][hash[p]]; - if(list == undefined) return []; // No occurrences - if(list.length < best) { - best = list.length; - best_i = i; // (not p!) - } - } - - // Ok, we have picked the shortest index but now we have to filter it - var best_p = given[best_i]; - var possibles = this.index[best_p][hash[best_p]]; - var check = given.slice(0, best_i).concat(given.slice(best_i + 1)) // remove best_i - var results = []; - var parts = ['subject', 'predicate', 'object', 'why']; - for(var j = 0; j < possibles.length; j++) { - var st = possibles[j]; - for(var i = 0; i < check.length; i++) { // for each position to be checked - var p = check[i]; - if(!this.canon(st[parts[p]]).sameTerm(pattern[p])) { - st = null; - break; - } - } - if(st != null) { - results.push(st); - if(justOne) - break; - } - } - return results; - }; // statementsMatching - /** remove a particular statement from the bank **/ - $rdf.IndexedFormula.prototype.remove = function (st) { - //$rdf.log("entering remove w/ st=" + st); - var term = [st.subject, st.predicate, st.object, st.why]; - for(var p = 0; p < 4; p++) { - var c = this.canon(term[p]); - var h = c.hashString(); - if(this.index[p][h] == undefined) { - //$rdf.log ("Statement removal: no index '+p+': "+st); - } else { - $rdf.Util.RDFArrayRemove(this.index[p][h], st); - } - } - $rdf.Util.RDFArrayRemove(this.statements, st); - }; //remove - /** remove all statements matching args (within limit) **/ - $rdf.IndexedFormula.prototype.removeMany = function (subj, pred, obj, why, limit) { - //$rdf.log("entering removeMany w/ subj,pred,obj,why,limit = " + subj +", "+ pred+", " + obj+", " + why+", " + limit); - var sts = this.statementsMatching(subj, pred, obj, why, false); - //This is a subtle bug that occcured in updateCenter.js too. - //The fact is, this.statementsMatching returns this.whyIndex instead of a copy of it - //but for perfromance consideration, it's better to just do that - //so make a copy here. - var statements = []; - for(var i = 0; i < sts.length; i++) statements.push(sts[i]); - if(limit) statements = statements.slice(0, limit); - for(var i = 0; i < statements.length; i++) this.remove(statements[i]); - }; //removeMany - /** Utility**/ - - /* @method: copyTo - @description: replace @template with @target and add appropriate triples (no triple removed) - one-direction replication -*/ - $rdf.IndexedFormula.prototype.copyTo = function (template, target, flags) { - if(!flags) flags = []; - var statList = this.statementsMatching(template); - if($rdf.Util.ArrayIndexOf(flags, 'two-direction') != -1) - statList.concat(this.statementsMatching(undefined, undefined, template)); - for(var i = 0; i < statList.length; i++) { - var st = statList[i]; - switch(st.object.termType) { - case 'symbol': - this.add(target, st.predicate, st.object); - break; - case 'literal': - case 'bnode': - case 'collection': - this.add(target, st.predicate, st.object.copy(this)); - } - if($rdf.Util.ArrayIndexOf(flags, 'delete') != -1) this.remove(st); - } - }; - //for the case when you alter this.value (text modified in userinput.js) - $rdf.Literal.prototype.copy = function () { - return new $rdf.Literal(this.value, this.lang, this.datatype); - }; - $rdf.BlankNode.prototype.copy = function (formula) { //depends on the formula - var bnodeNew = new $rdf.BlankNode(); - formula.copyTo(this, bnodeNew); - return bnodeNew; - } - /** Full N3 bits -- placeholders only to allow parsing, no functionality! **/ - - $rdf.IndexedFormula.prototype.newUniversal = function (uri) { - var x = this.sym(uri); - if(!this._universalVariables) this._universalVariables = []; - this._universalVariables.push(x); - return x; - } - - $rdf.IndexedFormula.prototype.newExistential = function (uri) { - if(!uri) return this.bnode(); - var x = this.sym(uri); - return this.declareExistential(x); - } - - $rdf.IndexedFormula.prototype.declareExistential = function (x) { - if(!this._existentialVariables) this._existentialVariables = []; - this._existentialVariables.push(x); - return x; - } - - $rdf.IndexedFormula.prototype.formula = function (features) { - return new $rdf.IndexedFormula(features); - } - - $rdf.IndexedFormula.prototype.close = function () { - return this; - } - - $rdf.IndexedFormula.prototype.hashString = $rdf.IndexedFormula.prototype.toNT; - - return $rdf.IndexedFormula; - -}(); - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = $rdf.IndexedFormula; -} diff --git a/zotero-connectors/src/translate/src/rdf/init.js b/zotero-connectors/src/translate/src/rdf/init.js deleted file mode 100644 index 4689d0fe..00000000 --- a/zotero-connectors/src/translate/src/rdf/init.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Comment by Adomas 2018-06-01: - * The history of this RDF parser goes back to 2009. It appears to be cobbled together - * from a couple of libraries, including whatever has become out of - * http://dig.csail.mit.edu/2005/ajar/ajaw/js/rdf/serialize.js, - * which seems to now be https://github.com/linkeddata/rdflib.js - * as well as http://brondsema.net/blog/index.php/2006/11/25/javascript_rdfparser_from_tabulator - * - * We could maybe try to update it, but since 2009 there have been multiple bugfix commits - * https://github.com/zotero/zotero/commits/c9346d4caad8f0b94786408a2b0fb04ccd620fee/chrome/content/zotero/xpcom/rdf - * and we have no tests for those commits, to be able to ensure the library still works as intended - * for every usecase. - * - * I have cleaned this up a bit where possible, e.g. replacing the tabulator and alert log calls - * with $rdf.log (since that's what they linked to anyway), and made it commonjs modular, - * but otherwise we'll stick to this code as it works for our purposes - */ - -var $rdf = { - Util: { - ArrayIndexOf: function (arr, item, i) { - //supported in all browsers except IE<9 - return arr.indexOf(item, i); - }, - RDFArrayRemove: function (a, x) { //removes all statements equal to x from a - for (var i = 0; i < a.length; i++) { - //TODO: This used to be the following, which didnt always work..why - //if(a[i] == x) - if (a[i].subject.sameTerm(x.subject) && a[i].predicate.sameTerm(x.predicate) && a[i].object.sameTerm(x.object) && a[i].why.sameTerm(x.why)) { - a.splice(i, 1); - return; - } - } - throw "RDFArrayRemove: Array did not contain " + x; - } - }, - log: Zotero.debug -}; - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = $rdf; - $rdf.Util = require('./uri'); - $rdf = Object.assign($rdf, require('./term')); - $rdf.IndexedFormula = require('./identity'); - $rdf.N3Parser = require('./n3parser'); - $rdf.RDFParser = require('./rdfparser'); - $rdf.Serializer = require('./serialize'); -} -else { - if (Zotero.RDF) { - Zotero.RDF.AJAW = $rdf; - } - else { - Zotero.RDF = { AJAW: $rdf }; - } -} diff --git a/zotero-connectors/src/translate/src/rdf/n3parser.js b/zotero-connectors/src/translate/src/rdf/n3parser.js deleted file mode 100644 index ff7c342c..00000000 --- a/zotero-connectors/src/translate/src/rdf/n3parser.js +++ /dev/null @@ -1,1392 +0,0 @@ -if (typeof process === 'object' && process + '' === '[object process]'){ - var $rdf = require('./init'); -} - -$rdf.N3Parser = function () { - - function hexify(str) { // also used in parser - return encodeURI(str); - } - - // Things we need to define to make converted pythn code work in js - // environment of $rdf - var RDFSink_forSomeSym = "http://www.w3.org/2000/10/swap/log#forSome"; - var RDFSink_forAllSym = "http://www.w3.org/2000/10/swap/log#forAll"; - var Logic_NS = "http://www.w3.org/2000/10/swap/log#"; - - // pyjs seems to reference runtime library which I didn't find - var pyjslib_Tuple = function (theList) { - return theList - }; - - var pyjslib_List = function (theList) { - return theList - }; - - var pyjslib_Dict = function (listOfPairs) { - if(listOfPairs.length > 0) - throw "missing.js: oops nnonempty dict not imp"; - return []; - } - - var pyjslib_len = function (s) { - return s.length - } - - var pyjslib_slice = function (str, i, j) { - if(typeof str.slice == 'undefined') - throw '@@ mising.js: No .slice function for ' + str + ' of type ' + (typeof str) - if((typeof j == 'undefined') || (j == null)) return str.slice(i); - return str.slice(i, j) // @ exactly the same spec? - } - var StopIteration = Error('dummy error stop iteration'); - - var pyjslib_Iterator = function (theList) { - this.last = 0; - this.li = theList; - this.next = function () { - if(this.last == this.li.length) throw StopIteration; - return this.li[this.last++]; - } - return this; - }; - - var ord = function (str) { - return str.charCodeAt(0) - } - - var string_find = function (str, s) { - return str.indexOf(s) - } - - var assertFudge = function (condition, desc) { - if(condition) return; - if(desc) throw "python Assertion failed: " + desc; - throw "(python) Assertion failed."; - } - - - var stringFromCharCode = function (uesc) { - return String.fromCharCode(uesc); - } - - var uripath_join = function (base, given) { - return $rdf.Util.uri.join(given, base) // sad but true - } - - var becauseSubexpression = null; // No reason needed - var diag_tracking = 0; - var diag_chatty_flag = 0; - var diag_progress = function (str) { - /*$rdf.log(str);*/ - } - - // why_BecauseOfData = function(doc, reason) { return doc }; - - var RDF_type_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; - var DAML_sameAs_URI = "http://www.w3.org/2002/07/owl#sameAs"; - - /* -function SyntaxError(details) { - return new __SyntaxError(details); -} -*/ - - function __SyntaxError(details) { - this.details = details - } - - /* - -$Id: n3parser.js 14561 2008-02-23 06:37:26Z kennyluck $ - -HAND EDITED FOR CONVERSION TO JAVASCRIPT - -This module implements a Nptation3 parser, and the final -part of a notation3 serializer. - -See also: - -Notation 3 -http://www.w3.org/DesignIssues/Notation3 - -Closed World Machine - and RDF Processor -http://www.w3.org/2000/10/swap/cwm - -To DO: See also "@@" in comments - -- Clean up interfaces -______________________________________________ - -Module originally by Dan Connolly, includeing notation3 -parser and RDF generator. TimBL added RDF stream model -and N3 generation, replaced stream model with use -of common store/formula API. Yosi Scharf developped -the module, including tests and test harness. - -*/ - - var ADDED_HASH = "#"; - var LOG_implies_URI = "http://www.w3.org/2000/10/swap/log#implies"; - var INTEGER_DATATYPE = "http://www.w3.org/2001/XMLSchema#integer"; - var FLOAT_DATATYPE = "http://www.w3.org/2001/XMLSchema#double"; - var DECIMAL_DATATYPE = "http://www.w3.org/2001/XMLSchema#decimal"; - var BOOLEAN_DATATYPE = "http://www.w3.org/2001/XMLSchema#boolean"; - var option_noregen = 0; - var _notQNameChars = "\t\r\n !\"#$%&'()*.,+/;<=>?@[\\]^`{|}~"; - var _notNameChars = (_notQNameChars + ":"); - var _rdfns = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; - var N3CommentCharacter = "#"; - var eol = new RegExp("^[ \\t]*(#[^\\n]*)?\\r?\\n", 'g'); - var eof = new RegExp("^[ \\t]*(#[^\\n]*)?$", 'g'); - var ws = new RegExp("^[ \\t]*", 'g'); - var signed_integer = new RegExp("^[-+]?[0-9]+", 'g'); - var number_syntax = new RegExp("^([-+]?[0-9]+)(\\.[0-9]+)?(e[-+]?[0-9]+)?", 'g'); - var digitstring = new RegExp("^[0-9]+", 'g'); - var interesting = new RegExp("[\\\\\\r\\n\\\"]", 'g'); - var langcode = new RegExp("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)?", 'g'); - - function SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) { - return new __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why); - } - - function __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) { - if(typeof openFormula == 'undefined') openFormula = null; - if(typeof thisDoc == 'undefined') thisDoc = ""; - if(typeof baseURI == 'undefined') baseURI = null; - if(typeof genPrefix == 'undefined') genPrefix = ""; - if(typeof metaURI == 'undefined') metaURI = null; - if(typeof flags == 'undefined') flags = ""; - if(typeof why == 'undefined') why = null; - /* - note: namespace names should *not* end in #; - the # will get added during qname processing */ - - this._bindings = new pyjslib_Dict([]); - this._flags = flags; - if((thisDoc != "")) { - assertFudge((thisDoc.indexOf(":") >= 0), ("Document URI not absolute: " + thisDoc)); - this._bindings[""] = ((thisDoc + "#")); - } - this._store = store; - if(genPrefix) { - store.setGenPrefix(genPrefix); - } - this._thisDoc = thisDoc; - this.source = store.sym(thisDoc); - this.lines = 0; - this.statementCount = 0; - this.startOfLine = 0; - this.previousLine = 0; - this._genPrefix = genPrefix; - this.keywords = new pyjslib_List(["a", "this", "bind", "has", "is", "of", "true", "false"]); - this.keywordsSet = 0; - this._anonymousNodes = new pyjslib_Dict([]); - this._variables = new pyjslib_Dict([]); - this._parentVariables = new pyjslib_Dict([]); - this._reason = why; - this._reason2 = null; - if(diag_tracking) { - this._reason2 = why_BecauseOfData(store.sym(thisDoc), this._reason); - } - if(baseURI) { - this._baseURI = baseURI; - } else { - if(thisDoc) { - this._baseURI = thisDoc; - } else { - this._baseURI = null; - } - } - assertFudge(!(this._baseURI) || (this._baseURI.indexOf(":") >= 0)); - if(!(this._genPrefix)) { - if(this._thisDoc) { - this._genPrefix = (this._thisDoc + "#_g"); - } else { - this._genPrefix = RDFSink_uniqueURI(); - } - } - if((openFormula == null)) { - if(this._thisDoc) { - this._formula = store.formula((thisDoc + "#_formula")); - } else { - this._formula = store.formula(); - } - } else { - this._formula = openFormula; - } - this._context = this._formula; - this._parentContext = null; - } - __SinkParser.prototype.here = function (i) { - return((((this._genPrefix + "_L") + this.lines) + "C") + ((i - this.startOfLine) + 1)); - }; - __SinkParser.prototype.formula = function () { - return this._formula; - }; - __SinkParser.prototype.loadStream = function (stream) { - return this.loadBuf(stream.read()); - }; - __SinkParser.prototype.loadBuf = function (buf) { - /* - Parses a buffer and returns its top level formula*/ - - this.startDoc(); - this.feed(buf); - return this.endDoc(); - }; - __SinkParser.prototype.feed = function (octets) { - /* - Feed an octet stream tothe parser - - if BadSyntax is raised, the string - passed in the exception object is the - remainder after any statements have been parsed. - So if there is more data to feed to the - parser, it should be straightforward to recover.*/ - - var str = octets; - var i = 0; - while((i >= 0)) { - var j = this.skipSpace(str, i); - if((j < 0)) { - return; - } - var i = this.directiveOrStatement(str, j); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected directive or statement"); - } - } - }; - __SinkParser.prototype.directiveOrStatement = function (str, h) { - var i = this.skipSpace(str, h); - if((i < 0)) { - return i; - } - var j = this.directive(str, i); - if((j >= 0)) { - return this.checkDot(str, j); - } - var j = this.statement(str, i); - if((j >= 0)) { - return this.checkDot(str, j); - } - return j; - }; - __SinkParser.prototype.tok = function (tok, str, i) { - /* - Check for keyword. Space must have been stripped on entry and - we must not be at end of file.*/ - var whitespace = "\t\n\v\f\r "; - if((pyjslib_slice(str, i, (i + 1)) == "@")) { - var i = (i + 1); - } else { - if(($rdf.Util.ArrayIndexOf(this.keywords, tok) < 0)) { - return -1; - } - } - var k = (i + pyjslib_len(tok)); - if((pyjslib_slice(str, i, k) == tok) && (_notQNameChars.indexOf(str.charAt(k)) >= 0)) { - return k; - } else { - return -1; - } - }; - __SinkParser.prototype.directive = function (str, i) { - var j = this.skipSpace(str, i); - if((j < 0)) { - return j; - } - var res = new pyjslib_List([]); - var j = this.tok("bind", str, i); - if((j > 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "keyword bind is obsolete: use @prefix"); - } - var j = this.tok("keywords", str, i); - if((j > 0)) { - var i = this.commaSeparatedList(str, j, res, false); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "'@keywords' needs comma separated list of words"); - } - this.setKeywords(pyjslib_slice(res, null, null)); - if((diag_chatty_flag > 80)) { - diag_progress("Keywords ", this.keywords); - } - return i; - } - var j = this.tok("forAll", str, i); - if((j > 0)) { - var i = this.commaSeparatedList(str, j, res, true); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad variable list after @forAll"); - } - - var __x = new pyjslib_Iterator(res); - try { - while(true) { - var x = __x.next(); - - - if($rdf.Util.ArrayIndexOf(this._variables, x) < 0 || ($rdf.Util.ArrayIndexOf(this._parentVariables, x) >= 0)) { - this._variables[x] = (this._context.newUniversal(x)); - } - - } - } catch(e) { - if(e != StopIteration) { - throw e; - } - } - - return i; - } - var j = this.tok("forSome", str, i); - if((j > 0)) { - var i = this.commaSeparatedList(str, j, res, this.uri_ref2); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad variable list after @forSome"); - } - - var __x = new pyjslib_Iterator(res); - try { - while(true) { - var x = __x.next(); - - - this._context.declareExistential(x); - - } - } catch(e) { - if(e != StopIteration) { - throw e; - } - } - - return i; - } - var j = this.tok("prefix", str, i); - if((j >= 0)) { - var t = new pyjslib_List([]); - var i = this.qname(str, j, t); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected qname after @prefix"); - } - var j = this.uri_ref2(str, i, t); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected after @prefix _qname_"); - } - var ns = t[1].uri; - if(this._baseURI) { - var ns = uripath_join(this._baseURI, ns); - } else { - assertFudge((ns.indexOf(":") >= 0), "With no base URI, cannot handle relative URI for NS"); - } - assertFudge((ns.indexOf(":") >= 0)); - this._bindings[t[0][0]] = (ns); - - this.bind(t[0][0], hexify(ns)); - return j; - } - var j = this.tok("base", str, i); - if((j >= 0)) { - var t = new pyjslib_List([]); - var i = this.uri_ref2(str, j, t); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected after @base "); - } - var ns = t[0].uri; - if(this._baseURI) { - var ns = uripath_join(this._baseURI, ns); - } else { - throw BadSyntax(this._thisDoc, this.lines, str, j, (("With no previous base URI, cannot use relative URI in @base <" + ns) + ">")); - } - assertFudge((ns.indexOf(":") >= 0)); - this._baseURI = ns; - return i; - } - return -1; - }; - __SinkParser.prototype.bind = function (qn, uri) { - if((qn == "")) { - } else { - this._store.setPrefixForURI(qn, uri); - } - }; - __SinkParser.prototype.setKeywords = function (k) { - /* - Takes a list of strings*/ - - if((k == null)) { - this.keywordsSet = 0; - } else { - this.keywords = k; - this.keywordsSet = 1; - } - }; - __SinkParser.prototype.startDoc = function () {}; - __SinkParser.prototype.endDoc = function () { - /* - Signal end of document and stop parsing. returns formula*/ - - return this._formula; - }; - __SinkParser.prototype.makeStatement = function (quad) { - quad[0].add(quad[2], quad[1], quad[3], this.source); - this.statementCount += 1; - }; - __SinkParser.prototype.statement = function (str, i) { - var r = new pyjslib_List([]); - var i = this.object(str, i, r); - if((i < 0)) { - return i; - } - var j = this.property_list(str, i, r[0]); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected propertylist"); - } - return j; - }; - __SinkParser.prototype.subject = function (str, i, res) { - return this.item(str, i, res); - }; - __SinkParser.prototype.verb = function (str, i, res) { - /* - has _prop_ - is _prop_ of - a - = - _prop_ - >- prop -> - <- prop -< - _operator_*/ - - var j = this.skipSpace(str, i); - if((j < 0)) { - return j; - } - var r = new pyjslib_List([]); - var j = this.tok("has", str, i); - if((j >= 0)) { - var i = this.prop(str, j, r); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected property after 'has'"); - } - res.push(new pyjslib_Tuple(["->", r[0]])); - return i; - } - var j = this.tok("is", str, i); - if((j >= 0)) { - var i = this.prop(str, j, r); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected after 'is'"); - } - var j = this.skipSpace(str, i); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "End of file found, expected property after 'is'"); - return j; - } - var i = j; - var j = this.tok("of", str, i); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected 'of' after 'is' "); - } - res.push(new pyjslib_Tuple(["<-", r[0]])); - return j; - } - var j = this.tok("a", str, i); - if((j >= 0)) { - res.push(new pyjslib_Tuple(["->", this._store.sym(RDF_type_URI)])); - return j; - } - if((pyjslib_slice(str, i, (i + 2)) == "<=")) { - res.push(new pyjslib_Tuple(["<-", this._store.sym((Logic_NS + "implies"))])); - return(i + 2); - } - if((pyjslib_slice(str, i, (i + 1)) == "=")) { - if((pyjslib_slice(str, (i + 1), (i + 2)) == ">")) { - res.push(new pyjslib_Tuple(["->", this._store.sym((Logic_NS + "implies"))])); - return(i + 2); - } - res.push(new pyjslib_Tuple(["->", this._store.sym(DAML_sameAs_URI)])); - return(i + 1); - } - if((pyjslib_slice(str, i, (i + 2)) == ":=")) { - res.push(new pyjslib_Tuple(["->", (Logic_NS + "becomes")])); - return(i + 2); - } - var j = this.prop(str, i, r); - if((j >= 0)) { - res.push(new pyjslib_Tuple(["->", r[0]])); - return j; - } - if((pyjslib_slice(str, i, (i + 2)) == ">-") || (pyjslib_slice(str, i, (i + 2)) == "<-")) { - throw BadSyntax(this._thisDoc, this.lines, str, j, ">- ... -> syntax is obsolete."); - } - return -1; - }; - __SinkParser.prototype.prop = function (str, i, res) { - return this.item(str, i, res); - }; - __SinkParser.prototype.item = function (str, i, res) { - return this.path(str, i, res); - }; - __SinkParser.prototype.blankNode = function (uri) { - return this._context.bnode(uri, this._reason2); - }; - __SinkParser.prototype.path = function (str, i, res) { - /* - Parse the path production. - */ - - var j = this.nodeOrLiteral(str, i, res); - if((j < 0)) { - return j; - } - while(("!^.".indexOf(pyjslib_slice(str, j, (j + 1))) >= 0)) { - var ch = pyjslib_slice(str, j, (j + 1)); - if((ch == ".")) { - var ahead = pyjslib_slice(str, (j + 1), (j + 2)); - if(!(ahead) || (_notNameChars.indexOf(ahead) >= 0) && (":?<[{(".indexOf(ahead) < 0)) { - break; - } - } - var subj = res.pop(); - var obj = this.blankNode(this.here(j)); - var j = this.node(str, (j + 1), res); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found in middle of path syntax"); - } - var pred = res.pop(); - if((ch == "^")) { - this.makeStatement(new pyjslib_Tuple([this._context, pred, obj, subj])); - } else { - this.makeStatement(new pyjslib_Tuple([this._context, pred, subj, obj])); - } - res.push(obj); - } - return j; - }; - __SinkParser.prototype.anonymousNode = function (ln) { - /* - Remember or generate a term for one of these _: anonymous nodes*/ - - var term = this._anonymousNodes[ln]; - if(term) { - return term; - } - var term = this._store.bnode(this._context, this._reason2); - this._anonymousNodes[ln] = (term); - return term; - }; - __SinkParser.prototype.node = function (str, i, res, subjectAlready) { - if(typeof subjectAlready == 'undefined') subjectAlready = null; - /* - Parse the production. - Space is now skipped once at the beginning - instead of in multipe calls to self.skipSpace(). - */ - - var subj = subjectAlready; - var j = this.skipSpace(str, i); - if((j < 0)) { - return j; - } - var i = j; - var ch = pyjslib_slice(str, i, (i + 1)); - if((ch == "[")) { - var bnodeID = this.here(i); - var j = this.skipSpace(str, (i + 1)); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF after '['"); - } - if((pyjslib_slice(str, j, (j + 1)) == "=")) { - var i = (j + 1); - var objs = new pyjslib_List([]); - var j = this.objectList(str, i, objs); - - if((j >= 0)) { - var subj = objs[0]; - if((pyjslib_len(objs) > 1)) { - - var __obj = new pyjslib_Iterator(objs); - try { - while(true) { - var obj = __obj.next(); - - - this.makeStatement(new pyjslib_Tuple([this._context, this._store.sym(DAML_sameAs_URI), subj, obj])); - - } - } catch(e) { - if(e != StopIteration) { - throw e; - } - } - - } - var j = this.skipSpace(str, j); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when objectList expected after [ = "); - } - if((pyjslib_slice(str, j, (j + 1)) == ";")) { - var j = (j + 1); - } - } else { - throw BadSyntax(this._thisDoc, this.lines, str, i, "objectList expected after [= "); - } - } - if((subj == null)) { - var subj = this.blankNode(bnodeID); - } - var i = this.property_list(str, j, subj); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "property_list expected"); - } - var j = this.skipSpace(str, i); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when ']' expected after [ "); - } - if((pyjslib_slice(str, j, (j + 1)) != "]")) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "']' expected"); - } - res.push(subj); - return(j + 1); - } - if((ch == "{")) { - var ch2 = pyjslib_slice(str, (i + 1), (i + 2)); - if((ch2 == "$")) { - i += 1; - var j = (i + 1); - var mylist = new pyjslib_List([]); - var first_run = true; - while(1) { - var i = this.skipSpace(str, j); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "needed '$}', found end."); - } - if((pyjslib_slice(str, i, (i + 2)) == "$}")) { - var j = (i + 2); - break; - } - if(!(first_run)) { - if((pyjslib_slice(str, i, (i + 1)) == ",")) { - i += 1; - } else { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected: ','"); - } - } else { - var first_run = false; - } - var item = new pyjslib_List([]); - var j = this.item(str, i, item); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected item in set or '$}'"); - } - mylist.push(item[0]); - } - res.push(this._store.newSet(mylist, this._context)); - return j; - } else { - var j = (i + 1); - var oldParentContext = this._parentContext; - this._parentContext = this._context; - var parentAnonymousNodes = this._anonymousNodes; - var grandParentVariables = this._parentVariables; - this._parentVariables = this._variables; - this._anonymousNodes = new pyjslib_Dict([]); - this._variables = this._variables.slice(); - var reason2 = this._reason2; - this._reason2 = becauseSubexpression; - if((subj == null)) { - var subj = this._store.formula(); - } - this._context = subj; - while(1) { - var i = this.skipSpace(str, j); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "needed '}', found end."); - } - if((pyjslib_slice(str, i, (i + 1)) == "}")) { - var j = (i + 1); - break; - } - var j = this.directiveOrStatement(str, i); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected statement or '}'"); - } - } - this._anonymousNodes = parentAnonymousNodes; - this._variables = this._parentVariables; - this._parentVariables = grandParentVariables; - this._context = this._parentContext; - this._reason2 = reason2; - this._parentContext = oldParentContext; - res.push(subj.close()); - return j; - } - } - if((ch == "(")) { - var thing_type = this._store.list; - var ch2 = pyjslib_slice(str, (i + 1), (i + 2)); - if((ch2 == "$")) { - var thing_type = this._store.newSet; - i += 1; - } - var j = (i + 1); - var mylist = new pyjslib_List([]); - while(1) { - var i = this.skipSpace(str, j); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "needed ')', found end."); - } - if((pyjslib_slice(str, i, (i + 1)) == ")")) { - var j = (i + 1); - break; - } - var item = new pyjslib_List([]); - var j = this.item(str, i, item); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected item in list or ')'"); - } - mylist.push(item[0]); - } - res.push(thing_type(mylist, this._context)); - return j; - } - var j = this.tok("this", str, i); - if((j >= 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Keyword 'this' was ancient N3. Now use @forSome and @forAll keywords."); - res.push(this._context); - return j; - } - var j = this.tok("true", str, i); - if((j >= 0)) { - res.push(true); - return j; - } - var j = this.tok("false", str, i); - if((j >= 0)) { - res.push(false); - return j; - } - if((subj == null)) { - var j = this.uri_ref2(str, i, res); - if((j >= 0)) { - return j; - } - } - return -1; - }; - __SinkParser.prototype.property_list = function (str, i, subj) { - /* - Parse property list - Leaves the terminating punctuation in the buffer - */ - - while(1) { - var j = this.skipSpace(str, i); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF found when expected verb in property list"); - return j; - } - if((pyjslib_slice(str, j, (j + 2)) == ":-")) { - var i = (j + 2); - var res = new pyjslib_List([]); - var j = this.node(str, i, res, subj); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "bad {} or () or [] node after :- "); - } - var i = j; - continue; - } - var i = j; - var v = new pyjslib_List([]); - var j = this.verb(str, i, v); - if((j <= 0)) { - return i; - } - var objs = new pyjslib_List([]); - var i = this.objectList(str, j, objs); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "objectList expected"); - } - - var __obj = new pyjslib_Iterator(objs); - try { - while(true) { - var obj = __obj.next(); - - - var pairFudge = v[0]; - var dir = pairFudge[0]; - var sym = pairFudge[1]; - if((dir == "->")) { - this.makeStatement(new pyjslib_Tuple([this._context, sym, subj, obj])); - } else { - this.makeStatement(new pyjslib_Tuple([this._context, sym, obj, subj])); - } - - } - } catch(e) { - if(e != StopIteration) { - throw e; - } - } - - var j = this.skipSpace(str, i); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found in list of objects"); - return j; - } - if((pyjslib_slice(str, i, (i + 1)) != ";")) { - return i; - } - var i = (i + 1); - } - }; - __SinkParser.prototype.commaSeparatedList = function (str, j, res, ofUris) { - /* - return value: -1 bad syntax; >1 new position in str - res has things found appended - - Used to use a final value of the function to be called, e.g. this.bareWord - but passing the function didn't work fo js converion pyjs - */ - - var i = this.skipSpace(str, j); - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF found expecting comma sep list"); - return i; - } - if((str.charAt(i) == ".")) { - return j; - } - if(ofUris) { - var i = this.uri_ref2(str, i, res); - } else { - var i = this.bareWord(str, i, res); - } - if((i < 0)) { - return -1; - } - while(1) { - var j = this.skipSpace(str, i); - if((j < 0)) { - return j; - } - var ch = pyjslib_slice(str, j, (j + 1)); - if((ch != ",")) { - if((ch != ".")) { - return -1; - } - return j; - } - if(ofUris) { - var i = this.uri_ref2(str, (j + 1), res); - } else { - var i = this.bareWord(str, (j + 1), res); - } - if((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "bad list content"); - return i; - } - } - }; - __SinkParser.prototype.objectList = function (str, i, res) { - var i = this.object(str, i, res); - if((i < 0)) { - return -1; - } - while(1) { - var j = this.skipSpace(str, i); - if((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found after object"); - return j; - } - if((pyjslib_slice(str, j, (j + 1)) != ",")) { - return j; - } - var i = this.object(str, (j + 1), res); - if((i < 0)) { - return i; - } - } - }; - __SinkParser.prototype.checkDot = function (str, i) { - var j = this.skipSpace(str, i); - if((j < 0)) { - return j; - } - if((pyjslib_slice(str, j, (j + 1)) == ".")) { - return(j + 1); - } - if((pyjslib_slice(str, j, (j + 1)) == "}")) { - return j; - } - if((pyjslib_slice(str, j, (j + 1)) == "]")) { - return j; - } - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected '.' or '}' or ']' at end of statement"); - return i; - }; - __SinkParser.prototype.uri_ref2 = function (str, i, res) { - /* - Generate uri from n3 representation. - - Note that the RDF convention of directly concatenating - NS and local name is now used though I prefer inserting a '#' - to make the namesapces look more like what XML folks expect. - */ - - var qn = new pyjslib_List([]); - var j = this.qname(str, i, qn); - if((j >= 0)) { - var pairFudge = qn[0]; - var pfx = pairFudge[0]; - var ln = pairFudge[1]; - if((pfx == null)) { - assertFudge(0, "not used?"); - var ns = (this._baseURI + ADDED_HASH); - } else { - var ns = this._bindings[pfx]; - if(!(ns)) { - if((pfx == "_")) { - res.push(this.anonymousNode(ln)); - return j; - } - throw BadSyntax(this._thisDoc, this.lines, str, i, (("Prefix " + pfx) + " not bound.")); - } - } - var symb = this._store.sym((ns + ln)); - if(($rdf.Util.ArrayIndexOf(this._variables, symb) >= 0)) { - res.push(this._variables[symb]); - } else { - res.push(symb); - } - return j; - } - var i = this.skipSpace(str, i); - if((i < 0)) { - return -1; - } - if((str.charAt(i) == "?")) { - var v = new pyjslib_List([]); - var j = this.variable(str, i, v); - if((j > 0)) { - res.push(v[0]); - return j; - } - return -1; - } else if((str.charAt(i) == "<")) { - var i = (i + 1); - var st = i; - while((i < pyjslib_len(str))) { - if((str.charAt(i) == ">")) { - var uref = pyjslib_slice(str, st, i); - if(this._baseURI) { - var uref = uripath_join(this._baseURI, uref); - } else { - assertFudge((uref.indexOf(":") >= 0), "With no base URI, cannot deal with relative URIs"); - } - if((pyjslib_slice(str, (i - 1), i) == "#") && !((pyjslib_slice(uref, -1, null) == "#"))) { - var uref = (uref + "#"); - } - var symb = this._store.sym(uref); - if(($rdf.Util.ArrayIndexOf(this._variables, symb) >= 0)) { - res.push(this._variables[symb]); - } else { - res.push(symb); - } - return(i + 1); - } - var i = (i + 1); - } - throw BadSyntax(this._thisDoc, this.lines, str, j, "unterminated URI reference"); - } else if(this.keywordsSet) { - var v = new pyjslib_List([]); - var j = this.bareWord(str, i, v); - if((j < 0)) { - return -1; - } - if(($rdf.Util.ArrayIndexOf(this.keywords, v[0]) >= 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, (("Keyword \"" + v[0]) + "\" not allowed here.")); - } - res.push(this._store.sym((this._bindings[""] + v[0]))); - return j; - } else { - return -1; - } - }; - __SinkParser.prototype.skipSpace = function (str, i) { - /* - Skip white space, newlines and comments. - return -1 if EOF, else position of first non-ws character*/ - var tmp = str; - var whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000'; - for(var j = (i ? i : 0); j < str.length; j++) { - if(whitespace.indexOf(str.charAt(j)) === -1) { - if(str.charAt(j) === '#') { - str = str.slice(i).replace(/^[^\n]*\n/, ""); - i = 0; - j = -1; - } else { - break; - } - } - } - var val = (tmp.length - str.length) + j; - if(val === tmp.length) { - return -1; - } - return val; - }; - __SinkParser.prototype.variable = function (str, i, res) { - /* - ?abc -> variable(:abc) - */ - - var j = this.skipSpace(str, i); - if((j < 0)) { - return -1; - } - if((pyjslib_slice(str, j, (j + 1)) != "?")) { - return -1; - } - var j = (j + 1); - var i = j; - if(("0123456789-".indexOf(str.charAt(j)) >= 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, (("Varible name can't start with '" + str.charAt(j)) + "s'")); - return -1; - } - while((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) { - var i = (i + 1); - } - if((this._parentContext == null)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, ("Can't use ?xxx syntax for variable in outermost level: " + pyjslib_slice(str, (j - 1), i))); - } - res.push(this._store.variable(pyjslib_slice(str, j, i))); - return i; - }; - __SinkParser.prototype.bareWord = function (str, i, res) { - /* - abc -> :abc - */ - - var j = this.skipSpace(str, i); - if((j < 0)) { - return -1; - } - var ch = str.charAt(j); - if(("0123456789-".indexOf(ch) >= 0)) { - return -1; - } - if((_notNameChars.indexOf(ch) >= 0)) { - return -1; - } - var i = j; - while((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) { - var i = (i + 1); - } - res.push(pyjslib_slice(str, j, i)); - return i; - }; - __SinkParser.prototype.qname = function (str, i, res) { - /* - - xyz:def -> ('xyz', 'def') - If not in keywords and keywordsSet: def -> ('', 'def') - :def -> ('', 'def') - */ - - var i = this.skipSpace(str, i); - if((i < 0)) { - return -1; - } - var c = str.charAt(i); - if(("0123456789-+".indexOf(c) >= 0)) { - return -1; - } - if((_notNameChars.indexOf(c) < 0)) { - var ln = c; - var i = (i + 1); - while((i < pyjslib_len(str))) { - var c = str.charAt(i); - if((_notNameChars.indexOf(c) < 0)) { - var ln = (ln + c); - var i = (i + 1); - } else { - break; - } - } - } else { - var ln = ""; - } - if((i < pyjslib_len(str)) && (str.charAt(i) == ":")) { - var pfx = ln; - var i = (i + 1); - var ln = ""; - while((i < pyjslib_len(str))) { - var c = str.charAt(i); - if((_notNameChars.indexOf(c) < 0)) { - var ln = (ln + c); - var i = (i + 1); - } else { - break; - } - } - res.push(new pyjslib_Tuple([pfx, ln])); - return i; - } else { - if(ln && this.keywordsSet && ($rdf.Util.ArrayIndexOf(this.keywords, ln) < 0)) { - res.push(new pyjslib_Tuple(["", ln])); - return i; - } - return -1; - } - }; - __SinkParser.prototype.object = function (str, i, res) { - var j = this.subject(str, i, res); - if((j >= 0)) { - return j; - } else { - var j = this.skipSpace(str, i); - if((j < 0)) { - return -1; - } else { - var i = j; - } - if((str.charAt(i) == "\"")) { - if((pyjslib_slice(str, i, (i + 3)) == "\"\"\"")) { - var delim = "\"\"\""; - } else { - var delim = "\""; - } - var i = (i + pyjslib_len(delim)); - var pairFudge = this.strconst(str, i, delim); - var j = pairFudge[0]; - var s = pairFudge[1]; - res.push(this._store.literal(s)); - diag_progress("New string const ", s, j); - return j; - } else { - return -1; - } - } - }; - __SinkParser.prototype.nodeOrLiteral = function (str, i, res) { - var j = this.node(str, i, res); - if((j >= 0)) { - return j; - } else { - var j = this.skipSpace(str, i); - if((j < 0)) { - return -1; - } else { - var i = j; - } - var ch = str.charAt(i); - if(("-+0987654321".indexOf(ch) >= 0)) { - number_syntax.lastIndex = 0; - var m = number_syntax.exec(str.slice(i)); - if((m == null)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad number syntax"); - } - var j = (i + number_syntax.lastIndex); - var val = pyjslib_slice(str, i, j); - if((val.indexOf("e") >= 0)) { - res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(FLOAT_DATATYPE))); - } else if((pyjslib_slice(str, i, j).indexOf(".") >= 0)) { - res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(DECIMAL_DATATYPE))); - } else { - res.push(this._store.literal(parseInt(val), undefined, this._store.sym(INTEGER_DATATYPE))); - } - return j; - } - if((str.charAt(i) == "\"")) { - if((pyjslib_slice(str, i, (i + 3)) == "\"\"\"")) { - var delim = "\"\"\""; - } else { - var delim = "\""; - } - var i = (i + pyjslib_len(delim)); - var dt = null; - var pairFudge = this.strconst(str, i, delim); - var j = pairFudge[0]; - var s = pairFudge[1]; - var lang = null; - if((pyjslib_slice(str, j, (j + 1)) == "@")) { - langcode.lastIndex = 0; - - var m = langcode.exec(str.slice((j + 1))); - if((m == null)) { - throw BadSyntax(this._thisDoc, startline, str, i, "Bad language code syntax on string literal, after @"); - } - var i = ((langcode.lastIndex + j) + 1); - - var lang = pyjslib_slice(str, (j + 1), i); - var j = i; - } - if((pyjslib_slice(str, j, (j + 2)) == "^^")) { - var res2 = new pyjslib_List([]); - var j = this.uri_ref2(str, (j + 2), res2); - var dt = res2[0]; - } - res.push(this._store.literal(s, lang, dt)); - return j; - } else { - return -1; - } - } - }; - __SinkParser.prototype.strconst = function (str, i, delim) { - /* - parse an N3 string constant delimited by delim. - return index, val - */ - - var j = i; - var ustr = ""; - var startline = this.lines; - while((j < pyjslib_len(str))) { - var i = (j + pyjslib_len(delim)); - if((pyjslib_slice(str, j, i) == delim)) { - return new pyjslib_Tuple([i, ustr]); - } - if((str.charAt(j) == "\"")) { - var ustr = (ustr + "\""); - var j = (j + 1); - continue; - } - interesting.lastIndex = 0; - var m = interesting.exec(str.slice(j)); - if(!(m)) { - throw BadSyntax(this._thisDoc, startline, str, j, ((("Closing quote missing in string at ^ in " + pyjslib_slice(str, (j - 20), j)) + "^") + pyjslib_slice(str, j, (j + 20)))); - } - var i = ((j + interesting.lastIndex) - 1); - var ustr = (ustr + pyjslib_slice(str, j, i)); - var ch = str.charAt(i); - if((ch == "\"")) { - var j = i; - continue; - } else if((ch == "\r")) { - var j = (i + 1); - continue; - } else if((ch == "\n")) { - if((delim == "\"")) { - throw BadSyntax(this._thisDoc, startline, str, i, "newline found in string literal"); - } - this.lines = (this.lines + 1); - var ustr = (ustr + ch); - var j = (i + 1); - this.previousLine = this.startOfLine; - this.startOfLine = j; - } else if((ch == "\\")) { - var j = (i + 1); - var ch = pyjslib_slice(str, j, (j + 1)); - if(!(ch)) { - throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal (2)"); - } - var k = string_find("abfrtvn\\\"", ch); - if((k >= 0)) { - var uch = "\a\b\f\r\t\v\n\\\"".charAt(k); - var ustr = (ustr + uch); - var j = (j + 1); - } else if((ch == "u")) { - var pairFudge = this.uEscape(str, (j + 1), startline); - var j = pairFudge[0]; - var ch = pairFudge[1]; - var ustr = (ustr + ch); - } else if((ch == "U")) { - var pairFudge = this.UEscape(str, (j + 1), startline); - var j = pairFudge[0]; - var ch = pairFudge[1]; - var ustr = (ustr + ch); - } else { - throw BadSyntax(this._thisDoc, this.lines, str, i, "bad escape"); - } - } - } - throw BadSyntax(this._thisDoc, this.lines, str, i, "unterminated string literal"); - }; - __SinkParser.prototype.uEscape = function (str, i, startline) { - var j = i; - var count = 0; - var value = 0; - while((count < 4)) { - var chFudge = pyjslib_slice(str, j, (j + 1)); - var ch = chFudge.toLowerCase(); - var j = (j + 1); - if((ch == "")) { - throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal(3)"); - } - var k = string_find("0123456789abcdef", ch); - if((k < 0)) { - throw BadSyntax(this._thisDoc, startline, str, i, "bad string literal hex escape"); - } - var value = ((value * 16) + k); - var count = (count + 1); - } - var uch = String.fromCharCode(value); - return new pyjslib_Tuple([j, uch]); - }; - __SinkParser.prototype.UEscape = function (str, i, startline) { - var j = i; - var count = 0; - var value = "\\U"; - while((count < 8)) { - var chFudge = pyjslib_slice(str, j, (j + 1)); - var ch = chFudge.toLowerCase(); - var j = (j + 1); - if((ch == "")) { - throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal(3)"); - } - var k = string_find("0123456789abcdef", ch); - if((k < 0)) { - throw BadSyntax(this._thisDoc, startline, str, i, "bad string literal hex escape"); - } - var value = (value + ch); - var count = (count + 1); - } - var uch = stringFromCharCode((("0x" + pyjslib_slice(value, 2, 10)) - 0)); - return new pyjslib_Tuple([j, uch]); - }; - - function BadSyntax(uri, lines, str, i, why) { - return(((((((("Line " + (lines + 1)) + " of <") + uri) + ">: Bad syntax: ") + why) + "\nat: \"") + pyjslib_slice(str, i, (i + 30))) + "\""); - } - - - function stripCR(str) { - var res = ""; - - var __ch = new pyjslib_Iterator(str); - try { - while(true) { - var ch = __ch.next(); - - - if((ch != "\r")) { - var res = (res + ch); - } - - } - } catch(e) { - if(e != StopIteration) { - throw e; - } - } - - return res; - } - - - function dummyWrite(x) { - } - - return SinkParser; - -}(); - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = $rdf.N3Parser; -} diff --git a/zotero-connectors/src/translate/src/rdf/rdfparser.js b/zotero-connectors/src/translate/src/rdf/rdfparser.js deleted file mode 100644 index 6403b618..00000000 --- a/zotero-connectors/src/translate/src/rdf/rdfparser.js +++ /dev/null @@ -1,578 +0,0 @@ -/** - * @fileoverview - * TABULATOR RDF PARSER - * - * Version 0.1 - * Parser believed to be in full positive RDF/XML parsing compliance - * with the possible exception of handling deprecated RDF attributes - * appropriately. Parser is believed to comply fully with other W3C - * and industry standards where appropriate (DOM, ECMAScript, &c.) - * - * Author: David Sheets - * SVN ID: $Id$ - * - * W3C® SOFTWARE NOTICE AND LICENSE - * http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - * This work (and included software, documentation such as READMEs, or - * other related items) is being provided by the copyright holders under - * the following license. By obtaining, using and/or copying this work, - * you (the licensee) agree that you have read, understood, and will - * comply with the following terms and conditions. - * - * Permission to copy, modify, and distribute this software and its - * documentation, with or without modification, for any purpose and - * without fee or royalty is hereby granted, provided that you include - * the following on ALL copies of the software and documentation or - * portions thereof, including modifications: - * - * 1. The full text of this NOTICE in a location viewable to users of - * the redistributed or derivative work. - * 2. Any pre-existing intellectual property disclaimers, notices, or terms and - * conditions. If none exist, the W3C Software Short Notice should be - * included (hypertext is preferred, text is permitted) within the body - * of any redistributed or derivative code. - * 3. Notice of any changes or modifications to the files, including the - * date changes were made. (We recommend you provide URIs to the location - * from which the code is derived.) - * - * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT - * HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS - * FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR - * DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, - * TRADEMARKS OR OTHER RIGHTS. - * - * COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL - * OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR - * DOCUMENTATION. - * - * The name and trademarks of copyright holders may NOT be used in - * advertising or publicity pertaining to the software without specific, - * written prior permission. Title to copyright in this software and any - * associated documentation will at all times remain with copyright - * holders. - */ - -if (typeof process === 'object' && process + '' === '[object process]'){ - var $rdf = require('./init'); -} - -/** - * @class Class defining an RDFParser resource object tied to an RDFStore - * - * @author David Sheets - * @version 0.1 - * - * @constructor - * @param {RDFStore} store An RDFStore object - */ -$rdf.RDFParser = function (store) { - var RDFParser = {}; - - /** Standard namespaces that we know how to handle @final - * @member RDFParser - */ - RDFParser['ns'] = { - 'RDF': "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - 'RDFS': "http://www.w3.org/2000/01/rdf-schema#" - } - /** DOM Level 2 node type magic numbers @final - * @member RDFParser - */ - RDFParser['nodeType'] = { - 'ELEMENT': 1, - 'ATTRIBUTE': 2, - 'TEXT': 3, - 'CDATA_SECTION': 4, - 'ENTITY_REFERENCE': 5, - 'ENTITY': 6, - 'PROCESSING_INSTRUCTION': 7, - 'COMMENT': 8, - 'DOCUMENT': 9, - 'DOCUMENT_TYPE': 10, - 'DOCUMENT_FRAGMENT': 11, - 'NOTATION': 12 - } - - /** - * Frame class for namespace and base URI lookups - * Base lookups will always resolve because the parser knows - * the default base. - * - * @private - */ - this['frameFactory'] = function (parser, parent, element) { - return { - 'NODE': 1, - 'ARC': 2, - 'parent': parent, - 'parser': parser, - 'store': parser['store'], - 'element': element, - 'lastChild': 0, - 'base': null, - 'lang': null, - 'node': null, - 'nodeType': null, - 'listIndex': 1, - 'rdfid': null, - 'datatype': null, - 'collection': false, - - /** Terminate the frame and notify the store that we're done */ - 'terminateFrame': function () { - if(this['collection']) { - this['node']['close']() - } - }, - - /** Add a symbol of a certain type to the this frame */ - 'addSymbol': function (type, uri) { - uri = $rdf.Util.uri.join(uri, this['base']) - this['node'] = this['store']['sym'](uri) - this['nodeType'] = type - }, - - /** Load any constructed triples into the store */ - 'loadTriple': function () { - if(this['parent']['parent']['collection']) { - this['parent']['parent']['node']['append'](this['node']) - } else { - this['store']['add'](this['parent']['parent']['node'], - this['parent']['node'], - this['node'], - this['parser']['why']) - } - if(this['parent']['rdfid'] != null) { // reify - var triple = this['store']['sym']( - $rdf.Util.uri.join("#" + this['parent']['rdfid'], this['base'])) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "type"), - this['store']['sym'](RDFParser['ns']['RDF'] + "Statement"), - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "subject"), - this['parent']['parent']['node'], - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "predicate"), - this['parent']['node'], - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym'](RDFParser['ns']['RDF'] + "object"), - this['node'], - this['parser']['why']) - } - }, - - /** Check if it's OK to load a triple */ - 'isTripleToLoad': function () { - return (this['parent'] != null - && this['parent']['parent'] != null - && this['nodeType'] == this['NODE'] - && this['parent']['nodeType'] == this['ARC'] - && this['parent']['parent']['nodeType'] == this['NODE']) - }, - - /** Add a symbolic node to this frame */ - 'addNode': function (uri) { - this['addSymbol'](this['NODE'], uri) - if(this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add a collection node to this frame */ - 'addCollection': function () { - this['nodeType'] = this['NODE'] - this['node'] = this['store']['collection']() - this['collection'] = true - if(this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add a collection arc to this frame */ - 'addCollectionArc': function () { - this['nodeType'] = this['ARC'] - }, - - /** Add a bnode to this frame */ - 'addBNode': function (id) { - if(id != null) { - if(this['parser']['bnodes'][id] != null) { - this['node'] = this['parser']['bnodes'][id] - } else { - this['node'] = this['parser']['bnodes'][id] = this['store']['bnode']() - } - } else { - this['node'] = this['store']['bnode']() - } - - this['nodeType'] = this['NODE'] - if(this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add an arc or property to this frame */ - 'addArc': function (uri) { - if(uri == RDFParser['ns']['RDF'] + "li") { - uri = RDFParser['ns']['RDF'] + "_" + this['parent']['listIndex']++ - } - this['addSymbol'](this['ARC'], uri) - }, - - /** Add a literal to this frame */ - 'addLiteral': function (value) { - if(this['parent']['datatype']) { - this['node'] = this['store']['literal']( - value, "", this['store']['sym']( - this['parent']['datatype'])) - } else { - this['node'] = this['store']['literal']( - value, this['lang']) - } - this['nodeType'] = this['NODE'] - if(this['isTripleToLoad']()) { - this['loadTriple']() - } - } - } - } - - //from the OpenLayers source .. needed to get around IE problems. - this['getAttributeNodeNS'] = function (node, uri, name) { - var attributeNode = null; - if(node.getAttributeNodeNS) { - attributeNode = node.getAttributeNodeNS(uri, name); - } else { - var attributes = node.attributes; - var potentialNode, fullName; - for(var i = 0; i < attributes.length; ++i) { - potentialNode = attributes[i]; - if(potentialNode.namespaceURI == uri) { - fullName = (potentialNode.prefix) ? (potentialNode.prefix + ":" + name) : name; - if(fullName == potentialNode.nodeName) { - attributeNode = potentialNode; - break; - } - } - } - } - return attributeNode; - } - - /** Our triple store reference @private */ - this['store'] = store - /** Our identified blank nodes @private */ - this['bnodes'] = {} - /** A context for context-aware stores @private */ - this['why'] = null - /** Reification flag */ - this['reify'] = false - - /** - * Build our initial scope frame and parse the DOM into triples - * @param {DOMTree} document The DOM to parse - * @param {String} base The base URL to use - * @param {Object} why The context to which this resource belongs - */ - this['parse'] = function (document, base, why) { - // $rdf.log('parse base:'+base); - var children = document['childNodes'] - - // clean up for the next run - this['cleanParser']() - - // figure out the root element - //var root = document.documentElement; //this is faster, I think, cross-browser issue? well, DOM 2 - if(document['nodeType'] == RDFParser['nodeType']['DOCUMENT']) { - for(var c = 0; c < children['length']; c++) { - if(children[c]['nodeType'] == RDFParser['nodeType']['ELEMENT']) { - var root = children[c] - break - } - } - } else if(document['nodeType'] == RDFParser['nodeType']['ELEMENT']) { - var root = document - } else { - throw new Error("RDFParser: can't find root in " + base + ". Halting. ") - return false - } - - this['why'] = why - - - // our topmost frame - var f = this['frameFactory'](this) - this['base'] = base - f['base'] = base - f['lang'] = '' - - this['parseDOM'](this['buildFrame'](f, root)) - return true - } - this['parseDOM'] = function (frame) { - // a DOM utility function used in parsing - var elementURI = function (el) { - var result = ""; - if(el['namespaceURI'] == null) { - throw new Error("RDF/XML syntax error: No namespace for " - + el['localName'] + " in " + this.base) - } - if(el['namespaceURI']) { - result = result + el['namespaceURI']; - } - if(el['localName']) { - result = result + el['localName']; - } else if(el['nodeName']) { - if(el['nodeName'].indexOf(":") >= 0) - result = result + el['nodeName'].split(":")[1]; - else - result = result + el['nodeName']; - } - return result; - } - var dig = true // if we'll dig down in the tree on the next iter - while(frame['parent']) { - var dom = frame['element'] - var attrs = dom['attributes'] - - if(dom['nodeType'] == RDFParser['nodeType']['TEXT'] - || dom['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) { - //we have a literal - if(frame['parent']['nodeType'] == frame['NODE']) { - //must have had attributes, store as rdf:value - frame['addArc'](RDFParser['ns']['RDF'] + 'value'); - frame = this['buildFrame'](frame); - } - frame['addLiteral'](dom['nodeValue']) - } else if(elementURI(dom) != RDFParser['ns']['RDF'] + "RDF") { - // not root - if(frame['parent'] && frame['parent']['collection']) { - // we're a collection element - frame['addCollectionArc']() - frame = this['buildFrame'](frame, frame['element']) - frame['parent']['element'] = null - } - if(!frame['parent'] || !frame['parent']['nodeType'] - || frame['parent']['nodeType'] == frame['ARC']) { - // we need a node - var about = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "about") - var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID") - if(about && rdfid) { - throw new Error("RDFParser: " + dom['nodeName'] - + " has both rdf:id and rdf:about." + " Halting. Only one of these" - + " properties may be specified on a" + " node."); - } - if(about == null && rdfid) { - frame['addNode']("#" + rdfid['nodeValue']) - dom['removeAttributeNode'](rdfid) - } else if(about == null && rdfid == null) { - var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID") - if(bnid) { - frame['addBNode'](bnid['nodeValue']) - dom['removeAttributeNode'](bnid) - } else { - frame['addBNode']() - } - } else { - frame['addNode'](about['nodeValue']) - dom['removeAttributeNode'](about) - } - - // Typed nodes - var rdftype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "type") - if(RDFParser['ns']['RDF'] + "Description" != elementURI(dom)) { - rdftype = { - 'nodeValue': elementURI(dom) - } - } - if(rdftype != null) { - this['store']['add'](frame['node'], - this['store']['sym'](RDFParser['ns']['RDF'] + "type"), - this['store']['sym']( - $rdf.Util.uri.join( - rdftype['nodeValue'], - frame['base'])), - this['why']) - if(rdftype['nodeName']) { - dom['removeAttributeNode'](rdftype) - } - } - - // Property Attributes - for(var x = attrs['length'] - 1; x >= 0; x--) { - this['store']['add'](frame['node'], - this['store']['sym'](elementURI(attrs[x])), - this['store']['literal']( - attrs[x]['nodeValue'], - frame['lang']), - this['why']) - } - } else { - // we should add an arc (or implicit bnode+arc) - frame['addArc'](elementURI(dom)) - - // save the arc's rdf:ID if it has one - if(this['reify']) { - var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID") - if(rdfid) { - frame['rdfid'] = rdfid['nodeValue'] - dom['removeAttributeNode'](rdfid) - } - } - - var parsetype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "parseType") - var datatype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "datatype") - if(datatype) { - frame['datatype'] = datatype['nodeValue'] - dom['removeAttributeNode'](datatype) - } - - if(parsetype) { - var nv = parsetype['nodeValue'] - if(nv == "Literal") { - frame['datatype'] = RDFParser['ns']['RDF'] + "XMLLiteral" - // (this.buildFrame(frame)).addLiteral(dom) - // should work but doesn't - frame = this['buildFrame'](frame) - frame['addLiteral'](dom) - dig = false - } else if(nv == "Resource") { - frame = this['buildFrame'](frame, frame['element']) - frame['parent']['element'] = null - frame['addBNode']() - } else if(nv == "Collection") { - frame = this['buildFrame'](frame, frame['element']) - frame['parent']['element'] = null - frame['addCollection']() - } - dom['removeAttributeNode'](parsetype) - } - - if(attrs['length'] != 0) { - var resource = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "resource") - var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID") - - frame = this['buildFrame'](frame) - if(resource) { - frame['addNode'](resource['nodeValue']) - dom['removeAttributeNode'](resource) - } else { - if(bnid) { - frame['addBNode'](bnid['nodeValue']) - dom['removeAttributeNode'](bnid) - } else { - frame['addBNode']() - } - } - - for(var x = attrs['length'] - 1; x >= 0; x--) { - var f = this['buildFrame'](frame) - f['addArc'](elementURI(attrs[x])) - if(elementURI(attrs[x]) == RDFParser['ns']['RDF'] + "type") { - (this['buildFrame'](f))['addNode']( - attrs[x]['nodeValue']) - } else { - (this['buildFrame'](f))['addLiteral']( - attrs[x]['nodeValue']) - } - } - } else if(dom['childNodes']['length'] == 0) { - (this['buildFrame'](frame))['addLiteral']("") - } - } - } // rdf:RDF - // dig dug - dom = frame['element'] - while(frame['parent']) { - var pframe = frame - while(dom == null) { - frame = frame['parent'] - dom = frame['element'] - } - var candidate = dom['childNodes'][frame['lastChild']] - if(candidate == null || !dig) { - frame['terminateFrame']() - if(!(frame = frame['parent'])) { - break - } // done - dom = frame['element'] - dig = true - } else if((candidate['nodeType'] != RDFParser['nodeType']['ELEMENT'] - && candidate['nodeType'] != RDFParser['nodeType']['TEXT'] - && candidate['nodeType'] != RDFParser['nodeType']['CDATA_SECTION']) - || ((candidate['nodeType'] == RDFParser['nodeType']['TEXT'] - || candidate['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) - && dom['childNodes']['length'] != 1)) { - frame['lastChild']++ - } else { - // not a leaf - frame['lastChild']++; - frame = this['buildFrame'](pframe, dom['childNodes'][frame['lastChild'] - 1]) - break - } - } - } // while - } - - /** - * Cleans out state from a previous parse run - * @private - */ - this['cleanParser'] = function () { - this['bnodes'] = {} - this['why'] = null - } - - /** - * Builds scope frame - * @private - */ - this['buildFrame'] = function (parent, element) { - var frame = this['frameFactory'](this, parent, element) - if(parent) { - frame['base'] = parent['base'] - frame['lang'] = parent['lang'] - } - if(element == null - || element['nodeType'] == RDFParser['nodeType']['TEXT'] - || element['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) { - return frame - } - - var attrs = element['attributes'] - - var base = element['getAttributeNode']("xml:base") - if(base != null) { - frame['base'] = base['nodeValue'] - element['removeAttribute']("xml:base") - } - var lang = element['getAttributeNode']("xml:lang") - if(lang != null) { - frame['lang'] = lang['nodeValue'] - element['removeAttribute']("xml:lang") - } - - // remove all extraneous xml and xmlns attributes - for(var x = attrs['length'] - 1; x >= 0; x--) { - if(attrs[x]['nodeName']['substr'](0, 3) == "xml") { - if(attrs[x].name.slice(0, 6) == 'xmlns:') { - var uri = attrs[x].nodeValue; - // $rdf.log('base for namespac attr:'+this.base); - if(this.base) uri = $rdf.Util.uri.join(uri, this.base); - this.store.setPrefixForURI(attrs[x].name.slice(6), uri); - } - // $rdf.log('rdfparser: xml atribute: '+attrs[x].name) //@@ - element['removeAttributeNode'](attrs[x]) - } - } - return frame - } -} - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = $rdf.RDFParser; -} diff --git a/zotero-connectors/src/translate/src/rdf/serialize.js b/zotero-connectors/src/translate/src/rdf/serialize.js deleted file mode 100644 index b25fe9c2..00000000 --- a/zotero-connectors/src/translate/src/rdf/serialize.js +++ /dev/null @@ -1,886 +0,0 @@ -/* Serialization of RDF Graphs - ** - ** Tim Berners-Lee 2006 - ** This is or was http://dig.csail.mit.edu/2005/ajar/ajaw/js/rdf/serialize.js - ** - ** Bug: can't serialize http://data.semanticweb.org/person/abraham-bernstein/rdf - ** in XML (from mhausenblas) - */ -// @@@ Check the whole toStr thing tosee whetehr it still makes sense -- tbl -// - -if (typeof process === 'object' && process + '' === '[object process]'){ - var $rdf = require('./init'); -} - -$rdf.Serializer = function () { - - var __Serializer = function (store) { - this.flags = ""; - this.base = null; - this.prefixes = []; - this.keywords = ['a']; // The only one we generate at the moment - this.prefixchars = "abcdefghijklmnopqustuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - this.incoming = null; // Array not calculated yet - this.formulas = []; // remebering original formulae from hashes - this.store = store; - - /* pass */ - } - - var Serializer = function (store) { - return new __Serializer(store) - }; - - __Serializer.prototype.setBase = function (base) { - this.base = base - }; - - __Serializer.prototype.setFlags = function (flags) { - this.flags = flags ? flags : '' - }; - - - __Serializer.prototype.toStr = function (x) { - var s = x.toNT(); - if(x.termType == 'formula') { - this.formulas[s] = x; // remember as reverse does not work - } - return s; - }; - - __Serializer.prototype.fromStr = function (s) { - if(s[0] == '{') { - var x = this.formulas[s]; - if(!x) $rdf.log('No formula object for ' + s) - return x; - } - return this.store.fromNT(s); - }; - - - - - - /* Accumulate Namespaces - ** - ** These are only hints. If two overlap, only one gets used - ** There is therefore no guarantee in general. - */ - - __Serializer.prototype.suggestPrefix = function (prefix, uri) { - this.prefixes[uri] = prefix; - } - - // Takes a namespace -> prefix map - __Serializer.prototype.suggestNamespaces = function (namespaces) { - for(var px in namespaces) { - this.prefixes[namespaces[px]] = px; - } - } - - // Make up an unused prefix for a random namespace - __Serializer.prototype.makeUpPrefix = function (uri) { - var p = uri; - var namespaces = []; - var pok; - var sz = this; - - function canUse(pp) { - if(namespaces[pp]) return false; // already used - sz.prefixes[uri] = pp; - pok = pp; - return true - } - for(var ns in sz.prefixes) { - namespaces[sz.prefixes[ns]] = ns; // reverse index - } - // trim off illegal characters from the end - var i; - for(i = p.length - 1; i>=0; i--) { - if(sz._notNameChars.indexOf(p.charAt(i)) == -1) break; - } - p = p.substring(0, i+1); - if(p) { - // find shortest possible NCName to use as namespace name - for(i = p.length - 1; i>=0; i--) { - if(sz._notNameChars.indexOf(p.charAt(i)) != -1) break; - } - i++; - p = p.substr(i); - - if(p.length < 6 && canUse(p)) return pok; // exact is best - if(canUse(p.slice(0, 3))) return pok; - if(canUse(p.slice(0, 2))) return pok; - if(canUse(p.slice(0, 4))) return pok; - if(canUse(p.slice(0, 1))) return pok; - if(canUse(p.slice(0, 5))) return pok; - p = p.slice(0, 3); - } else { - // no suitable characters (weird), fall back to 'ns' - p = 'ns'; - if(canUse(p)) return pok; - } - for(var i = 0;; i++) if(canUse(p + i)) return pok; - } - - - - // Todo: - // - Sort the statements by subject, pred, object - // - do stuff about the docu first and then (or first) about its primary topic. - __Serializer.prototype.rootSubjects = function (sts) { - var incoming = {}; - var subjects = {}; - var sz = this; - var allBnodes = {}; - - /* This scan is to find out which nodes will have to be the roots of trees - ** in the serialized form. This will be any symbols, and any bnodes - ** which hve more or less than one incoming arc, and any bnodes which have - ** one incoming arc but it is an uninterrupted loop of such nodes back to itself. - ** This should be kept linear time with repect to the number of statements. - ** Note it does not use any indexing of the store. - */ - - - $rdf.log('serialize.js Find bnodes with only one incoming arc\n') - for(var i = 0; i < sts.length; i++) { - var st = sts[i]; - [st.subject, st.predicate, st.object].map(function (y) { - if(y.termType == 'bnode') { - allBnodes[y.toNT()] = true - } - }); - var x = sts[i].object; - if(!incoming[x]) incoming[x] = []; - incoming[x].push(st.subject) // List of things which will cause this to be printed - var ss = subjects[sz.toStr(st.subject)]; // Statements with this as subject - if(!ss) ss = []; - ss.push(st); - subjects[this.toStr(st.subject)] = ss; // Make hash. @@ too slow for formula? - //$rdf.log(' sz potential subject: '+sts[i].subject) - } - - var roots = []; - for(var xNT in subjects) { - var x = sz.fromStr(xNT); - if((x.termType != 'bnode') || !incoming[x] || (incoming[x].length != 1)) { - roots.push(x); - //$rdf.log(' sz actual subject -: ' + x) - continue; - } - } - this.incoming = incoming; // Keep for serializing @@ Bug for nested formulas - //////////// New bit for CONNECTED bnode loops:frootshash - // This scans to see whether the serialization is gpoing to lead to a bnode loop - // and at the same time accumulates a list of all bnodes mentioned. - // This is in fact a cut down N3 serialization - /* - $rdf.log('serialize.js Looking for connected bnode loops\n') - for (var i=0; i?@[\\]^`{|}~"; -__Serializer.prototype._notNameChars = (__Serializer.prototype._notQNameChars + ":"); -__Serializer.prototype._NCNameRegExp = (function() { - // escape characters that are unsafe inside RegExp character set - var reSafeChars = __Serializer.prototype._notNameChars.replace(/[-\]\\]/g, '\\$&'); - return new RegExp('[^0-9\\-.' + reSafeChars + '][^' + reSafeChars + ']*$'); -})(); - - -__Serializer.prototype.statementsToN3 = function (sts) { - var indent = 4; - var width = 80; - var sz = this; - - var namespaceCounts = []; // which have been used - var predMap = { - 'http://www.w3.org/2002/07/owl#sameAs': '=', - 'http://www.w3.org/2000/10/swap/log#implies': '=>', - 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'a' - } - - - - - ////////////////////////// Arrange the bits of text - var spaces = function (n) { - var s = ''; - for(var i = 0; i < n; i++) s += ' '; - return s - } - - var treeToLine = function (tree) { - var str = ''; - for(var i = 0; i < tree.length; i++) { - var branch = tree[i]; - var s2 = (typeof branch == 'string') ? branch : treeToLine(branch); - if(i != 0 && s2 != ',' && s2 != ';' && s2 != '.') str += ' '; - str += s2; - } - return str; - } - - // Convert a nested tree of lists and strings to a string - var treeToString = function (tree, level) { - var str = ''; - var lastLength = 100000; - if(!level) level = 0; - for(var i = 0; i < tree.length; i++) { - var branch = tree[i]; - if(typeof branch != 'string') { - var substr = treeToString(branch, level + 1); - if(substr.length < 10 * (width - indent * level) - && substr.indexOf('"""') < 0) { - // Don't mess up multiline strings - var line = treeToLine(branch); - if(line.length < (width - indent * level)) { - branch = ' ' + line; // @@ Hack: treat as string below - substr = '' - } - } - if(substr) lastLength = 10000; - str += substr; - } - if(typeof branch == 'string') { - if(branch.length == '1' && str.slice(-1) == '\n') { - if(",.;".indexOf(branch) >= 0) { - str = str.slice(0, -1) + branch + '\n'; // slip punct'n on end - lastLength += 1; - continue; - } else if("])}".indexOf(branch) >= 0) { - str = str.slice(0, -1) + ' ' + branch + '\n'; - lastLength += 2; - continue; - } - } - if(lastLength < (indent * level + 4)) { // continue - str = str.slice(0, -1) + ' ' + branch + '\n'; - lastLength += branch.length + 1; - } else { - var line = spaces(indent * level) + branch; - str += line + '\n'; - lastLength = line.length; - } - - } else { // not string - } - } - return str; - }; - - ////////////////////////////////////////////// Structure for N3 - - // Convert a set of statements into a nested tree of lists and strings - function statementListToTree(statements) { - // print('Statement tree for '+statements.length); - var res = []; - var stats = sz.rootSubjects(statements); - var roots = stats.roots; - var results = [] - for(var i = 0; i < roots.length; i++) { - var root = roots[i]; - results.push(subjectTree(root, stats)) - } - return results; - } - - // The tree for a subject - function subjectTree(subject, stats) { - if(subject.termType == 'bnode' && !stats.incoming[subject]) - return objectTree(subject, stats, true).concat(["."]); // Anonymous bnode subject - return [termToN3(subject, stats)].concat([propertyTree(subject, stats)]).concat(["."]); - } - - - // The property tree for a single subject or anonymous node - function propertyTree(subject, stats) { - // print('Proprty tree for '+subject); - var results = [] - var lastPred = null; - var sts = stats.subjects[sz.toStr(subject)]; // relevant statements - if(typeof sts == 'undefined') { - throw('Cant find statements for ' + subject); - } - sts.sort(); - var objects = []; - for(var i = 0; i < sts.length; i++) { - var st = sts[i]; - if(st.predicate.uri == lastPred) { - objects.push(','); - } else { - if(lastPred) { - results = results.concat([objects]).concat([';']); - objects = []; - } - results.push(predMap[st.predicate.uri] ? - predMap[st.predicate.uri] : - termToN3(st.predicate, stats)); - } - lastPred = st.predicate.uri; - objects.push(objectTree(st.object, stats)); - } - results = results.concat([objects]); - return results; - } - - function objectTree(obj, stats, force) { - if(obj.termType == 'bnode' - && stats.subjects[sz.toStr(obj)] - // and there are statements - && (force || stats.rootsHash[obj.toNT()] == undefined)) // and not a root - return ['['].concat(propertyTree(obj, stats)).concat([']']); - return termToN3(obj, stats); - } - - function termToN3(expr, stats) { - switch(expr.termType) { - case 'bnode': - case 'variable': - return expr.toNT(); - case 'literal': - var str = stringToN3(expr.value); - if(expr.lang) str += '@' + expr.lang; - if(expr.datatype) str += '^^' + termToN3(expr.datatype, stats); - return str; - case 'symbol': - return symbolToN3(expr.uri); - case 'formula': - var res = ['{']; - res = res.concat(statementListToTree(expr.statements)); - return res.concat(['}']); - case 'collection': - var res = ['(']; - for(i = 0; i < expr.elements.length; i++) { - res.push([objectTree(expr.elements[i], stats)]); - } - res.push(')'); - return res; - - default: - throw "Internal: termToN3 cannot handle " + expr + " of termType+" + expr.termType - return '' + expr; - } - } - - ////////////////////////////////////////////// Atomic Terms - // Deal with term level things and nesting with no bnode structure - function symbolToN3(uri) { // c.f. symbolString() in notation3.py - var j = uri.indexOf('#'); - if(j < 0 && sz.flags.indexOf('/') < 0) { - j = uri.lastIndexOf('/'); - } - if(j >= 0 && sz.flags.indexOf('p') < 0) { // Can split at namespace - var canSplit = true; - for(var k = j + 1; k < uri.length; k++) { - if(__Serializer.prototype._notNameChars.indexOf(uri[k]) >= 0) { - canSplit = false; - break; - } - } - if(canSplit) { - var localid = uri.slice(j + 1); - var namesp = uri.slice(0, j + 1); - if(sz.defaultNamespace - && sz.defaultNamespace == namesp - && sz.flags.indexOf('d') < 0) { // d -> suppress default - if(sz.flags.indexOf('k') >= 0 - && sz.keyords.indexOf(localid) < 0) - return localid; - return ':' + localid; - } - var prefix = sz.prefixes[namesp]; - if(prefix) { - namespaceCounts[namesp] = true; - return prefix + ':' + localid; - } - if(uri.slice(0, j) == sz.base) - return '<#' + localid + '>'; - // Fall though if can't do qname - } - } - if(sz.flags.indexOf('r') < 0 && sz.base) - uri = $rdf.Util.uri.refTo(sz.base, uri); - else if(sz.flags.indexOf('u') >= 0) - uri = backslashUify(uri); - else uri = hexify(uri); - return '<' + uri + '>'; - } - - function prefixDirectives() { - var str = ''; - if(sz.defaultNamespace) - str += '@prefix : <' + sz.defaultNamespace + '>.\n'; - for(var ns in namespaceCounts) { - str += '@prefix ' + sz.prefixes[ns] + ': <' + ns + '>.\n'; - } - return str + '\n'; - } - - // stringToN3: String escaping for N3 - // - var forbidden1 = new RegExp(/[\\"\b\f\r\v\t\n\u0080-\uffff]/gm); - var forbidden3 = new RegExp(/[\\"\b\f\r\v\u0080-\uffff]/gm); - - function stringToN3(str, flags) { - if(!flags) flags = "e"; - var res = '', i = 0, j = 0; - var delim; - var forbidden; - if(str.length > 20 // Long enough to make sense - && str.slice(-1) != '"' // corner case' - && flags.indexOf('n') < 0 // Force single line - && (str.indexOf('\n') > 0 || str.indexOf('"') > 0)) { - delim = '"""'; - forbidden = forbidden3; - } else { - delim = '"'; - forbidden = forbidden1; - } - for(i = 0; i < str.length;) { - forbidden.lastIndex = 0; - var m = forbidden.exec(str.slice(i)); - if(m == null) break; - j = i + forbidden.lastIndex - 1; - res += str.slice(i, j); - var ch = str[j]; - if(ch == '"' && delim == '"""' && str.slice(j, j + 3) != '"""') { - res += ch; - } else { - var k = '\b\f\r\t\v\n\\"'.indexOf(ch); // No escaping of bell (7)? - if(k >= 0) { - res += "\\" + 'bfrtvn\\"' [k]; - } else { - if(flags.indexOf('e') >= 0) { - res += '\\u' + ('000' + ch.charCodeAt(0).toString(16).toLowerCase()).slice(-4) - } else { // no 'e' flag - res += ch; - } - } - } - i = j + 1; - } - return delim + res + str.slice(i) + delim - } - - // Body of toN3: - var tree = statementListToTree(sts); - return prefixDirectives() + treeToString(tree, -1); - -} - -// String ecaping utilities -function hexify(str) { // also used in parser - // var res = ''; - // for (var i=0; i126 || k<33) - // res += '%' + ('0'+n.toString(16)).slice(-2); // convert to upper? - // else - // res += str[i]; - // } - // return res; - return encodeURI(str); -} - - -function backslashUify(str) { - var res = '', k; - for(var i = 0; i < str.length; i++) { - k = str.charCodeAt(i); - if(k > 65535) - res += '\\U' + ('00000000' + n.toString(16)).slice(-8); // convert to upper? - else if(k > 126) - res += '\\u' + ('0000' + n.toString(16)).slice(-4); - else - res += str[i]; - } - return res; -} - - - - - - -//////////////////////////////////////////////// XML serialization -__Serializer.prototype.statementsToXML = function (sts) { - var indent = 4; - var width = 80; - var sz = this; - - var namespaceCounts = []; // which have been used - namespaceCounts['http://www.w3.org/1999/02/22-rdf-syntax-ns#'] = true; - - ////////////////////////// Arrange the bits of XML text - var spaces = function (n) { - var s = ''; - for(var i = 0; i < n; i++) s += ' '; - return s - } - - var XMLtreeToLine = function (tree) { - var str = ''; - for(var i = 0; i < tree.length; i++) { - var branch = tree[i]; - var s2 = (typeof branch == 'string') ? branch : XMLtreeToLine(branch); - str += s2; - } - return str; - } - - // Convert a nested tree of lists and strings to a string - var XMLtreeToString = function (tree, level) { - var str = ''; - var lastLength = 100000; - if(!level) level = 0; - for(var i = 0; i < tree.length; i++) { - var branch = tree[i]; - if(typeof branch != 'string') { - var substr = XMLtreeToString(branch, level + 1); - if(substr.length < 10 * (width - indent * level) - && substr.indexOf('"""') < 0) { - // Don't mess up multiline strings - var line = XMLtreeToLine(branch); - if(line.length < (width - indent * level)) { - branch = ' ' + line; // @@ Hack: treat as string below - substr = '' - } - } - if(substr) lastLength = 10000; - str += substr; - } - if(typeof branch == 'string') { - if(lastLength < (indent * level + 4)) { // continue - str = str.slice(0, -1) + ' ' + branch + '\n'; - lastLength += branch.length + 1; - } else { - var line = spaces(indent * level) + branch; - str += line + '\n'; - lastLength = line.length; - } - - } else { // not string - } - } - return str; - }; - - function statementListToXMLTree(statements) { - sz.suggestPrefix('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); - var stats = sz.rootSubjects(statements); - var roots = stats.roots; - var results = [], root; - for(var i = 0; i < roots.length; i++) { - root = roots[i]; - results.push(subjectXMLTree(root, stats)) - } - return results; - } - - function escapeForXML(str) { - if(typeof str == 'undefined') return '@@@undefined@@@@'; - return str.replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); - } - - function relURI(term) { - return escapeForXML((sz.base) ? $rdf.Util.uri.refTo(this.base, term.uri) : term.uri); - } - - // The tree for a subject - function subjectXMLTree(subject, stats) { - const liPrefix = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#_'; - var results = []; - var type = null, t, st; - var sts = stats.subjects[sz.toStr(subject)]; // relevant statements - // Sort only on the predicate, leave the order at object - // level undisturbed. This leaves multilingual content in - // the order of entry (for partner literals), which helps - // readability. - // - // For the predicate sort, we attempt to split the uri - // as a hint to the sequence, as sequenced items seems - // to be of the form http://example.com#_1, http://example.com#_2, - // et cetera. Probably not the most optimal of fixes, but - // it does work. - sts.sort(function (a, b) { - var aa = a.predicate.uri.split('#_'); - var bb = a.predicate.uri.split('#_'); - if(aa[0] > bb[0]) { - return 1; - } else if(aa[0] < bb[0]) { - return -1; - } else if("undefined" !== typeof aa[1] && "undefined" !== typeof bb[1]) { - if(parseInt(aa[1], 10) > parseInt(bb[1], 10)) { - return 1; - } else if(parseInt(aa[1], 10) < parseInt(bb[1], 10)) { - return -1; - } - } - return 0; - }); - - for(var i = 0; i < sts.length; i++) { - st = sts[i]; - if(st.predicate.uri == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' && !type && st.object.termType == "symbol") { - // look for a type - type = st.object; - } else { - // see whether predicate can be replaced with "li" - if(st.predicate.uri.substr(0, liPrefix.length) == liPrefix) { - var number = st.predicate.uri.substr(liPrefix.length); - // make sure these are actually numeric list items - var intNumber = parseInt(number); - if(number == intNumber.toString()) { - // was numeric; don't need to worry about ordering since we've already - // sorted the statements - st.predicate = $rdf.Symbol('http://www.w3.org/1999/02/22-rdf-syntax-ns#li'); - } - } - t = qname(st.predicate); - switch(st.object.termType) { - case 'bnode': - if(sz.incoming[st.object].length == 1) { - results = results.concat(['<' + t + '>', - subjectXMLTree(st.object, stats), - '']); - } else { - results = results.concat(['<' + t + ' rdf:nodeID="' - + st.object.toNT().slice(2) + '"/>']); - } - break; - case 'symbol': - results = results.concat(['<' + t + ' rdf:resource="' - + relURI(st.object) + '"/>']); - break; - case 'literal': - results = results.concat(['<' + t - + (st.object.dt ? ' rdf:datatype="' + escapeForXML(st.object.dt.uri) + '"' : '') - + (st.object.lang ? ' xml:lang="' + st.object.lang + '"' : '') - + '>' + escapeForXML(st.object.value) - + '']); - break; - case 'collection': - results = results.concat(['<' + t + ' rdf:parseType="Collection">', - collectionXMLTree(st.object, stats), - '']); - break; - default: - throw "Can't serialize object of type " + st.object.termType + " into XML"; - } // switch - } - } - - var tag = type ? qname(type) : 'rdf:Description'; - - var attrs = ''; - if(subject.termType == 'bnode') { - if(!sz.incoming[subject] || sz.incoming[subject].length != 1) { // not an anonymous bnode - attrs = ' rdf:nodeID="' + subject.toNT().slice(2) + '"'; - } - } else { - attrs = ' rdf:about="' + relURI(subject) + '"'; - } - - return ['<' + tag + attrs + '>'].concat([results]).concat([""]); - } - - function collectionXMLTree(subject, stats) { - var res = [] - for(var i = 0; i < subject.elements.length; i++) { - res.push(subjectXMLTree(subject.elements[i], stats)); - } - return res; - } - - // The property tree for a single subject or anonymos node - function propertyXMLTree(subject, stats) { - var results = [] - var sts = stats.subjects[sz.toStr(subject)]; // relevant statements - if(sts == undefined) return results; // No relevant statements - sts.sort(); - for(var i = 0; i < sts.length; i++) { - var st = sts[i]; - switch(st.object.termType) { - case 'bnode': - if(stats.rootsHash[st.object.toNT()]) { // This bnode has been done as a root -- no content here @@ what bout first time - results = results.concat(['<' + qname(st.predicate) + ' rdf:nodeID="' + st.object.toNT().slice(2) + '">', - '']); - } else { - results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Resource">', - propertyXMLTree(st.object, stats), - '']); - } - break; - case 'symbol': - results = results.concat(['<' + qname(st.predicate) + ' rdf:resource="' - + relURI(st.object) + '"/>']); - break; - case 'literal': - results = results.concat(['<' + qname(st.predicate) - + (st.object.datatype ? ' rdf:datatype="' + escapeForXML(st.object.datatype.uri) + '"' : '') - + (st.object.lang ? ' xml:lang="' + st.object.lang + '"' : '') - + '>' + escapeForXML(st.object.value) - + '']); - break; - case 'collection': - results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Collection">', - collectionXMLTree(st.object, stats), - '']); - break; - default: - throw "Can't serialize object of type " + st.object.termType + " into XML"; - - } // switch - } - return results; - } - - function qname(term) { - var uri = term.uri; - - var j = uri.search(sz._NCNameRegExp); - if(j < 0) throw("Cannot make qname out of <" + uri + ">") - - var localid = uri.substr(j); - var namesp = uri.substr(0, j); - if(sz.defaultNamespace - && sz.defaultNamespace == namesp - && sz.flags.indexOf('d') < 0) { // d -> suppress default - return localid; - } - var prefix = sz.prefixes[namesp]; - if(!prefix) prefix = sz.makeUpPrefix(namesp); - namespaceCounts[namesp] = true; - return prefix + ':' + localid; - // throw ('No prefix for namespace "'+namesp +'" for XML qname for '+uri+', namespaces: '+sz.prefixes+' sz='+sz); - } - - // Body of toXML: - var tree = statementListToXMLTree(sts); - var str = '']; //@@ namespace declrations - return XMLtreeToString(tree2, -1); - - - } // End @@ body - return Serializer; - -}(); - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = $rdf.Serializer; -} diff --git a/zotero-connectors/src/translate/src/rdf/term.js b/zotero-connectors/src/translate/src/rdf/term.js deleted file mode 100644 index c7855159..00000000 --- a/zotero-connectors/src/translate/src/rdf/term.js +++ /dev/null @@ -1,506 +0,0 @@ -// These are the classes corresponding to the RDF and N3 data models -// -// Designed to look like rdflib and cwm designs. -// -// Issues: Should the names start with RDF to make them -// unique as program-wide symbols? -// -// W3C open source licence 2005. -// -// Symbol - -(function() { - -if (typeof process === 'object' && process + '' === '[object process]'){ - this.$rdf = require('./init'); -} - -var Term = {}; - -Term.Empty = function () { - return this; -}; - -Term.Empty.prototype.termType = 'empty'; -Term.Empty.prototype.toString = function () { - return "()" -}; -Term.Empty.prototype.toNT = Term.Empty.prototype.toString; - -Term.Symbol = function (uri) { - this.uri = uri; - this.value = uri; // -- why? -tim - return this; -} - -Term.Symbol.prototype.termType = 'symbol'; -Term.Symbol.prototype.toString = function () { - return("<" + this.uri + ">"); -}; -Term.Symbol.prototype.toNT = Term.Symbol.prototype.toString; - -// Some precalculated symbols -Term.Symbol.prototype.XSDboolean = new Term.Symbol('http://www.w3.org/2001/XMLSchema#boolean'); -Term.Symbol.prototype.XSDdecimal = new Term.Symbol('http://www.w3.org/2001/XMLSchema#decimal'); -Term.Symbol.prototype.XSDfloat = new Term.Symbol('http://www.w3.org/2001/XMLSchema#float'); -Term.Symbol.prototype.XSDinteger = new Term.Symbol('http://www.w3.org/2001/XMLSchema#integer'); -Term.Symbol.prototype.XSDdateTime = new Term.Symbol('http://www.w3.org/2001/XMLSchema#dateTime'); -Term.Symbol.prototype.integer = new Term.Symbol('http://www.w3.org/2001/XMLSchema#integer'); // Used? -// Blank Node -if(typeof Term.NextId != 'undefined') { - Term.log('Attempt to re-zero existing blank node id counter at ' + Term.NextId); -} else { - Term.NextId = 0; // Global genid -} -Term.NTAnonymousNodePrefix = "_:n"; - -Term.BlankNode = function (id) { - /*if (id) - this.id = id; - else*/ - this.id = Term.NextId++; - this.value = id ? id : this.id.toString(); - return this -}; - -Term.BlankNode.prototype.termType = 'bnode'; -Term.BlankNode.prototype.toNT = function () { - return Term.NTAnonymousNodePrefix + this.id -}; -Term.BlankNode.prototype.toString = Term.BlankNode.prototype.toNT; - -// Literal -Term.Literal = function (value, lang, datatype) { - this.value = value - if(lang == "" || lang == null) this.lang = undefined; - else this.lang = lang; // string - if(datatype == null) this.datatype = undefined; - else this.datatype = datatype; // term - return this; -} - -Term.Literal.prototype.termType = 'literal' -Term.Literal.prototype.toString = function () { - return '' + this.value; -}; -Term.Literal.prototype.toNT = function () { - var str = this.value - if(typeof str != 'string') { - if(typeof str == 'number') return '' + str; - throw Error("Value of RDF literal is not string: " + str) - } - str = str.replace(/\\/g, '\\\\'); // escape backslashes - str = str.replace(/\"/g, '\\"'); // escape quotes - str = str.replace(/\n/g, '\\n'); // escape newlines - str = '"' + str + '"' //'; - if(this.datatype) { - str = str + '^^' + this.datatype.toNT() - } - if(this.lang) { - str = str + "@" + this.lang; - } - return str; -}; - -Term.Collection = function () { - this.id = Term.NextId++; // Why need an id? For hashstring. - this.elements = []; - this.closed = false; -}; - -Term.Collection.prototype.termType = 'collection'; - -Term.Collection.prototype.toNT = function () { - return Term.NTAnonymousNodePrefix + this.id -}; - -Term.Collection.prototype.toString = function () { - var str = '('; - for(var i = 0; i < this.elements.length; i++) - str += this.elements[i] + ' '; - return str + ')'; -}; - -Term.Collection.prototype.append = function (el) { - this.elements.push(el) -} -Term.Collection.prototype.unshift = function (el) { - this.elements.unshift(el); -} -Term.Collection.prototype.shift = function () { - return this.elements.shift(); -} - -Term.Collection.prototype.close = function () { - this.closed = true -} - - -// Convert Javascript representation to RDF term object -// -Term.term = function (val) { - if(typeof val == 'object') - if(val instanceof Date) { - var d2 = function (x) { - return('' + (100 + x)).slice(1, 3) - }; // format as just two digits - return new Term.Literal('' + val.getUTCFullYear() + '-' + d2(val.getUTCMonth() + 1) - + '-' + d2(val.getUTCDate()) + 'T' + d2(val.getUTCHours()) + ':' - + d2(val.getUTCMinutes()) + ':' + d2(val.getUTCSeconds()) + 'Z', - undefined, - Term.Symbol.prototype.XSDdateTime); - - } else if(val instanceof Array) { - var x = new Term.Collection(); - for(var i = 0; i < val.length; i++) - x.append(Term.term(val[i])); - return x; - } else - return val; - if(typeof val == 'string') - return new Term.Literal(val); - if(typeof val == 'number') { - var dt; - if(('' + val).indexOf('e') >= 0) dt = Term.Symbol.prototype.XSDfloat; - else if(('' + val).indexOf('.') >= 0) dt = Term.Symbol.prototype.XSDdecimal; - else dt = Term.Symbol.prototype.XSDinteger; - return new Term.Literal(val, undefined, dt); - } - if(typeof val == 'boolean') - return new Term.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean); - if(typeof val == 'undefined') - return undefined; - throw("Can't make term from " + val + " of type " + typeof val); -} - -// Statement -// -// This is a triple with an optional reason. -// -// The reason can point to provenece or inference -// -Term.Statement = function (subject, predicate, object, why) { - this.subject = Term.term(subject) - this.predicate = Term.term(predicate) - this.object = Term.term(object) - if(typeof why != 'undefined') { - this.why = why; - } - return this; -} - -Term.st = function (subject, predicate, object, why) { - return new Term.Statement(subject, predicate, object, why); -}; - -Term.Statement.prototype.toNT = function () { - return (this.subject.toNT() + " " + this.predicate.toNT() + " " + this.object.toNT() + " ."); -}; - -Term.Statement.prototype.toString = Term.Statement.prototype.toNT; - -// Formula -// -// Set of statements. -Term.Formula = function () { - this.statements = [] - this.constraints = [] - this.initBindings = [] - this.optional = [] - return this; -}; - - -Term.Formula.prototype.termType = 'formula'; -Term.Formula.prototype.toNT = function () { - return "{" + this.statements.join('\n') + "}" -}; -Term.Formula.prototype.toString = Term.Formula.prototype.toNT; - -Term.Formula.prototype.add = function (subj, pred, obj, why) { - this.statements.push(new Term.Statement(subj, pred, obj, why)) -} - -// Convenience methods on a formula allow the creation of new RDF terms: -Term.Formula.prototype.sym = function (uri, name) { - if(name != null) { - throw "This feature (kb.sym with 2 args) is removed. Do not assume prefix mappings." - } - return new Term.Symbol(uri) -} - -Term.sym = function (uri) { - return new Term.Symbol(uri); -}; - -Term.Formula.prototype.literal = function (val, lang, dt) { - return new Term.Literal(val.toString(), lang, dt) -} -Term.lit = Term.Formula.prototype.literal; - -Term.Formula.prototype.bnode = function (id) { - return new Term.BlankNode(id) -} - -Term.Formula.prototype.formula = function () { - return new Term.Formula() -} - -Term.Formula.prototype.collection = function () { // obsolete - return new Term.Collection() -} - -Term.Formula.prototype.list = function (values) { - var li = new Term.Collection(); - if(values) { - for(var i = 0; i < values.length; i++) { - li.append(values[i]); - } - } - return li; -} - -/* Variable - ** - ** Variables are placeholders used in patterns to be matched. - ** In cwm they are symbols which are the formula's list of quantified variables. - ** In sparl they are not visibily URIs. Here we compromise, by having - ** a common special base URI for variables. Their names are uris, - ** but the ? nottaion has an implicit base uri of 'varid:' - */ - -Term.Variable = function (rel) { - this.base = "varid:"; // We deem variabe x to be the symbol varid:x - this.uri = $rdf.Util.uri.join(rel, this.base); - return this; -} - -Term.Variable.prototype.termType = 'variable'; -Term.Variable.prototype.toNT = function () { - if(this.uri.slice(0, this.base.length) == this.base) { - return '?' + this.uri.slice(this.base.length); - } // @@ poor man's refTo - return '?' + this.uri; -}; - -Term.Variable.prototype.toString = Term.Variable.prototype.toNT; -Term.Variable.prototype.classOrder = 7; - -Term.variable = Term.Formula.prototype.variable = function (name) { - return new Term.Variable(name); -}; - -Term.Variable.prototype.hashString = Term.Variable.prototype.toNT; - - -// The namespace function generator -Term.Namespace = function (nsuri) { - return function (ln) { - return new Term.Symbol(nsuri + (ln === undefined ? '' : ln)) - } -} - -Term.Formula.prototype.ns = function (nsuri) { - return function (ln) { - return new Term.Symbol(nsuri + (ln === undefined ? '' : ln)) - } -} - - -// Parse a single token -// -// The bnode bit should not be used on program-external values; designed -// for internal work such as storing a bnode id in an HTML attribute. -// This will only parse the strings generated by the vaious toNT() methods. -Term.Formula.prototype.fromNT = function (str) { - var len = str.length - var ch = str.slice(0, 1) - if(ch == '<') return Term.sym(str.slice(1, len - 1)) - if(ch == '"') { - var lang = undefined; - var dt = undefined; - var k = str.lastIndexOf('"'); - if(k < len - 1) { - if(str[k + 1] == '@') lang = str.slice(k + 2, len); - else if(str.slice(k + 1, k + 3) == '^^') dt = Term.fromNT(str.slice(k + 3, len)); - else throw "Can't convert string from NT: " + str - } - var str = (str.slice(1, k)); - str = str.replace(/\\"/g, '"'); // unescape quotes ' - str = str.replace(/\\n/g, '\n'); // unescape newlines - str = str.replace(/\\\\/g, '\\'); // unescape backslashes - return Term.lit(str, lang, dt); - } - if(ch == '_') { - var x = new Term.BlankNode(); - x.id = parseInt(str.slice(3)); - Term.NextId-- - return x - } - if(ch == '?') { - var x = new Term.Variable(str.slice(1)); - return x; - } - throw "Can't convert from NT: " + str; - -} -Term.fromNT = Term.Formula.prototype.fromNT; // Not for inexpert user -// Convenience - and more conventional name: -Term.graph = function () { - return new $rdf.IndexedFormula(); -}; - -// ends - - -/* - * Update 2018-06-01 - * match.js extension for term.js: - * https://github.com/zotero/zotero/blob/805d3ed6a67add126eff97579200458b52bf5ac5/chrome/content/zotero/xpcom/rdf/match.js - */ - -Term.Symbol.prototype.sameTerm = function (other) { - if(!other) { - return false - } - return((this.termType == other.termType) && (this.uri == other.uri)) -} - -Term.BlankNode.prototype.sameTerm = function (other) { - if(!other) { - return false - } - return((this.termType == other.termType) && (this.id == other.id)) -} - -Term.Literal.prototype.sameTerm = function (other) { - if(!other) { - return false - } - return((this.termType == other.termType) - && (this.value == other.value) - && (this.lang == other.lang) - && ((!this.datatype && !other.datatype) - || (this.datatype && this.datatype.sameTerm(other.datatype)))) -} - -Term.Variable.prototype.sameTerm = function (other) { - if(!other) { - return false - } - return((this.termType == other.termType) && (this.uri == other.uri)) -} - -Term.Collection.prototype.sameTerm = Term.BlankNode.prototype.sameTerm - -Term.Formula.prototype.sameTerm = function (other) { - return this.hashString() == other.hashString(); -} -// Comparison for ordering -// -// These compare with ANY term -// -// -// When we smush nodes we take the lowest value. This is not -// arbitrary: we want the value actually used to be the literal -// (or list or formula). -Term.Literal.prototype.classOrder = 1 -Term.Collection.prototype.classOrder = 3 -Term.Formula.prototype.classOrder = 4 -Term.Symbol.prototype.classOrder = 5 -Term.BlankNode.prototype.classOrder = 6 - -// Compaisons return sign(self - other) -// Literals must come out before terms for smushing -Term.Literal.prototype.compareTerm = function (other) { - if(this.classOrder < other.classOrder) return -1 - if(this.classOrder > other.classOrder) return +1 - if(this.value < other.value) return -1 - if(this.value > other.value) return +1 - return 0 -} - -Term.Symbol.prototype.compareTerm = function (other) { - if(this.classOrder < other.classOrder) return -1 - if(this.classOrder > other.classOrder) return +1 - if(this.uri < other.uri) return -1 - if(this.uri > other.uri) return +1 - return 0 -} - -Term.BlankNode.prototype.compareTerm = function (other) { - if(this.classOrder < other.classOrder) return -1 - if(this.classOrder > other.classOrder) return +1 - if(this.id < other.id) return -1 - if(this.id > other.id) return +1 - return 0 -} - -Term.Collection.prototype.compareTerm = Term.BlankNode.prototype.compareTerm - -// Convenience routines -// Only one of s p o can be undefined, and w is optional. -Term.Formula.prototype.each = function (s, p, o, w) { - var results = [] - var st, sts = this.statementsMatching(s, p, o, w, false) - var i, n = sts.length - if(typeof s == 'undefined') { - for(i = 0; i < n; i++) { - st = sts[i]; - results.push(st.subject) - } - } else if(typeof p == 'undefined') { - for(i = 0; i < n; i++) { - st = sts[i]; - results.push(st.predicate) - } - } else if(typeof o == 'undefined') { - for(i = 0; i < n; i++) { - st = sts[i]; - results.push(st.object) - } - } else if(typeof w == 'undefined') { - for(i = 0; i < n; i++) { - st = sts[i]; - results.push(st.why) - } - } - return results -} - -Term.Formula.prototype.any = function (s, p, o, w) { - var st = this.anyStatementMatching(s, p, o, w) - if(typeof st == 'undefined') return undefined; - - if(typeof s == 'undefined') return st.subject; - if(typeof p == 'undefined') return st.predicate; - if(typeof o == 'undefined') return st.object; - - return undefined -} - -Term.Formula.prototype.holds = function (s, p, o, w) { - var st = this.anyStatementMatching(s, p, o, w) - if(typeof st == 'undefined') return false; - return true; -} - -Term.Formula.prototype.the = function (s, p, o, w) { - // the() should contain a check there is only one - var x = this.any(s, p, o, w) - if(typeof x == 'undefined') - $rdf.log("No value found for the(){" + s + " " + p + " " + o + "}.") - return x -} - -Term.Formula.prototype.whether = function (s, p, o, w) { - return this.statementsMatching(s, p, o, w, false).length; -} - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = Term; -} -else { - Object.assign($rdf, Term); -} -})(); diff --git a/zotero-connectors/src/translate/src/rdf/uri.js b/zotero-connectors/src/translate/src/rdf/uri.js deleted file mode 100644 index 5dd5e90e..00000000 --- a/zotero-connectors/src/translate/src/rdf/uri.js +++ /dev/null @@ -1,147 +0,0 @@ -// Implementing URI-specific functions -// -// See RFC 2386 -// -// This is or was http://www.w3.org/2005/10/ajaw/uri.js -// 2005 W3C open source licence -// -// -// Take a URI given in relative or absolute form and a base -// URI, and return an absolute URI -// -// See also http://www.w3.org/2000/10/swap/uripath.py -// - -if (typeof process === 'object' && process + '' === '[object process]'){ - var $rdf = require('./init'); -} - -if(typeof $rdf.Util.uri == "undefined") { - $rdf.Util.uri = {}; -}; - -$rdf.Util.uri.join = function (given, base) { - // if (typeof $rdf.log != 'undefined') $rdf.log(" URI given="+given+" base="+base) - var baseHash = base.indexOf('#') - if(baseHash > 0) base = base.slice(0, baseHash) - if(given.length == 0) return base // before chopping its filename off - if(given.indexOf('#') == 0) return base + given - var colon = given.indexOf(':') - if(colon >= 0) return given // Absolute URI form overrides base URI - var baseColon = base.indexOf(':') - if(base == "") return given; - if(baseColon < 0) { - $rdf.log("Invalid base: " + base + ' in join with ' + given); - return given - } - var baseScheme = base.slice(0, baseColon + 1) // eg http: - if(given.indexOf("//") == 0) // Starts with // - return baseScheme + given; - if(base.indexOf('//', baseColon) == baseColon + 1) { // Any hostpart? - var baseSingle = base.indexOf("/", baseColon + 3) - if(baseSingle < 0) { - if(base.length - baseColon - 3 > 0) { - return base + "/" + given - } else { - return baseScheme + given - } - } - } else { - var baseSingle = base.indexOf("/", baseColon + 1) - if(baseSingle < 0) { - if(base.length - baseColon - 1 > 0) { - return base + "/" + given - } else { - return baseScheme + given - } - } - } - - if(given.indexOf('/') == 0) // starts with / but not // - return base.slice(0, baseSingle) + given - - var path = base.slice(baseSingle) - var lastSlash = path.lastIndexOf("/") - if(lastSlash < 0) return baseScheme + given - if((lastSlash >= 0) - && (lastSlash < (path.length - 1))) - path = path.slice(0, lastSlash + 1) // Chop trailing filename from base - path = path + given - while(path.match(/[^\/]*\/\.\.\//)) // must apply to result of prev - path = path.replace(/[^\/]*\/\.\.\//, '') // ECMAscript spec 7.8.5 - path = path.replace(/\.\//g, '') // spec vague on escaping - path = path.replace(/\/\.$/, '/') - return base.slice(0, baseSingle) + path -} - -// refTo: Make a URI relative to a given base -// -// based on code in http://www.w3.org/2000/10/swap/uripath.py -// -$rdf.Util.uri.commonHost = new RegExp("^[-_a-zA-Z0-9.]+:(//[^/]*)?/[^/]*$"); - -$rdf.Util.uri.hostpart = function (u) { - var m = /[^\/]*\/\/([^\/]*)\//.exec(u); - return m ? m[1] : '' -}; - -$rdf.Util.uri.refTo = function (base, uri) { - if(!base) return uri; - if(base == uri) return ""; - var i = 0; // How much are they identical? - while(i < uri.length && i < base.length) - if(uri[i] == base[i]) i++; - else break; - if(base.slice(0, i).match($rdf.Util.uri.commonHost)) { - var k = uri.indexOf('//'); - if(k < 0) k = -2; // no host - var l = uri.indexOf('/', k + 2); // First *single* slash - if(uri.slice(l + 1, l + 2) != '/' - && base.slice(l + 1, l + 2) != '/' - && uri.slice(0, l) == base.slice(0, l)) - // common path to single slash - return uri.slice(l); // but no other common path segments - } - // fragment of base? - if(uri.slice(i, i + 1) == '#' && base.length == i) return uri.slice(i); - while(i > 0 && uri[i - 1] != '/') i--; - - if(i < 3) return uri; // No way - if((base.indexOf('//', i - 2) > 0) - || uri.indexOf('//', i - 2) > 0) - return uri; // an unshared '//' - if(base.indexOf(':', i) > 0) return uri; // unshared ':' - var n = 0; - for(var j = i; j < base.length; j++) if(base[j] == '/') n++; - if(n == 0 && i < uri.length && uri[i] == '#') return './' + uri.slice(i); - if(n == 0 && i == uri.length) return './'; - var str = ''; - for(var j = 0; j < n; j++) str += '../'; - return str + uri.slice(i); -} - - -/** returns URI without the frag **/ -$rdf.Util.uri.docpart = function (uri) { - var i = uri.indexOf("#") - if(i < 0) return uri - return uri.slice(0, i) -} - -/** The document in which something a thing defined **/ -$rdf.Util.uri.document = function (x) { - return $rdf.sym($rdf.Util.uri.docpart(x.uri)); -} - -/** return the protocol of a uri **/ -/** return null if there isn't one **/ -$rdf.Util.uri.protocol = function (uri) { - var index = uri.indexOf(':'); - if(index >= 0) return uri.slice(0, index); - else return null; -} //protocol -//ends - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = $rdf.Util; -} diff --git a/zotero-connectors/src/translate/src/repo.js b/zotero-connectors/src/translate/src/repo.js deleted file mode 100644 index b31b7166..00000000 --- a/zotero-connectors/src/translate/src/repo.js +++ /dev/null @@ -1,80 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2011 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - -Zotero.Repo = new function() { - var _nextCheck; - var _timeoutID; - this.infoRe = /^\s*{[\S\s]*?}\s*?[\r\n]/; - - /** - * Get translator code from repository - * - * @param {String} translatorID ID of the translator to retrieve code for - * @returns {Promise} full translator code - */ - this.getTranslatorCode = async function (translatorID) { - let code; - try { - let url = `${ZOTERO_CONFIG.REPOSITORY_URL}code/${translatorID}?version=${Zotero.version}`; - let xmlhttp = await Zotero.HTTP.request("GET", url); - code = xmlhttp.responseText; - } - catch (e) { - throw new Error("Repo: Code could not be retrieved for " + translatorID + "\n" + e.message); - } - - var m = this.infoRe.exec(code); - if (!m) { - throw new Error("Repo: Invalid or missing translator metadata JSON object for " + translatorID); - } - try { - JSON.parse(m[0]); - } catch(e) { - throw new Error("Repo: Invalid or missing translator metadata JSON object for " + translatorID); - } - - return code; - }; - - /** - * Retrieves all translator metadata. The parameter is a timestamp since the - * last retrieval, in which case only metadata for changed translators is - * returned. - * - * @param since {Number} timestamp in seconds - * @returns {Promise} - */ - this.getAllTranslatorMetadata = async (since=0) => { - var url = ZOTERO_CONFIG.REPOSITORY_URL + "metadata?version=" + Zotero.version + "&last="+ since; - - try { - let xmlhttp = await Zotero.HTTP.request('GET', url); - return JSON.parse(xmlhttp.responseText); - } - catch (e) { - throw new Error("Repo: Failed to retrieve all translator metadata\n" + e.message); - } - }; -} \ No newline at end of file diff --git a/zotero-connectors/src/translate/src/tlds.js b/zotero-connectors/src/translate/src/tlds.js deleted file mode 100644 index 9b5405dd..00000000 --- a/zotero-connectors/src/translate/src/tlds.js +++ /dev/null @@ -1,274 +0,0 @@ -const TLDS = { - "ac":true, - "ad":true, - "ae":true, - "aero":true, - "af":true, - "ag":true, - "ai":true, - "al":true, - "am":true, - "an":true, - "ao":true, - "aq":true, - "ar":true, - "arpa":true, - "as":true, - "asia":true, - "at":true, - "au":true, - "aw":true, - "ax":true, - "az":true, - "ba":true, - "bb":true, - "bd":true, - "be":true, - "bf":true, - "bg":true, - "bh":true, - "bi":true, - "biz":true, - "bj":true, - "bm":true, - "bn":true, - "bo":true, - "br":true, - "bs":true, - "bt":true, - "bv":true, - "bw":true, - "by":true, - "bz":true, - "ca":true, - "cat":true, - "cc":true, - "cd":true, - "cf":true, - "cg":true, - "ch":true, - "ci":true, - "ck":true, - "cl":true, - "cm":true, - "cn":true, - "co":true, - "com":true, - "coop":true, - "cr":true, - "cu":true, - "cv":true, - "cx":true, - "cy":true, - "cz":true, - "de":true, - "dj":true, - "dk":true, - "dm":true, - "do":true, - "dz":true, - "ec":true, - "edu":true, - "ee":true, - "eg":true, - "er":true, - "es":true, - "et":true, - "eu":true, - "fi":true, - "fj":true, - "fk":true, - "fm":true, - "fo":true, - "fr":true, - "ga":true, - "gb":true, - "gd":true, - "ge":true, - "gf":true, - "gg":true, - "gh":true, - "gi":true, - "gl":true, - "gm":true, - "gn":true, - "gov":true, - "gp":true, - "gq":true, - "gr":true, - "gs":true, - "gt":true, - "gu":true, - "gw":true, - "gy":true, - "hk":true, - "hm":true, - "hn":true, - "hr":true, - "ht":true, - "hu":true, - "id":true, - "ie":true, - "il":true, - "im":true, - "in":true, - "info":true, - "int":true, - "io":true, - "iq":true, - "ir":true, - "is":true, - "it":true, - "je":true, - "jm":true, - "jo":true, - "jobs":true, - "jp":true, - "ke":true, - "kg":true, - "kh":true, - "ki":true, - "km":true, - "kn":true, - "kp":true, - "kr":true, - "kw":true, - "ky":true, - "kz":true, - "la":true, - "lb":true, - "lc":true, - "li":true, - "lk":true, - "lr":true, - "ls":true, - "lt":true, - "lu":true, - "lv":true, - "ly":true, - "ma":true, - "mc":true, - "md":true, - "me":true, - "mg":true, - "mh":true, - "mil":true, - "mk":true, - "ml":true, - "mm":true, - "mn":true, - "mo":true, - "mobi":true, - "mp":true, - "mq":true, - "mr":true, - "ms":true, - "mt":true, - "mu":true, - "museum":true, - "mv":true, - "mw":true, - "mx":true, - "my":true, - "mz":true, - "na":true, - "name":true, - "nc":true, - "ne":true, - "net":true, - "nf":true, - "ng":true, - "ni":true, - "nl":true, - "no":true, - "np":true, - "nr":true, - "nu":true, - "nz":true, - "om":true, - "org":true, - "pa":true, - "pe":true, - "pf":true, - "pg":true, - "ph":true, - "pk":true, - "pl":true, - "pm":true, - "pn":true, - "pr":true, - "pro":true, - "ps":true, - "pt":true, - "pw":true, - "py":true, - "qa":true, - "re":true, - "ro":true, - "rs":true, - "ru":true, - "rw":true, - "sa":true, - "sb":true, - "sc":true, - "sd":true, - "se":true, - "sg":true, - "sh":true, - "si":true, - "sj":true, - "sk":true, - "sl":true, - "sm":true, - "sn":true, - "so":true, - "sr":true, - "st":true, - "su":true, - "sv":true, - "sy":true, - "sz":true, - "tc":true, - "td":true, - "tel":true, - "tf":true, - "tg":true, - "th":true, - "tj":true, - "tk":true, - "tl":true, - "tm":true, - "tn":true, - "to":true, - "tp":true, - "tr":true, - "travel":true, - "tt":true, - "tv":true, - "tw":true, - "tz":true, - "ua":true, - "ug":true, - "uk":true, - "us":true, - "uy":true, - "uz":true, - "va":true, - "vc":true, - "ve":true, - "vg":true, - "vi":true, - "vn":true, - "vu":true, - "wf":true, - "ws":true, - "xxx":true, - "ye":true, - "yt":true, - "za":true, - "zm":true, - "zw":true -}; -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = TLDS; -} \ No newline at end of file diff --git a/zotero-connectors/src/translate/src/translation/sandboxManager.js b/zotero-connectors/src/translate/src/translation/sandboxManager.js deleted file mode 100644 index d525ce66..00000000 --- a/zotero-connectors/src/translate/src/translation/sandboxManager.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - - -/** - * @class Manages the translator sandbox - */ -Zotero.Translate.SandboxManager = function() { - this.sandbox = { - Zotero: {}, - Promise, - }; -}; - -Zotero.Translate.SandboxManager.prototype = { - /** - * Evaluates code in the sandbox - * @param {String} code Code to evaluate - * @param {String[]} functions Functions to import into the sandbox (rather than leaving - * as inner functions) - */ - eval: function(code, functions) { - // delete functions to import - for (var i in functions) { - delete this.sandbox[functions[i]]; - } - - // Prepend sandbox properties within eval environment (what a mess (1)) - for (var prop in this.sandbox) { - code = 'var ' + prop + ' = this.sandbox.' + prop + ';' + code; - } - - // Import inner functions back into the sandbox - for (var i in functions) { - // TODO: Omit in translate.js? - if (functions[i] == 'detectExport') continue; - - try { - code += 'this.sandbox.' + functions[i] + ' = ' + functions[i] + ';'; - } catch (e) { - } - } - - // Eval in a closure - (function() { - eval(code); - }).call(this); - }, - - /** - * Imports an object into the sandbox - * - * @param {Object} object Object to be imported (under attachTo) - * @param {Boolean} passTranslateAsFirstArgument Whether the translate instance should be passed - * as the first argument to the function. - * @param {Object} attachTo An item from this.sandbox to which the object will be attached - * defaults to this.sandbox.Zotero - */ - importObject: function(object, passTranslateAsFirstArgument, attachTo) { - if(!attachTo) attachTo = this.sandbox.Zotero; - - for(var key in (object.__exposedProps__ ? object.__exposedProps__ : object)) { - if(Function.prototype[key]) continue; - if(typeof object[key] === "function" || typeof object[key] === "object") { - // magic closures - attachTo[key] = new function() { - var fn = object[key]; - return function() { - var args = (passTranslateAsFirstArgument ? [passTranslateAsFirstArgument] : []); - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @class - * Deprecated class for creating new Zotero.Translate instances
    - *
    - * New code should use Zotero.Translate.Web, Zotero.Translate.Import, Zotero.Translate.Export, or - * Zotero.Translate.Search - */ -Zotero.Translate = function(type) { - Zotero.debug("Translate: WARNING: new Zotero.Translate() is deprecated; please don't use this if you don't have to"); - // hack - var translate = Zotero.Translate.newInstance(type); - for(var i in translate) { - this[i] = translate[i]; - } - this.constructor = translate.constructor; - this.__proto__ = translate.__proto__; -} - -/** - * Create a new translator by a string type - */ -Zotero.Translate.newInstance = function(type) { - return new Zotero.Translate[type.substr(0, 1).toUpperCase()+type.substr(1).toLowerCase()]; -} - -/** - * Namespace for Zotero sandboxes - * @namespace - */ -Zotero.Translate.Sandbox = { - /** - * Combines a sandbox with the base sandbox - */ - "_inheritFromBase":function(sandboxToMerge) { - var newSandbox = {}; - - for(var method in Zotero.Translate.Sandbox.Base) { - newSandbox[method] = Zotero.Translate.Sandbox.Base[method]; - } - - for(var method in sandboxToMerge) { - newSandbox[method] = sandboxToMerge[method]; - } - - return newSandbox; - }, - - /** - * Base sandbox. These methods are available to all translators. - * @namespace - */ - "Base": { - /** - * Called as {@link Zotero.Item#complete} from translators to save items to the database. - * @param {Zotero.Translate} translate - * @param {SandboxItem} An item created using the Zotero.Item class from the sandbox - */ - _itemDone: function (translate, item) { - // https://github.com/zotero/translators/issues/1353 - var asyncTranslator = !(translate instanceof Zotero.Translate.Web) - && translate.translator[0].configOptions - && translate.translator[0].configOptions.async; - - var run = async function (async) { - Zotero.debug("Translate: Saving item"); - - // warn if itemDone called after translation completed - if(translate._complete) { - Zotero.debug("Translate: WARNING: Zotero.Item#complete() called after Zotero.done(); please fix your code", 2); - } - - const allowedObjects = [ - "complete", - "attachments", - "creators", - "tags", - "notes", - "relations", - // Is this still needed? - "seeAlso" - ]; - - // Create a new object here, so that we strip the "complete" property - var newItem = {}; - var oldItem = item; - for(var i in item) { - var val = item[i]; - if(i === "complete" || (!val && val !== 0)) continue; - - var type = typeof val; - var isObject = type === "object" || type === "xml" || type === "function", - shouldBeObject = allowedObjects.indexOf(i) !== -1; - if(isObject && !shouldBeObject) { - // Convert things that shouldn't be objects to objects - translate._debug("Translate: WARNING: typeof "+i+" is "+type+"; converting to string"); - newItem[i] = val.toString(); - } else if(shouldBeObject && !isObject) { - translate._debug("Translate: WARNING: typeof "+i+" is "+type+"; converting to array"); - newItem[i] = [val]; - } else if(type === "string") { - // trim strings - newItem[i] = val.trim(); - } else { - newItem[i] = val; - } - } - item = newItem; - - if (item.title) { - item.title = translate._cleanTitle(item.title, item.itemType); - // Short Title is added before this in the web itemDone, so if we removed - // a suffix (e.g., ": a novel") and the short title now matches the title, - // remove it - if (item.title == item.shortTitle) { - delete item.shortTitle; - } - } - - // Clean empty creators - if (item.creators) { - for (var i=0; i translate.decrementAsyncProcesses("Zotero.Translate#_saveItems()")); - } - }; - - return run(asyncTranslator); - }, - - /** - * Gets translator options that were defined in displayOptions in translator header - * - * @param {Zotero.Translate} translate - * @param {String} option Option to be retrieved - */ - "getOption":function(translate, option) { - if(typeof option !== "string") { - throw(new Error("getOption: option must be a string")); - return; - } - - return translate._displayOptions[option]; - }, - - /** - * Gets a hidden preference that can be defined by hiddenPrefs in translator header - * - * @param {Zotero.Translate} translate - * @param {String} pref Preference to be retrieved - */ - "getHiddenPref":function(translate, pref) { - if(typeof(pref) != "string") { - throw(new Error("getPref: preference must be a string")); - } - - var hp = translate._translatorInfo.hiddenPrefs || {}; - - var value; - try { - value = Zotero.Prefs.get('translators.' + pref); - } catch(e) {} - - return (value !== undefined ? value : hp[pref]); - }, - - /** - * For loading other translators and accessing their methods - * - * @param {Zotero.Translate} translate - * @param {String} type Translator type ("web", "import", "export", or "search") - * @returns {Object} A safeTranslator object, which operates mostly like Zotero.Translate - */ - "loadTranslator":function(translate, type) { - const setDefaultHandlers = function(translate, translation) { - if(type !== "export" - && (!translation._handlers['itemDone'] || !translation._handlers['itemDone'].length)) { - translation.setHandler("itemDone", function(obj, item) { - translate.Sandbox._itemDone(translate, item); - }); - } - if(!translation._handlers['selectItems'] || !translation._handlers['selectItems'].length) { - translation.setHandler("selectItems", translate._handlers["selectItems"]); - } - } - - if(typeof type !== "string") { - throw(new Error("loadTranslator: type must be a string")); - return; - } - - Zotero.debug("Translate: Creating translate instance of type "+type+" in sandbox"); - var translation = Zotero.Translate.newInstance(type); - translation._parentTranslator = translate; - translation.setTranslatorProvider(translate._translatorProvider); - - if(translation instanceof Zotero.Translate.Export && !(translation instanceof Zotero.Translate.Export)) { - throw(new Error("Only export translators may call other export translators")); - } - - /** - * @class Wrapper for {@link Zotero.Translate} for safely calling another translator - * from inside an existing translator - * @inner - */ - var safeTranslator = {}; - safeTranslator.setSearch = function(arg) { - if(!Zotero.isBookmarklet) arg = JSON.parse(JSON.stringify(arg)); - return translation.setSearch(arg); - }; - safeTranslator.setDocument = function(arg) { - if (Zotero.isFx && !Zotero.isBookmarklet) { - return translation.setDocument( - Zotero.Translate.DOMWrapper.wrap(arg, arg.SpecialPowers_wrapperOverrides) - ); - } else { - return translation.setDocument(arg); - } - }; - var errorHandlerSet = false; - safeTranslator.setHandler = function(arg1, arg2) { - if(arg1 === "error") errorHandlerSet = true; - translation.setHandler(arg1, - function(obj, item) { - try { - item = item.wrappedJSObject ? item.wrappedJSObject : item; - if(arg1 == "itemDone") { - item.complete = translate._sandboxZotero.Item.prototype.complete; - } - arg2(obj, item); - } catch(e) { - translate.complete(false, e); - } - } - ); - }; - safeTranslator.setString = function(arg) { translation.setString(arg) }; - safeTranslator.setTranslator = function(arg) { - var success = translation.setTranslator(arg); - if(!success) { - throw new Error("Translator "+translate.translator[0].translatorID+" attempted to call invalid translatorID "+arg); - } - }; - - var translatorsHandlerSet = false; - safeTranslator.getTranslators = async function () { - if(!translation._handlers["translators"] || !translation._handlers["translators"].length) { - throw new Error('Translator must register a "translators" handler to '+ - 'call getTranslators() in this translation environment.'); - } - if(!translatorsHandlerSet) { - translation.setHandler("translators", function() { - translate.decrementAsyncProcesses("safeTranslator#getTranslators()"); - }); - } - translate.incrementAsyncProcesses("safeTranslator#getTranslators()"); - return translation.getTranslators(); - }; - - var doneHandlerSet = false; - safeTranslator.translate = async function () { - translate.incrementAsyncProcesses("safeTranslator#translate()"); - setDefaultHandlers(translate, translation); - if(!doneHandlerSet) { - doneHandlerSet = true; - translation.setHandler("done", function() { translate.decrementAsyncProcesses("safeTranslator#translate()") }); - } - if(!errorHandlerSet) { - errorHandlerSet = true; - translation.setHandler("error", function(obj, error) { translate.complete(false, error) }); - } - return translation.translate(false); - }; - - safeTranslator.getTranslatorObject = function(callback) { - if(callback) { - translate.incrementAsyncProcesses("safeTranslator#getTranslatorObject()"); - } else { - throw new Error("Translator must pass a callback to getTranslatorObject() to "+ - "operate in this translation environment."); - } - - var translator = translation.translator[0]; - translator = typeof translator === "object" - ? translator - : translation._translatorProvider.get(translator); - // Zotero.Translators.get returns a value in the client and a promise in connectors - // so we normalize the value to a promise here - Zotero.Promise.resolve(translator) - .then(function(translator) { - return translation._loadTranslator(translator) - }) - .then(function() { - return translation._prepareTranslation(); - }) - .then(function () { - setDefaultHandlers(translate, translation); - var sandbox = translation._sandboxManager.sandbox; - if(!Zotero.Utilities.isEmpty(sandbox.exports)) { - sandbox.exports.Zotero = sandbox.Zotero; - sandbox = sandbox.exports; - } else { - translate._debug("COMPAT WARNING: "+translation.translator[0].label+" does "+ - "not export any properties. Only detect"+translation._entryFunctionSuffix+ - " and do"+translation._entryFunctionSuffix+" will be available in "+ - "connectors."); - } - - callback(sandbox); - translate.decrementAsyncProcesses("safeTranslator#getTranslatorObject()"); - }).catch(function(e) { - translate.complete(false, e); - return; - }); - }; - - return safeTranslator; - }, - - /** - * Enables asynchronous detection or translation - * @param {Zotero.Translate} translate - * @deprecated - */ - "wait":function(translate) {}, - - /** - * Sets the return value for detection - * - * @param {Zotero.Translate} translate - */ - "done":function(translate, returnValue) { - if(translate._currentState === "detect") { - translate._returnValue = returnValue; - } - }, - - /** - * Proxy for translator _debug function - * - * @param {Zotero.Translate} translate - * @param {String} string String to write to console - * @param {String} [level] Level to log as (1 to 5) - */ - "debug":function(translate, string, level) { - translate._debug(string, level); - } - }, - - /** - * Web functions exposed to sandbox - * @namespace - */ - "Web":{ - /** - * Lets user pick which items s/he wants to put in his/her library - * @param {Zotero.Translate} translate - * @param {Object} items An set of id => name pairs in object format - */ - "selectItems":function(translate, items, callback) { - function transferObject(obj) { - return obj; - } - - if(Zotero.Utilities.isEmpty(items)) { - throw new Error("Translator called select items with no items"); - } - - // Some translators pass an array rather than an object to Zotero.selectItems. - // This will break messaging outside of Firefox, so we need to fix it. - if(Object.prototype.toString.call(items) === "[object Array]") { - translate._debug("WARNING: Zotero.selectItems should be called with an object, not an array"); - var itemsObj = {}; - for(var i in items) itemsObj[i] = items[i]; - items = itemsObj; - } - - if(translate._selectedItems) { - // if we have a set of selected items for this translation, use them - return transferObject(translate._selectedItems); - } else if(translate._handlers.select) { - // whether the translator supports asynchronous selectItems - var haveAsyncCallback = !!callback; - // whether the handler operates asynchronously - var haveAsyncHandler = false; - var returnedItems = null; - - var callbackExecuted = false; - if(haveAsyncCallback) { - // if this translator provides an async callback for selectItems, rig things - // up to pop off the async process - var newCallback = function(selectedItems) { - callbackExecuted = true; - try { - callback(transferObject(selectedItems)); - } catch (e) { - translate.complete(false, e); - return false; - } - if(haveAsyncHandler) translate.decrementAsyncProcesses("Zotero.selectItems()"); - }; - } else { - // if this translator doesn't provide an async callback for selectItems, set things - // up so that we can wait to see if the select handler returns synchronously. If it - // doesn't, we will need to restart translation. - var newCallback = function(selectedItems) { - callbackExecuted = true; - if(haveAsyncHandler) { - translate.translate({ - libraryID: translate._libraryID, - saveAttachments: translate._saveAttachments, - selectedItems - }); - } else { - returnedItems = transferObject(selectedItems); - } - }; - } - - if(Zotero.isFx && !Zotero.isBookmarklet) { - items = Components.utils.cloneInto(items, {}); - } - - var returnValue = translate._runHandler("select", items, newCallback); - if(returnValue !== undefined) { - // handler may have returned a value, which makes callback unnecessary - Zotero.debug("WARNING: Returning items from a select handler is deprecated. "+ - "Please pass items as to the callback provided as the third argument to "+ - "the handler."); - - returnedItems = transferObject(returnValue); - haveAsyncHandler = false; - } else { - // if we don't have returnedItems set already, the handler is asynchronous - haveAsyncHandler = !callbackExecuted; - } - - if(haveAsyncCallback) { - if(haveAsyncHandler) { - // we are running asynchronously, so increment async processes - translate.incrementAsyncProcesses("Zotero.selectItems()"); - } else if(!callbackExecuted) { - // callback didn't get called from handler, so call it here - callback(returnedItems); - } - return false; - } else { - translate._debug("COMPAT WARNING: No callback was provided for "+ - "Zotero.selectItems(). When executed outside of Firefox, a selectItems() call "+ - "will require this translator to be called multiple times.", 1); - - if(haveAsyncHandler) { - // The select handler is asynchronous, but this translator doesn't support - // asynchronous select. We return false to abort translation in this - // instance, and we will restart it later when the selectItems call is - // complete. - translate._aborted = true; - return false; - } else { - return returnedItems; - } - } - } else { // no handler defined; assume they want all of them - if(callback) callback(items); - return items; - } - }, - - /** - * Overloads {@link Zotero.Translate.Sandbox.Base._itemDone} to ensure that no standalone - * items are saved, that an item type is specified, and to add a libraryCatalog and - * shortTitle if relevant. - * @param {Zotero.Translate} translate - * @param {SandboxItem} An item created using the Zotero.Item class from the sandbox - */ - "_itemDone":function(translate, item) { - // Only apply checks if there is no parent translator - if(!translate._parentTranslator) { - if(!item.itemType) { - item.itemType = "webpage"; - translate._debug("WARNING: No item type specified"); - } - - if(item.type == "attachment" || item.type == "note") { - Zotero.debug("Translate: Discarding standalone "+item.type+" in non-import translator", 2); - return; - } - - // store library catalog if this item was captured from a website, and - // libraryCatalog is truly undefined (not false or "") - if(item.repository !== undefined) { - Zotero.debug("Translate: 'repository' field is now 'libraryCatalog'; please fix your code", 2); - item.libraryCatalog = item.repository; - delete item.repository; - } - - // automatically set library catalog - if(item.libraryCatalog === undefined && item.itemType != "webpage") { - item.libraryCatalog = translate.translator[0].label; - } - - // Remove library catalog if not valid for type, so it doesn't get saved to Extra - if (item.libraryCatalog) { - let itemTypeID = Zotero.ItemTypes.getID(item.itemType); - let fieldID = Zotero.ItemFields.getID('libraryCatalog'); - if (!Zotero.ItemFields.isValidForType(fieldID, itemTypeID)) { - delete item.libraryCatalog; - } - } - - // automatically set access date if URL is set - if(item.url && typeof item.accessDate == 'undefined') { - item.accessDate = Zotero.Date.dateToISO(new Date()); - } - - //consider type-specific "title" alternatives - var altTitle = Zotero.ItemFields.getName(Zotero.ItemFields.getFieldIDFromTypeAndBase(item.itemType, 'title')); - if(altTitle && item[altTitle]) item.title = item[altTitle]; - - if(!item.title) { - translate.complete(false, new Error("No title specified for item")); - return; - } - - // create short title - if(item.shortTitle === undefined && Zotero.Utilities.fieldIsValidForType("shortTitle", item.itemType)) { - // only set if changes have been made - var setShortTitle = false; - var title = item.title; - - // shorten to before first colon - var index = title.indexOf(":"); - if(index !== -1) { - title = title.substr(0, index); - setShortTitle = true; - } - // shorten to after first question mark - index = title.indexOf("?"); - if(index !== -1) { - index++; - if(index != title.length) { - title = title.substr(0, index); - setShortTitle = true; - } - } - - if(setShortTitle) item.shortTitle = title; - } - - /* Clean up ISBNs - * Allow multiple ISBNs, but... - * (1) validate all ISBNs - * (2) convert all ISBNs to ISBN-13 - * (3) remove any duplicates - * (4) separate them with space - */ - if (item.ISBN) { - // Match ISBNs with groups separated by various dashes or even spaces - var isbnRe = /\b(?:97[89][\s\x2D\xAD\u2010-\u2015\u2043\u2212]*)?(?:\d[\s\x2D\xAD\u2010-\u2015\u2043\u2212]*){9}[\dx](?![\x2D\xAD\u2010-\u2015\u2043\u2212])\b/gi, - validISBNs = [], - isbn; - while (isbn = isbnRe.exec(item.ISBN)) { - var validISBN = Zotero.Utilities.cleanISBN(isbn[0]); - if (!validISBN) { - // Back up and move up one character - isbnRe.lastIndex = isbn.index + 1; - continue; - } - - var isbn13 = Zotero.Utilities.toISBN13(validISBN); - if (validISBNs.indexOf(isbn13) == -1) validISBNs.push(isbn13); - } - item.ISBN = validISBNs.join(' '); - } - - // refuse to save very long tags - if(item.tags) { - for(var i=0; i 255) { - translate._debug("WARNING: Skipping unsynchable tag "+JSON.stringify(tagString)); - item.tags.splice(i--, 1); - } - } - } - - for(var i=0; i node"); - } - }, - - /** - * Import functions exposed to sandbox - * @namespace - */ - "Import":{ - /** - * Saves a collection to the DB - * Called as {@link Zotero.Collection#complete} from the sandbox - * @param {Zotero.Translate} translate - * @param {SandboxCollection} collection - */ - "_collectionDone":function(translate, collection) { - translate.newCollections.push(collection); - if(translate._libraryID == false) { - translate._runHandler("collectionDone", collection); - } - }, - - /** - * Sets the value of the progress indicator associated with export as a percentage - * @param {Zotero.Translate} translate - * @param {Number} value - */ - "setProgress":function(translate, value) { - if(typeof value !== "number") { - translate._progress = null; - } else { - translate._progress = value; - } - } - }, - - /** - * Export functions exposed to sandbox - * @namespace - */ - "Export":{ - /** - * Retrieves the next item to be exported - * @param {Zotero.Translate} translate - * @return {SandboxItem} - */ - "nextItem":function(translate) { - var item = translate._itemGetter.nextItem(); - - if(translate._displayOptions.hasOwnProperty("exportTags") && !translate._displayOptions["exportTags"]) { - item.tags = []; - } - - translate._runHandler("itemDone", item); - - return item; - }, - - /** - * Retrieves the next collection to be exported - * @param {Zotero.Translate} translate - * @return {SandboxCollection} - */ - "nextCollection":function(translate) { - if(!translate._translatorInfo.configOptions || !translate._translatorInfo.configOptions.getCollections) { - throw(new Error("getCollections configure option not set; cannot retrieve collection")); - } - - return translate._itemGetter.nextCollection(); - }, - - /** - * @borrows Zotero.Translate.Sandbox.Import.setProgress as this.setProgress - */ - "setProgress":function(translate, value) { - Zotero.Translate.Sandbox.Import.setProgress(translate, value); - } - }, - - /** - * Search functions exposed to sandbox - * @namespace - */ - "Search":{ - /** - * @borrows Zotero.Translate.Sandbox.Web._itemDone as this._itemDone - */ - "_itemDone":function(translate, item) { - // Always set library catalog, even if we have a parent translator - if(item.libraryCatalog === undefined) { - item.libraryCatalog = translate.translator[0].label; - } - - Zotero.Translate.Sandbox.Web._itemDone(translate, item); - } - } -} - -/** - * @class Base class for all translation types - * - * @property {String} type The type of translator. This is deprecated; use instanceof instead. - * @property {Zotero.Translator[]} translator The translator currently in use. Usually, only the - * first entry of the Zotero.Translator array is populated; subsequent entries represent - * translators to be used if the first fails. - * @property {String} path The path or URI string of the target - * @property {String} newItems Items created when translate() was called - * @property {String} newCollections Collections created when translate() was called - * @property {Number} runningAsyncProcesses The number of async processes that are running. These - * need to terminate before Zotero.done() is called. - */ -Zotero.Translate.Base = function() {} -Zotero.Translate.Base.prototype = { - /** - * Initializes a Zotero.Translate instance - */ - "init":function() { - this._handlers = []; - this._currentState = null; - this._translatorInfo = null; - this._translatorProvider = Zotero.Translators; - this.document = null; - this.location = null; - }, - - /** - * Sets the location to operate upon - * - * @param {String|nsIFile} location The URL to which the sandbox should be bound or path to local file - */ - "setLocation":function(location) { - this.location = location; - if(typeof this.location == "object") { // if a file - this.path = location.path; - } else { // if a url - this.path = location; - } - }, - - /** - * Sets the translator to be used for import/export - * - * @param {Array{Zotero.Translator}|Zotero.Translator|string} Translator object or ID - */ - "setTranslator":function(translator) { - // Accept an array of translators - if (Array.isArray(translator)) { - this.translator = translator; - return true; - } - if(!translator) { - throw new Error("No translator specified"); - } - - this.translator = null; - - if(typeof(translator) == "object") { // passed an object and not an ID - if(translator.translatorID) { - this.translator = [translator]; - } else { - throw(new Error("No translatorID specified")); - } - } else { - this.translator = [translator]; - } - - return !!this.translator; - }, - - /** - * Registers a handler function to be called when translation is complete - * - * @param {String} type Type of handler to register. Legal values are: - * select - * valid: web - * called: when the user needs to select from a list of available items - * passed: an associative array in the form id => text - * returns: a numerically indexed array of ids, as extracted from the passed - * string - * itemDone - * valid: import, web, search - * called: when an item has been processed; may be called asynchronously - * passed: an item object (see Zotero.Item) - * returns: N/A - * collectionDone - * valid: import - * called: when a collection has been processed, after all items have been - * added; may be called asynchronously - * passed: a collection object (see Zotero.Collection) - * returns: N/A - * done - * valid: all - * called: when all processing is finished - * passed: true if successful, false if an error occurred - * returns: N/A - * debug - * valid: all - * called: when Zotero.debug() is called - * passed: string debug message - * returns: true if message should be logged to the console, false if not - * error - * valid: all - * called: when a fatal error occurs - * passed: error object (or string) - * returns: N/A - * translators - * valid: all - * called: when a translator search initiated with Zotero.Translate.getTranslators() is - * complete - * passed: an array of appropriate translators - * returns: N/A - * pageModified - * valid: web - * called: when a web page has been modified - * passed: the document object for the modified page - * returns: N/A - * @param {Function} handler Callback function. All handlers will be passed the current - * translate instance as the first argument. The second argument is dependent on the handler. - */ - "setHandler":function(type, handler) { - if(!this._handlers[type]) { - this._handlers[type] = new Array(); - } - this._handlers[type].push(handler); - }, - - /** - * Clears all handlers for a given function - * @param {String} type See {@link Zotero.Translate.Base#setHandler} for valid values - */ - "clearHandlers":function(type) { - this._handlers[type] = new Array(); - }, - - /** - * Clears a single handler for a given function - * @param {String} type See {@link Zotero.Translate.Base#setHandler} for valid values - * @param {Function} handler Callback function to remove - */ - "removeHandler":function(type, handler) { - var handlerIndex = this._handlers[type].indexOf(handler); - if(handlerIndex !== -1) this._handlers[type].splice(handlerIndex, 1); - }, - - /** - * Set custom translator provider, as returned by Zotero.Translators.makeTranslatorProvider() - * - * Used by Scaffold to substitute external translator files - * - * @param {Object} translatorProvider - */ - setTranslatorProvider: function (translatorProvider) { - this._translatorProvider = translatorProvider; - }, - - /** - * Indicates that a new async process is running - */ - "incrementAsyncProcesses":function(f) { - this._runningAsyncProcesses++; - if(this._parentTranslator) { - this._parentTranslator.incrementAsyncProcesses(f+" from child translator"); - } else { - //Zotero.debug("Translate: Incremented asynchronous processes to "+this._runningAsyncProcesses+" for "+f, 4); - //Zotero.debug((new Error()).stack); - } - }, - - /** - * Indicates that a new async process is finished - */ - "decrementAsyncProcesses":function(f, by) { - this._runningAsyncProcesses -= (by ? by : 1); - if(!this._parentTranslator) { - //Zotero.debug("Translate: Decremented asynchronous processes to "+this._runningAsyncProcesses+" for "+f, 4); - //Zotero.debug((new Error()).stack); - } - if(this._runningAsyncProcesses === 0) { - this.complete(); - } - if(this._parentTranslator) this._parentTranslator.decrementAsyncProcesses(f+" from child translator", by); - }, - - /** - * Clears all handlers for a given function - * @param {String} type See {@link Zotero.Translate.Base#setHandler} for valid values - * @param {Any} argument Argument to be passed to handler - */ - "_runHandler":function(type) { - var returnValue = undefined; - if(this._handlers[type]) { - // compile list of arguments - if(this._parentTranslator) { - // if there is a parent translator, make sure we don't pass the Zotero.Translate - // object, since it could open a security hole - var args = [null]; - } else { - var args = [this]; - } - for(var i=1; i false).then(function (rpcTranslators) { - this._waitingForRPC = false; - - // if there are translators, add them to the list of found translators - if (rpcTranslators) { - for(var i=0, n=rpcTranslators.length; i this._translateTranslatorLoaded()) - .catch(e => deferred.reject(e)); - }.bind(this)); - } - else { - this._loadTranslator(this.translator[0]) - .then(() => this._translateTranslatorLoaded()) - .catch(e => deferred.reject(e)); - } - - return deferred.promise; - }), - - /** - * Called when translator has been retrieved and loaded - */ - "_translateTranslatorLoaded": Zotero.Promise.method(function() { - // set display options to default if they don't exist - if(!this._displayOptions) this._displayOptions = this._translatorInfo.displayOptions || {}; - - var loadPromise = this._prepareTranslation(); - if (this.noWait) { - if (!loadPromise.isResolved()) { - throw new Error("Load promise is not resolved in noWait mode"); - } - rest.apply(this, arguments); - } else { - return loadPromise.then(() => rest.apply(this, arguments)) - } - - function rest() { - Zotero.debug("Translate: Beginning translation with " + this.translator[0].label); - - this.incrementAsyncProcesses("Zotero.Translate#translate()"); - - // translate - try { - let maybePromise = Function.prototype.apply.call( - this._sandboxManager.sandbox["do" + this._entryFunctionSuffix], - null, - this._getParameters() - ); - - if (maybePromise) { - maybePromise - .then(() => this.decrementAsyncProcesses("Zotero.Translate#translate()")) - .catch(e => this.complete(false, e)); - return; - } - } catch (e) { - this.complete(false, e); - return false; - } - - this.decrementAsyncProcesses("Zotero.Translate#translate()"); - } - }), - - /** - * Return the progress of the import operation, or null if progress cannot be determined - */ - "getProgress":function() { return null }, - - /** - * Translate a URL to a form that goes through the appropriate proxy, or - * convert a relative URL to an absolute one - * - * @param {String} url - * @param {Boolean} dontUseProxy If true, don't convert URLs to variants - * that use the proxy - * @type String - * @private - */ - "resolveURL":function(url, dontUseProxy) { - Zotero.debug("Translate: resolving URL " + url); - - const hostPortRe = /^([A-Z][-A-Z0-9+.]*):\/\/[^\/]+/i; - const allowedSchemes = ['http', 'https', 'ftp']; - - var m = url.match(hostPortRe), - resolved; - if (!m) { - if (this.location) { - if (Zotero.isFx) { - resolved = Services.io.newURI(this.location, "", null).resolve(url); - } - else { - resolved = new URL(url, this.location).toString(); - } - } - else if (url.startsWith('//')) { - // Use HTTPS by default for protocol-relative URL with no associated web page - resolved = 'https:' + url; - } - else { - throw new Error('Cannot resolve relative URL without an associated web page: ' + url); - } - } else if (allowedSchemes.indexOf(m[1].toLowerCase()) == -1) { - Zotero.debug("Translate: unsupported scheme " + m[1]); - return url; - } else { - resolved = url; - } - - Zotero.debug("Translate: resolved to " + resolved); - - // convert proxy to proper if applicable - if(!dontUseProxy && this.translator && this.translator[0] - && this._proxy) { - var proxiedURL = this._proxy.toProxy(resolved); - if (proxiedURL != resolved) { - Zotero.debug("Translate: proxified to " + proxiedURL); - } - resolved = proxiedURL; - } - - /*var m = hostPortRe.exec(resolved); - if(!m) { - throw new Error("Invalid URL supplied for HTTP request: "+url); - } else if(this._translate.document && this._translate.document.location) { - var loc = this._translate.document.location; - if(this._translate._currentState !== "translate" && loc - && (m[1].toLowerCase() !== loc.protocol.toLowerCase() - || m[2].toLowerCase() !== loc.host.toLowerCase())) { - throw new Error("Attempt to access "+m[1]+"//"+m[2]+" from "+loc.protocol+"//"+loc.host - +" blocked: Cross-site requests are only allowed during translation"); - } - }*/ - - return resolved; - }, - - /** - * Executed on translator completion, either automatically from a synchronous scraper or as - * done() from an asynchronous scraper. Finishes things up and calls callback function(s). - * @param {Boolean|String} returnValue An item type or a boolean true or false - * @param {String|Exception} [error] An error that occurred during translation. - * @return {String|NULL} The exception serialized to a string, or null if translation - * completed successfully. - */ - "complete":function(returnValue, error) { - // allow translation to be aborted for re-running after selecting items - if(this._aborted) return; - - // Make sure this isn't called twice - if(this._currentState === null) { - if(!returnValue) { - Zotero.debug("Translate: WARNING: Zotero.done() called after translator completion with error"); - Zotero.debug(error); - } else { - var e = new Error(); - Zotero.debug("Translate: WARNING: Zotero.done() called after translation completion. This should never happen. Please examine the stack below."); - Zotero.debug(e.stack); - } - return; - } - - // reset async processes and propagate them to parent - if(this._parentTranslator && this._runningAsyncProcesses) { - this._parentTranslator.decrementAsyncProcesses("Zotero.Translate#complete", this._runningAsyncProcesses); - } - this._runningAsyncProcesses = 0; - - if(!returnValue && this._returnValue) returnValue = this._returnValue; - - var errorString = null; - if(!returnValue && error) errorString = this._generateErrorString(error); - if(this._currentState === "detect") { - if(this._potentialTranslators.length) { - var lastTranslator = this._potentialTranslators.shift(); - var lastProxy = this._proxies ? this._proxies.shift() : null; - - if (returnValue) { - var dupeTranslator = {proxy: lastProxy ? new Zotero.Proxy(lastProxy) : null}; - - for (var i in lastTranslator) dupeTranslator[i] = lastTranslator[i]; - if (Zotero.isBookmarklet && returnValue === "server") { - // In the bookmarklet, the return value from detectWeb can be "server" to - // indicate the translator should be run on the Zotero server - dupeTranslator.runMode = Zotero.Translator.RUN_MODE_ZOTERO_SERVER; - } else { - // Usually the return value from detectWeb will be either an item type or - // the string "multiple" - dupeTranslator.itemType = returnValue; - } - - this._foundTranslators.push(dupeTranslator); - } else if(error) { - this._debug("Detect using "+lastTranslator.label+" failed: \n"+errorString, 2); - } - } - - if(this._potentialTranslators.length && (this._getAllTranslators || !returnValue)) { - // more translators to try; proceed to next translator - this._detect(); - } else { - this._currentState = null; - if(!this._waitingForRPC) this._detectTranslatorsCollected(); - } - } else { - // unset return value is equivalent to true - if(returnValue === undefined) returnValue = true; - - if(returnValue) { - if(this.saveQueue.length) { - this._waitingForSave = true; - this._saveItems(this.saveQueue) - .catch(e => this._runHandler("error", e)) - .then(() => this.saveQueue = []); - return; - } - this._debug("Translation successful"); - } else { - if(error) { - // report error to console - Zotero.logError(error); - - // report error to debug log - this._debug("Translation using "+(this.translator && this.translator[0] && this.translator[0].label ? this.translator[0].label : "no translator")+" failed: \n"+errorString, 2); - } - - this._runHandler("error", error); - } - - this._currentState = null; - - // call handlers - this._runHandler("itemsDone", returnValue); - if(returnValue) { - this._checkIfDone(); - } else { - this._runHandler("done", returnValue); - } - } - - return errorString; - }, - - _cleanTitle: function (title, itemType) { - if (itemType == 'book' || itemType == 'bookSection') { - return title.replace(/\s*:\s*a novel\s*$/i, ''); - } - return title; - }, - - /** - * Canonicalize an array of tags such that they are all objects with the tag stored in the - * "tag" property and a type (if specified) is stored in the "type" property - * @returns {Object[]} Array of new tag objects - */ - "_cleanTags":function(tags) { - var newTags = []; - if(!tags) return newTags; - for(var i=0; i x.id == attachment.id); - } - else { - var attachmentIndex = this._savingAttachments.indexOf(attachment); - } - if(progress === false || progress === 100) { - if(attachmentIndex !== -1) { - this._savingAttachments.splice(attachmentIndex, 1); - } - } else if(attachmentIndex === -1) { - this._savingAttachments.push(attachment); - } - - if(itemDoneEventsDispatched) { - // itemDone event has already fired, so we can fire attachmentProgress - // notifications - this._runHandler("attachmentProgress", attachment, progress, error); - this._checkIfDone(); - } else { - // Defer until after we fire the itemDone event - deferredProgress.push([attachment, progress, error]); - attachmentsWithProgress.push(attachment); - } - } - - return this._itemSaver.saveItems(items.slice(), attachmentCallback.bind(this), - function(newItems) { - this._runHandler("itemsDone", newItems); - // Remove attachments not being saved from item.attachments - for(var i=0; i newItems); - }.bind(this)) - .then(function (newItems) { - // Specify that itemDone event was dispatched, so that we don't defer - // attachmentProgress notifications anymore - itemDoneEventsDispatched = true; - - // Run deferred attachmentProgress notifications - for(var i=0; i { - this._savingItems -= items.length; - this.complete(false, e); - throw e; - }); - }), - - /** - * Checks if saving done, and if so, fires done event - */ - "_checkIfDone":function() { - if(!this._savingItems && !this._savingAttachments.length && (!this._currentState || this._waitingForSave)) { - if (this.newCollections - && this._libraryID !== false - && this._itemSaver.saveCollections) { - var me = this; - this._itemSaver.saveCollections(this.newCollections) - .then(function (newCollections) { - me.newCollections = newCollections; - me._runHandler("done", true); - }) - .catch(function (err) { - me._runHandler("error", err); - me._runHandler("done", false); - }); - } else { - this._runHandler("done", true); - } - } - }, - - /** - * Begins running detect code for a translator, first loading it - */ - "_detect":function() { - // there won't be any translators if we need an RPC call - if(!this._potentialTranslators.length) { - this.complete(true); - return; - } - - let lab = this._potentialTranslators[0].label; - this._loadTranslator(this._potentialTranslators[0]) - .then(function() { - return this._detectTranslatorLoaded(); - }.bind(this)) - .catch(function (e) { - this.complete(false, e); - }.bind(this)); - }, - - /** - * Runs detect code for a translator - */ - _detectTranslatorLoaded: async function () { - this._prepareDetection(); - - this.incrementAsyncProcesses("Zotero.Translate#getTranslators"); - - var maybePromise = Function.prototype.apply.call( - this._sandboxManager.sandbox["detect" + this._entryFunctionSuffix], - null, - this._getParameters() - ); - // If detect* returns a promise, wait for it - var returnValue = (maybePromise && maybePromise.then) ? await maybePromise : maybePromise; - - if (returnValue !== undefined) this._returnValue = returnValue; - this.decrementAsyncProcesses("Zotero.Translate#getTranslators"); - }, - - /** - * Called when all translators have been collected for detection - */ - "_detectTranslatorsCollected":function() { - Zotero.debug("Translate: All translator detect calls and RPC calls complete:"); - this._foundTranslators.sort(function(a, b) { - // If priority is equal, prioritize translators that run in browser over the client - if (a.priority == b.priority) { - return a.runMode - b.runMode; - } - return a.priority-b.priority; - }); - if (this._foundTranslators.length) { - this._foundTranslators.forEach(function(t) { - Zotero.debug("\t" + t.label + ": " + t.priority); - }); - } else { - Zotero.debug("\tNo suitable translators found"); - } - this._runHandler("translators", this._foundTranslators); - }, - - /** - * Loads the translator into its sandbox - * @param {Zotero.Translator} translator - * @return {Promise} - */ - _loadTranslator: Zotero.Promise.method(function (translator) { - var sandboxLocation = this._getSandboxLocation(); - if(!this._sandboxLocation || sandboxLocation !== this._sandboxLocation) { - this._sandboxLocation = sandboxLocation; - this._generateSandbox(); - } - - this._currentTranslator = translator; - - if (this.type == 'web') { - // Pass on the proxy of the parent translate - if (this._parentTranslator) { - this._proxy = this._parentTranslator._proxy; - } else { - this._proxy = translator.proxy; - } - } else { - // Use proxy only for web translators - this._proxy = null; - } - this._runningAsyncProcesses = 0; - this._returnValue = undefined; - this._aborted = false; - this.saveQueue = []; - - // CHANGED: Make parsing of translator wait for injected code - var parse = async function(code) { - Zotero.debug("Translate: Parsing code for " + translator.label + " " - + "(" + translator.translatorID + ", " + translator.lastUpdated + ")", 4); - try { - // CHANGED: Exports do not have a detectExport function, so don't try to export this - if (this._entryFunctionSuffix !== "Export") { - // CHANGED: Make parsing of translator wait for injected code - await this._sandboxManager.eval( - "var exports = {}, ZOTERO_TRANSLATOR_INFO = " + code, - [ - "detect" + this._entryFunctionSuffix, - "do" + this._entryFunctionSuffix, - "exports", - "ZOTERO_TRANSLATOR_INFO" - ], - (translator.file ? translator.file.path : translator.label) - ); - } else { - // CHANGED: Exports do not have a detectExport function, so don't try to export this - await this._sandboxManager.eval( - "var exports = {}, ZOTERO_TRANSLATOR_INFO = " + code, [ - "do" + this._entryFunctionSuffix, - "exports", - "ZOTERO_TRANSLATOR_INFO" - ], - (translator.file ? translator.file.path : translator.label) - ); - } - } - catch (e) { - Zotero.logError(e); - } - this._translatorInfo = this._sandboxManager.sandbox.ZOTERO_TRANSLATOR_INFO; - }.bind(this); - - if (this.noWait) { - let codePromise = Zotero.Translators.getCodeForTranslator(translator); - if (!codePromise.isResolved()) { - throw new Error("Code promise is not resolved in noWait mode"); - } - parse(codePromise.value()); - } - else { - return Zotero.Translators.getCodeForTranslator(translator).then(parse); - } - }), - - /** - * Generates a sandbox for scraping/scraper detection - */ - "_generateSandbox":function() { - Zotero.debug("Translate: Binding sandbox to "+(typeof this._sandboxLocation == "object" ? this._sandboxLocation.document.location : this._sandboxLocation), 4); - this._sandboxManager = new Zotero.Translate.SandboxManager(this._sandboxLocation); - const createArrays = "['creators', 'notes', 'tags', 'seeAlso', 'attachments']"; - var src = ""; - src += "Zotero.Item = function (itemType) {"+ - "var createArrays = "+createArrays+";"+ - "this.itemType = itemType;"+ - "for(var i=0, n=createArrays.length; i ${this.path}`; - } - if (Zotero.Prefs.get("downloadAssociatedFiles")) { - errorString += "\ndownloadAssociatedFiles => true"; - } - if (Zotero.Prefs.get("automaticSnapshots")) { - errorString += "\nautomaticSnapshots => true"; - } - return errorString; - }, - - /** - * Determines the location where the sandbox should be bound - * @return {String|document} The location to which to bind the sandbox - */ - "_getSandboxLocation":function() { - return (this._parentTranslator ? this._parentTranslator._sandboxLocation : "http://www.example.com/"); - }, - - /** - * Gets parameters to be passed to detect* and do* functions - * @return {Array} A list of parameters - */ - "_getParameters":function() { return []; }, - - /** - * No-op for preparing detection - */ - "_prepareDetection":function() {}, - - /** - * No-op for preparing translation - */ - "_prepareTranslation": function () { return Zotero.Promise.resolve(); } -} - -/** - * @class Web translation - * - * @property {Document} document The document object to be used for web scraping (set with setDocument) - * @property {Zotero.CookieSandbox} cookieSandbox A CookieSandbox to manage cookies for - * this Translate instance. - */ -Zotero.Translate.Web = function() { - this._registeredDOMObservers = {} - this.init(); -} -Zotero.Translate.Web.prototype = new Zotero.Translate.Base(); -Zotero.Translate.Web.prototype.type = "web"; -Zotero.Translate.Web.prototype._entryFunctionSuffix = "Web"; -Zotero.Translate.Web.prototype.Sandbox = Zotero.Translate.Sandbox._inheritFromBase(Zotero.Translate.Sandbox.Web); - -/** - * Sets the browser to be used for web translation - * @param {Document} doc An HTML document - */ -Zotero.Translate.Web.prototype.setDocument = function(doc) { - this.document = doc; - try { - this.rootDocument = doc.defaultView.top.document; - } catch (e) { - // Cross-origin frames won't be able to access top.document and will throw an error - } - if (!this.rootDocument) { - this.rootDocument = doc; - } - this.setLocation(doc.location.href, this.rootDocument.location.href); -} - -/** - * Sets a Zotero.CookieSandbox to handle cookie management for XHRs initiated from this - * translate instance - * - * @param {Zotero.CookieSandbox} cookieSandbox - */ -Zotero.Translate.Web.prototype.setCookieSandbox = function(cookieSandbox) { - this.cookieSandbox = cookieSandbox; -} - -/** - * Sets headers to include in HTTP requests. Used by translation-server. - */ -Zotero.Translate.Web.prototype.setRequestHeaders = function (headers) { - this.requestHeaders = headers; -}; - -/** - * Sets the location to operate upon - * - * @param {String} location The URL of the page to translate - * @param {String} rootLocation The URL of the root page, within which `location` is embedded - */ -Zotero.Translate.Web.prototype.setLocation = function(location, rootLocation) { - this.location = location; - this.rootLocation = rootLocation || location; - this.path = this.location; -} - -/** - * Get potential web translators - */ -Zotero.Translate.Web.prototype._getTranslatorsGetPotentialTranslators = function() { - return this._translatorProvider.getWebTranslatorsForLocation(this.location, this.rootLocation); -} - -/** - * Bind sandbox to document being translated - */ -Zotero.Translate.Web.prototype._getSandboxLocation = function() { - if(this._parentTranslator) { - return this._parentTranslator._sandboxLocation; - } else if(this.document.defaultView - && (this.document.defaultView.toString().indexOf("Window") !== -1 - || this.document.defaultView.toString().indexOf("XrayWrapper") !== -1)) { - return this.document.defaultView; - } else { - return this.document.location.toString(); - } -} - -/** - * Pass document and location to detect* and do* functions - */ -Zotero.Translate.Web.prototype._getParameters = function() { - return [this.document, this.location]; -}; - -/** - * Prepare translation - */ -Zotero.Translate.Web.prototype._prepareTranslation = Zotero.Promise.method(function () { - this._itemSaver = new Zotero.Translate.ItemSaver({ - libraryID: this._libraryID, - collections: this._collections, - attachmentMode: Zotero.Translate.ItemSaver[(this._saveAttachments ? "ATTACHMENT_MODE_DOWNLOAD" : "ATTACHMENT_MODE_IGNORE")], - forceTagType: 1, - sessionID: this._sessionID, - cookieSandbox: this._cookieSandbox, - proxy: this._proxy, - baseURI: this.location - }); - this.newItems = []; -}); - -/** - * Overload translate to set selectedItems - */ -Zotero.Translate.Web.prototype.translate = function (options = {}, ...args) { - if (typeof options == 'number' || options === false) { - Zotero.debug("Translate: translate() now takes an object -- update your code", 2); - options = { - libraryID: options, - saveAttachments: args[0], - selectedItems: args[1] - }; - } - this._selectedItems = options.selectedItems; - return Zotero.Translate.Base.prototype.translate.call(this, options); -} - -/** - * Overload _translateTranslatorLoaded to send an RPC call if necessary - */ -Zotero.Translate.Web.prototype._translateTranslatorLoaded = async function() { - var runMode = this.translator[0].runMode; - if(runMode === Zotero.Translator.RUN_MODE_IN_BROWSER || this._parentTranslator) { - Zotero.Translate.Base.prototype._translateTranslatorLoaded.apply(this); - } else if(runMode === Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE || - (runMode === Zotero.Translator.RUN_MODE_ZOTERO_SERVER && await Zotero.Connector.checkIsOnline())) { - var me = this; - let html = this.document.documentElement.innerHTML; - html = html.replace(new RegExp(Zotero.Utilities.quotemeta(ZOTERO_CONFIG.BOOKMARKLET_URL), 'g'), "about:blank") - // Higher timeout since translation might take a while if additional HTTP requests are made - Zotero.Connector.callMethod({method: "savePage", timeout: 60*1000}, { - sessionID: this._sessionID, - uri: this.location.toString(), - translatorID: (typeof this.translator[0] === "object" - ? this.translator[0].translatorID : this.translator[0]), - cookie: this.document.cookie, - proxy: this._proxy ? this._proxy.toJSON() : null, - html - }).then(me._translateRPCComplete.bind(me), me._translateRPCComplete.bind(me, null)); - } else if(runMode === Zotero.Translator.RUN_MODE_ZOTERO_SERVER) { - var me = this; - Zotero.API.createItem({"url":this.document.location.href.toString()}).then(function(response) { - me._translateServerComplete(201, response); - }, function(error) { - me._translateServerComplete(error.status, error.responseText); - }); - } -} - -/** - * Called when an call to Zotero Standalone for translation completes - */ -Zotero.Translate.Web.prototype._translateRPCComplete = async function(obj, failureCode) { - if(!obj) return this.complete(false, failureCode); - - if(obj.selectItems) { - // if we have to select items, call the selectItems handler and do it - var me = this; - this._runHandler("select", obj.selectItems, - function(selectedItems) { - Zotero.Connector.callMethod("selectItems", - {"instanceID":obj.instanceID, "selectedItems":selectedItems}) - .then((obj) => me._translateRPCComplete(obj)) - } - ); - } else { - // if we don't have to select items, continue - for(var i=0, n=obj.items.length; i rest.apply(this, arguments)) - } - - function rest() { - // export file data, if requested - if (this._displayOptions.exportFileData) { - this.location = this._itemGetter.exportFiles( - this.location, - this.translator[0].target, - { - includeAnnotations: this._displayOptions.includeAnnotations - } - ); - } - - // initialize IO - // this is currently hackish since we pass null callbacks to the init function (they have - // callbacks to be consistent with import, but they are synchronous, so we ignore them) - if(!this.location) { - this._io = new Zotero.Translate.IO.String(null, this.path ? this.path : "", this._sandboxManager); - this._io.init(configOptions["dataMode"], function() {}); - } else if(!Zotero.Translate.IO.Write) { - throw new Error("Writing to files is not supported in this build of Zotero."); - } else { - this._io = new Zotero.Translate.IO.Write(this.location); - this._io.init(configOptions["dataMode"], - this._displayOptions["exportCharset"] ? this._displayOptions["exportCharset"] : null, - function() {}); - - // For the Note Markdown translator, replace the zotero:// URI scheme in the output if - // not the official Zotero app - if (this.translator.translatorID == '1412e9e2-51e1-42ec-aa35-e036a895534b' - && ZOTERO_CONFIG.ID != 'zotero') { - this._io.setDataProcessor((data) => { - return data.replace(/zotero:\/\//g, ZOTERO_CONFIG.ID + '://'); - }); - } - } - - this._sandboxManager.importObject(this._io); - } -}); - -/** - * Overload Zotero.Translate.Base#translate to make sure that - * Zotero.Translate.Export#translate is not called without setting a - * translator first. Doesn't make sense to run detection for export. - */ -Zotero.Translate.Export.prototype.translate = function() { - if(!this.translator || !this.translator.length) { - this.complete(false, new Error("Export translation initiated without setting a translator")); - } else { - return Zotero.Translate.Base.prototype.translate.apply(this, arguments); - } -}; - -/** - * Return the progress of the import operation, or null if progress cannot be determined - */ -Zotero.Translate.Export.prototype.getProgress = function() { - if(this._progress !== undefined) return this._progress; - if(!this._itemGetter) { - return null; - } - return (1-this._itemGetter.numItemsRemaining/this._itemGetter.numItems)*100; -}; - -/** - * @class Search translation - * @property {Array[]} search Item (in {@link Zotero.Item#serialize} format) to extrapolate data - * (set with setSearch) - */ -Zotero.Translate.Search = function() { - this.init(); -}; -Zotero.Translate.Search.prototype = new Zotero.Translate.Base(); -Zotero.Translate.Search.prototype.type = "search"; -Zotero.Translate.Search.prototype._entryFunctionSuffix = "Search"; -Zotero.Translate.Search.prototype.Sandbox = Zotero.Translate.Sandbox._inheritFromBase(Zotero.Translate.Sandbox.Search); -Zotero.Translate.Search.prototype.ERROR_NO_RESULTS = "No items returned from any translator"; - -/** - * @borrows Zotero.Translate.Web#setCookieSandbox - */ -Zotero.Translate.Search.prototype.setCookieSandbox = Zotero.Translate.Web.prototype.setCookieSandbox; - -/** - * Sets the item to be used for searching - * @param {Object} item An item, with as many fields as desired, in the format returned by - * {@link Zotero.Item#serialize} - */ -Zotero.Translate.Search.prototype.setSearch = function(search) { - this.search = search; -} - -/** - * Set an identifier to use for searching - * - * @param {Object} identifier - An object with 'DOI', 'ISBN', or 'PMID' - */ -Zotero.Translate.Search.prototype.setIdentifier = function (identifier) { - var search; - if (identifier.DOI) { - search = { - itemType: "journalArticle", - DOI: identifier.DOI - }; - } - else if (identifier.ISBN) { - search = { - itemType: "book", - ISBN: identifier.ISBN - }; - } - else if (identifier.PMID) { - search = { - itemType: "journalArticle", - contextObject: "rft_id=info:pmid/" + identifier.PMID - }; - } - else if (identifier.arXiv) { - search = { - itemType: "journalArticle", - arXiv: identifier.arXiv - }; - } - else if (identifier.adsBibcode) { - search = { - itemType: "journalArticle", - adsBibcode: identifier.adsBibcode - }; - } - else { - throw new Error("Unrecognized identifier"); - } - this.setSearch(search); -} - -/** - * Overloads {@link Zotero.Translate.Base#getTranslators} to always return all potential translators - */ -Zotero.Translate.Search.prototype.getTranslators = function() { - return Zotero.Translate.Base.prototype.getTranslators.call(this, true); -} - -/** - * Overload Zotero.Translate.Base#complete to move onto the next translator if - * translation fails - */ -Zotero.Translate.Search.prototype.complete = function(returnValue, error) { - if(this._currentState == "translate" - && (!this.newItems || !this.newItems.length) - && !this._savingItems - //length is 0 only when translate was called without translators - && this.translator.length) { - Zotero.debug("Translate: Could not find a result using " + this.translator[0].label - + (this.translator.length > 1 ? " -- trying next translator" : ""), 3); - if(error) Zotero.debug(this._generateErrorString(error), 3); - if(this.translator.length > 1) { - this.translator.shift(); - this.translate({ - libraryID: this._libraryID, - saveAttachments: this._saveAttachments, - collections: this._collections - }); - return; - } else { - Zotero.debug("No more translators to try"); - error = this.ERROR_NO_RESULTS; - returnValue = false; - } - } - - // call super - Zotero.Translate.Base.prototype.complete.apply(this, [returnValue, error]); -} - -/** - * Pass search item to detect* and do* functions - */ -Zotero.Translate.Search.prototype._getParameters = function() { - return [this.search]; -}; - -/** - * Extract sandbox location from translator target - */ -Zotero.Translate.Search.prototype._getSandboxLocation = function() { - // generate sandbox for search by extracting domain from translator target - if(this.translator && this.translator[0] && this.translator[0].target) { - // so that web translators work too - const searchSandboxRe = /^http:\/\/[\w.]+\//; - var tempURL = this.translator[0].target.replace(/\\/g, "").replace(/\^/g, ""); - var m = searchSandboxRe.exec(tempURL); - if(m) return m[0]; - } - return Zotero.Translate.Base.prototype._getSandboxLocation.call(this); -} - -Zotero.Translate.Search.prototype._prepareTranslation = Zotero.Translate.Web.prototype._prepareTranslation; - -/** - * IO-related functions - * @namespace - */ -Zotero.Translate.IO = { - /** - * Parses XML using DOMParser - */ - "parseDOMXML":function(input, charset, size) { - try { - var dp = new DOMParser(); - } catch(e) { - try { - var dp = Components.classes["@mozilla.org/xmlextras/domparser;1"] - .createInstance(Components.interfaces.nsIDOMParser); - } catch(e) { - throw new Error("DOMParser not supported"); - } - } - - if(typeof input == "string") { - var nodes = dp.parseFromString(input, "text/xml"); - } else { - var nodes = dp.parseFromStream(input, charset, size, "text/xml"); - } - - if(nodes.getElementsByTagName("parsererror").length) { - throw new Error("DOMParser error: loading data into data store failed"); - } - - if("normalize" in nodes) nodes.normalize(); - - return nodes; - }, - - /** - * Names of RDF data modes - */ - "rdfDataModes":["rdf", "rdf/xml", "rdf/n3"] -}; - -/******* String support *******/ - -/** - * @class Translate backend for translating from a string - */ -Zotero.Translate.IO.String = function(string, uri, sandboxManager) { - if(string && typeof string === "string") { - this.string = string; - } else { - this.string = ""; - } - this.contentLength = this.string.length; - this.bytesRead = 0; - this._uri = uri; - this._sandboxManager = sandboxManager; -} - -Zotero.Translate.IO.String.prototype = { - "__exposedProps__":{ - "RDF":"r", - "read":"r", - "write":"r", - "setCharacterSet":"r", - "getXML":"r" - }, - - "_initRDF": function () { - Zotero.debug("Translate: Initializing RDF data store"); - this._dataStore = new Zotero.RDF.AJAW.IndexedFormula(); - this.RDF = new Zotero.Translate.IO._RDFSandbox(this._dataStore); - - if(this.contentLength) { - try { - var xml = Zotero.Translate.IO.parseDOMXML(this.string); - } catch(e) { - this._xmlInvalid = true; - throw e; - } - var parser = new Zotero.RDF.AJAW.RDFParser(this._dataStore); - parser.parse(xml, this._uri); - } - }, - - "setCharacterSet":function(charset) {}, - - "read":function(bytes) { - // if we are reading in RDF data mode and no string is set, serialize current RDF to the - // string - if(Zotero.Translate.IO.rdfDataModes.indexOf(this._mode) !== -1 && this.string === "") { - this.string = this.RDF.serialize(); - } - - // return false if string has been read - if(this.bytesRead >= this.contentLength) { - return false; - } - - if(bytes !== undefined) { - if(this.bytesRead >= this.contentLength) return false; - var oldPointer = this.bytesRead; - this.bytesRead += bytes; - return this.string.substr(oldPointer, bytes); - } else { - // bytes not specified; read a line - var oldPointer = this.bytesRead; - var lfIndex = this.string.indexOf("\n", this.bytesRead); - - if(lfIndex !== -1) { - // in case we have a CRLF - this.bytesRead = lfIndex+1; - if(this.contentLength > lfIndex && this.string.substr(lfIndex-1, 1) === "\r") { - lfIndex--; - } - return this.string.substr(oldPointer, lfIndex-oldPointer); - } - - if(!this._noCR) { - var crIndex = this.string.indexOf("\r", this.bytesRead); - if(crIndex === -1) { - this._noCR = true; - } else { - this.bytesRead = crIndex+1; - return this.string.substr(oldPointer, crIndex-oldPointer-1); - } - } - - this.bytesRead = this.contentLength; - return this.string.substr(oldPointer); - } - }, - - "write":function(data) { - this.string += data; - this.contentLength = this.string.length; - }, - - "getXML":function() { - try { - var xml = Zotero.Translate.IO.parseDOMXML(this.string); - } catch(e) { - this._xmlInvalid = true; - throw e; - } - return xml; - }, - - init: function (newMode) { - this.bytesRead = 0; - this._noCR = undefined; - - this._mode = newMode; - if(newMode === "xml/e4x") { - throw new Error("E4X is not supported"); - } else if(newMode && (Zotero.Translate.IO.rdfDataModes.indexOf(newMode) !== -1 - || newMode.substr(0, 3) === "xml/dom") && this._xmlInvalid) { - throw new Error("XML known invalid"); - } else if(Zotero.Translate.IO.rdfDataModes.indexOf(this._mode) !== -1) { - this._initRDF(); - } - }, - - "close":function(serialize) { - // if we are writing in RDF data mode and no string is set, serialize current RDF to the - // string - if(serialize && Zotero.Translate.IO.rdfDataModes.indexOf(this._mode) !== -1 && this.string === "") { - this.string = this.RDF.serialize(); - } - } -} - -/****** RDF DATA MODE ******/ - -/** - * @class An API for handling RDF from the sandbox. This is exposed to translators as Zotero.RDF. - * - * @property {Zotero.RDF.AJAW.IndexedFormula} _dataStore - * @property {Integer[]} _containerCounts - * @param {Zotero.RDF.AJAW.IndexedFormula} dataStore - */ -Zotero.Translate.IO._RDFSandbox = function(dataStore) { - this._dataStore = dataStore; -} - -Zotero.Translate.IO._RDFSandbox.prototype = { - "_containerCounts":[], - "__exposedProps__":{ - "addStatement":"r", - "newResource":"r", - "newContainer":"r", - "addContainerElement":"r", - "getContainerElements":"r", - "addNamespace":"r", - "getAllResources":"r", - "getResourceURI":"r", - "getArcsIn":"r", - "getArcsOut":"r", - "getSources":"r", - "getTargets":"r", - "getStatementsMatching":"r", - "serialize":"r" - }, - - /** - * Gets a resource as a Zotero.RDF.AJAW.Symbol, rather than a string - * @param {String|Zotero.RDF.AJAW.Symbol} about - * @return {Zotero.RDF.AJAW.Symbol} - */ - "_getResource":function(about) { - return (typeof about == "object" ? about : new Zotero.RDF.AJAW.Symbol(about)); - }, - - /** - * Runs a callback to initialize this RDF store - */ - "_init":function() { - if(this._prepFunction) { - this._dataStore = this._prepFunction(); - delete this._prepFunction; - } - }, - - /** - * Serializes the current RDF to a string - */ - "serialize":function(dataMode) { - var serializer = Zotero.RDF.AJAW.Serializer(this._dataStore); - - for(var prefix in this._dataStore.namespaces) { - serializer.suggestPrefix(prefix, this._dataStore.namespaces[prefix]); - } - - // serialize in appropriate format - if(dataMode == "rdf/n3") { - return serializer.statementsToN3(this._dataStore.statements); - } - - return serializer.statementsToXML(this._dataStore.statements); - }, - - /** - * Adds an RDF triple - * @param {String|Zotero.RDF.AJAW.Symbol} about - * @param {String|Zotero.RDF.AJAW.Symbol} relation - * @param {String|Zotero.RDF.AJAW.Symbol} value - * @param {Boolean} literal Whether value should be treated as a literal (true) or a resource - * (false) - */ - "addStatement":function(about, relation, value, literal) { - if(about === null || about === undefined) { - throw new Error("about must be defined in Zotero.RDF.addStatement"); - } - if(relation === null || relation === undefined) { - throw new Error("relation must be defined in Zotero.RDF.addStatement"); - } - if(value === null || value === undefined) { - throw new Error("value must be defined in Zotero.RDF.addStatement"); - } - - if(literal) { - // zap chars that Mozilla will mangle - value = value.toString().replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]/g, ''); - } else { - value = this._getResource(value); - } - - this._dataStore.add(this._getResource(about), this._getResource(relation), value); - }, - - /** - * Creates a new anonymous resource - * @return {Zotero.RDF.AJAW.Symbol} - */ - "newResource":function() { - return new Zotero.RDF.AJAW.BlankNode(); - }, - - /** - * Creates a new container resource - * @param {String} type The type of the container ("bag", "seq", or "alt") - * @param {String|Zotero.RDF.AJAW.Symbol} about The URI of the resource - * @return {Zotero.Translate.RDF.prototype.newContainer - */ - "newContainer":function(type, about) { - const rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; - const containerTypes = {"bag":"Bag", "seq":"Seq", "alt":"Alt"}; - - type = type.toLowerCase(); - if(!containerTypes[type]) { - throw new Error("Invalid container type in Zotero.RDF.newContainer"); - } - - var about = this._getResource(about); - this.addStatement(about, rdf+"type", rdf+containerTypes[type], false); - this._containerCounts[about.toNT()] = 1; - - return about; - }, - - /** - * Adds a new element to a container - * @param {String|Zotero.RDF.AJAW.Symbol} about The container - * @param {String|Zotero.RDF.AJAW.Symbol} element The element to add to the container - * @param {Boolean} literal Whether element should be treated as a literal (true) or a resource - * (false) - */ - "addContainerElement":function(about, element, literal) { - const rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; - - var about = this._getResource(about); - this._dataStore.add(about, new Zotero.RDF.AJAW.Symbol(rdf+"_"+(this._containerCounts[about.toNT()]++)), element, literal); - }, - - /** - * Gets all elements within a container - * @param {String|Zotero.RDF.AJAW.Symbol} about The container - * @return {Zotero.RDF.AJAW.Symbol[]} - */ - "getContainerElements":function(about) { - const liPrefix = "http://www.w3.org/1999/02/22-rdf-syntax-ns#_"; - - var about = this._getResource(about); - var statements = this._dataStore.statementsMatching(about); - var containerElements = []; - - // loop over arcs out looking for list items - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -/** - * A class which will be passed the results of translation as Zotero items and collections. - * - * This is a virtual class for reference implementation purposes - * A consumer of the translation code should implement these functions - */ -Zotero.Translate.ItemSaver = function(libraryID, attachmentMode, forceTagType) {}; -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_IGNORE = 0; -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_DOWNLOAD = 1; -Zotero.Translate.ItemSaver.ATTACHMENT_MODE_FILE = 2; - -/** - * Only used by import translators and can remain a no-OP - * @param {Array} collections - */ -Zotero.Translate.ItemSaver.prototype.saveCollection = function(collections) {}; - -/** - * Called by Zotero.Translate upon successful item translation - * @param {Object[]} jsonItems - Items in Zotero.Item.toArray() format - * @param {Function} [attachmentCallback] A callback that receives information about attachment - * save progress. The callback will be called as attachmentCallback(attachment, false, error) - * on failure or attachmentCallback(attachment, progressPercent) periodically during saving. - * @param {Function} [itemsDoneCallback] A callback that is called once all top-level items are - * done saving with a list of items. Can include saved notes, but should exclude attachments. - */ -Zotero.Translate.ItemSaver.prototype.saveItems = async function (jsonItems, attachmentCallback, itemsDoneCallback) { - throw new Error(`Zotero.Translate.ItemSaver.prototype.saveItems: not implemented`); -}; - -// Used by export translators in Zotero -Zotero.Translate.ItemGetter = function() { - this._itemsLeft = null; - this._itemID = 1; -}; - -Zotero.Translate.ItemGetter.prototype = { - get numItemsRemaining() { - return this._itemsLeft.length - }, - - setItems: function(items) { - this._itemsLeft = items; - this.numItems = this._itemsLeft.length; - }, - - setCollection: function (collection, getChildCollections) { - throw new Error(`Zotero.Translate.ItemGetter.prototype.setCollection: not implemented`); - }, - - /** - * NOTE: This function should use the Zotero.Promise.method wrapper which adds a - * isResolved property to the returned promise for noWait translation. - */ - setAll: Zotero.Promise.method(function (libraryID, getChildCollections) { - throw new Error(`Zotero.Translate.ItemGetter.prototype.setAll: not implemented`); - }), - - /** - * Retrieves the next available item - */ - nextItem: function() { - if(!this._itemsLeft.length) return false; - var item = this._itemsLeft.shift(); - if (this.legacy) { - item = Zotero.Utilities.Item.itemToLegacyExportFormat(item); - } - if (!item.attachments) { - item.attachments = []; - } - if (!item.notes) { - item.notes = []; - } - - // convert single field creators to format expected by export - if(item.creators) { - for(var i=0; i. - - ***** END LICENSE BLOCK ***** -*/ - -// Enumeration of types of translators -var TRANSLATOR_TYPES = {"import":1, "export":2, "web":4, "search":8}; - -// Properties required for every translator -var TRANSLATOR_REQUIRED_PROPERTIES = ["translatorID", "translatorType", "label", "creator", - "target", "priority", "lastUpdated"]; -// Properties that are preserved if present -var TRANSLATOR_OPTIONAL_PROPERTIES = ["targetAll", "browserSupport", "minVersion", "maxVersion", - "inRepository", "configOptions", "displayOptions", - "hiddenPrefs", "itemType"]; -// Properties that are passed from background to inject page in connector -var TRANSLATOR_PASSING_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES - .concat(["targetAll", "browserSupport", "code", "runMode", "itemType", "inRepository"]); - -var TRANSLATOR_CACHING_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES - .concat(["browserSupport", "targetAll"]); - -/** - * @class Represents an individual translator - * @constructor - * @property {String} translatorID Unique GUID of the translator - * @property {Integer} translatorType Type of the translator (use bitwise & with TRANSLATOR_TYPES to read) - * @property {String} label Human-readable name of the translator - * @property {String} creator Author(s) of the translator - * @property {String} target Location that the translator processes - * @property {String} minVersion Minimum Zotero version - * @property {String} maxVersion Minimum Zotero version - * @property {Integer} priority Lower-priority translators will be selected first - * @property {String} browserSupport String indicating browser supported by the translator - * g = Gecko (Firefox) - * c = Google Chrome (WebKit & V8) - * s = Safari (WebKit & Nitro/Squirrelfish Extreme) - * i = Internet Explorer - * b = Bookmarklet - * v = Server - * @property {Object} configOptions Configuration options for import/export - * @property {Object} displayOptions Display options for export - * @property {Object} hiddenPrefs Hidden preferences configurable through about:config - * @property {Boolean} inRepository Whether the translator may be found in the repository - * @property {String} lastUpdated SQL-style date and time of translator's last update - * @property {Object} metadata - Metadata block as object - * @property {String} code The executable JavaScript for the translator - * @property {Boolean} cacheCode Whether to cache code for this session (non-connector only) - * @property {String} [path] File path corresponding to this translator (non-connector only) - * @property {String} [fileName] File name corresponding to this translator (non-connector only) - */ -Zotero.Translator = function(info) { - this.init(info); -} - -/** - * Initializes a translator from a set of info, clearing code if it is set - */ -Zotero.Translator.prototype.init = function(info) { - // make sure we have all the properties - for (let property of TRANSLATOR_REQUIRED_PROPERTIES) { - if (info[property] === undefined) { - this.logError(new Error('Missing property "'+property+'" in translator metadata JSON object in ' + info.label)); - break; - } else { - this[property] = info[property]; - } - } - for (let property of TRANSLATOR_OPTIONAL_PROPERTIES) { - if(info[property] !== undefined) { - this[property] = info[property]; - } - } - - this.browserSupport = info["browserSupport"] ? info["browserSupport"] : "g"; - - var supported = !Zotero.isBookmarklet || this.browserSupport.includes("b") || - /(?:^|; ?)bookmarklet-debug-mode=1(?:$|; ?)/.test(document.cookie); - - if (supported) { - this.runMode = Zotero.Translator.RUN_MODE_IN_BROWSER; - } else { - this.runMode = Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE; - } - - if (this.translatorType & TRANSLATOR_TYPES["import"]) { - // compile import regexp to match only file extension - this.importRegexp = this.target ? new RegExp("\\."+this.target+"$", "i") : null; - } else if (this.hasOwnProperty("importRegexp")) { - delete this.importRegexp; - } - - // Always cache in the connector. Cache if property is set - this.cacheCode = Zotero.isConnector || info.cacheCode; - if (this.translatorType & TRANSLATOR_TYPES["web"]) { - // Also cache if there is no regexp target -- generic translator - this.cacheCode |= !this.target; - this.webRegexp = { - root: this.target ? new RegExp(this.target, "i") : null, - all: this.targetAll ? new RegExp(this.targetAll, "i") : null - }; - } else if (this.hasOwnProperty("webRegexp")) { - delete this.webRegexp; - } - - if (info.path) { - this.path = info.path; - this.fileName = OS.Path.basename(info.path); - } - if (info.code && this.cacheCode) { - this.code = info.code; - } else if (this.hasOwnProperty("code")) { - delete this.code; - } - // Save a copy of the metadata block - delete info.path; - delete info.code; - this.metadata = info; - -}; - -/** - * Get metadata block for a translator - */ -Zotero.Translator.prototype.serialize = function(properties) { - var info = {}; - for(var i in properties) { - var property = properties[i]; - info[property] = this[property]; - } - return info; -} - -/** - * Log a translator-related error - * @param {String} message The error message - * @param {String} [type] The error type ("error", "warning", "exception", or "strict") - * @param {String} [line] The text of the line on which the error occurred - * @param {Integer} lineNumber - * @param {Integer} colNumber - */ -Zotero.Translator.prototype.logError = function(message, type, line, lineNumber, colNumber) { - if (Zotero.isFx && this.path) { - Components.utils.import("resource://gre/modules/FileUtils.jsm"); - var file = new FileUtils.File(this.path); - var ios = Components.classes["@mozilla.org/network/io-service;1"]. - getService(Components.interfaces.nsIIOService); - Zotero.log(message, type ? type : "error", ios.newFileURI(file).spec); - Zotero.debug(message, 1); - } else { - Zotero.logError(message); - } -} - -Zotero.Translator.RUN_MODE_IN_BROWSER = 1; -Zotero.Translator.RUN_MODE_ZOTERO_STANDALONE = 2; -Zotero.Translator.RUN_MODE_ZOTERO_SERVER = 4; -Zotero.Translator.TRANSLATOR_TYPES = TRANSLATOR_TYPES; -Zotero.Translator.TRANSLATOR_REQUIRED_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES; -Zotero.Translator.TRANSLATOR_OPTIONAL_PROPERTIES = TRANSLATOR_OPTIONAL_PROPERTIES; -Zotero.Translator.TRANSLATOR_PASSING_PROPERTIES = TRANSLATOR_PASSING_PROPERTIES; -Zotero.Translator.TRANSLATOR_CACHING_PROPERTIES = TRANSLATOR_CACHING_PROPERTIES; - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = Zotero.Translator; -} diff --git a/zotero-connectors/src/translate/src/translators.js b/zotero-connectors/src/translate/src/translators.js deleted file mode 100644 index c4df51e7..00000000 --- a/zotero-connectors/src/translate/src/translators.js +++ /dev/null @@ -1,174 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - ***** END LICENSE BLOCK ***** -*/ - - -/** - * Singleton to handle loading and caching of translators - * This is a virtual class for reference implementation purposes - * A consumer of the translation code should implement these functions - */ -Zotero.Translators = new function() { - // Should be populated on this.init() - this._cache = {"import":[], "export":[], "web":[], "search":[]}; - // Should set to true after translators are loaded into memory - this._initialized = false; - - /** - * Gets the translator that corresponds to a given ID with code set - * @param {String} id The ID of the translator - */ - this.get = function (id) { - throw new Error(`Zotero.Translators.get(): not implemented`); - }; - - /** - * Gets the translator code that corresponds to a given ID - * This function is only necessary if translators are not loaded with - * code already during init(). If retrieving from repo you may want to - * cache updated translator info if metadata.lastUpdated > localTranslator.lastUpdated - * - * NOTE: This function should use the Zotero.Promise.method wrapper which adds a - * isResolved property to the returned promise for noWait translation. - * - * @param {Zotero.Translator} translator - * @return {String} translator code - */ - this.getCodeForTranslator = Zotero.Promise.method(async function (translator) { - throw new Error(`Zotero.Translators.getCodeForTranslator(): not implemented`); - }); - - /** - * Gets all translators for a specific type of translation - * @param {String} type The type of translators to get (import, export, web, or search) - */ - this.getAllForType = async function (type) { - throw new Error(`Zotero.Translators.getAllForType(): not implemented`); - }; - - /** - * Gets web translators for a specific location - * - * @param {String} URI The URI where translation will run - * @param {String} rootURI The root URI of the page of translation if URI is a frame location - * @return {Promise} - A promise for a 2-item array containing an array of translators and - * an array of functions for converting URLs from proper to proxied forms - */ - this.getWebTranslatorsForLocation = async function (URI, rootURI) { - var isFrame = URI !== rootURI; - if (!this._initialized) { - if (this.init) { - await this.init(); - } - else { - throw new Error('Zotero.Translators.getWebTranslatorsForLocation(): Zotero.Translators is not not initialized'); - } - } - var allTranslators = this._cache["web"]; - var potentialTranslators = []; - var proxies = []; - - var rootSearchURIs = Zotero.Proxies.getPotentialProxies(rootURI); - var frameSearchURIs = isFrame ? Zotero.Proxies.getPotentialProxies(URI) : rootSearchURIs; - - Zotero.debug("Translators: Looking for translators for "+Object.keys(frameSearchURIs).join(', ')); - - for(var i=0; i this.getCodeFor(i))); - } - } - return Promise.all(codes); -}; - -if (typeof process === 'object' && process + '' === '[object process]'){ - module.exports = Zotero.Translators; -} diff --git a/zotero-connectors/src/translate/src/utilities_translate.js b/zotero-connectors/src/translate/src/utilities_translate.js deleted file mode 100644 index 7ad5cad6..00000000 --- a/zotero-connectors/src/translate/src/utilities_translate.js +++ /dev/null @@ -1,479 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see . - - - Utilities based in part on code taken from Piggy Bank 2.1.1 (BSD-licensed) - - ***** END LICENSE BLOCK ***** -*/ - -/** - * @class All functions accessible from within Zotero.Utilities namespace inside sandboxed - * translators - * - * @constructor - * @augments Zotero.Utilities - * @borrows Zotero.Date.formatDate as this.formatDate - * @borrows Zotero.Date.strToDate as this.strToDate - * @borrows Zotero.Date.strToISO as this.strToISO - * @borrows Zotero.OpenURL.createContextObject as this.createContextObject - * @borrows Zotero.OpenURL.parseContextObject as this.parseContextObject - * @borrows Zotero.HTTP.processDocuments as this.processDocuments - * @borrows Zotero.HTTP.doPost as this.doPost - * @param {Zotero.Translate} translate - */ -Zotero.Utilities.Translate = function(translate) { - this._translate = translate; -} - -var tmp = function() {}; -tmp.prototype = Zotero.Utilities; -Zotero.Utilities.Translate.prototype = new tmp(); - -Zotero.Utilities.Translate.prototype.formatDate = Zotero.Date.formatDate; -Zotero.Utilities.Translate.prototype.strToDate = Zotero.Date.strToDate; -Zotero.Utilities.Translate.prototype.strToISO = Zotero.Date.strToISO; -Zotero.Utilities.Translate.prototype.createContextObject = Zotero.OpenURL.createContextObject; -Zotero.Utilities.Translate.prototype.parseContextObject = Zotero.OpenURL.parseContextObject; - -/** - * Hack to overloads {@link Zotero.Utilities.capitalizeTitle} to allow overriding capitalizeTitles - * pref on a per-translate instance basis (for translator testing only) - */ -Zotero.Utilities.Translate.prototype.capitalizeTitle = function(string, force) { - if(force === undefined) { - var translate = this._translate; - do { - if(translate.capitalizeTitles !== undefined) { - force = translate.capitalizeTitles; - break; - } - } while(translate = translate._parentTranslator); - } - - return Zotero.Utilities.capitalizeTitle(string, force); -} - -/** - * Gets the current Zotero version - * - * @type String - */ -Zotero.Utilities.Translate.prototype.getVersion = function() { - return Zotero.version; -} - -/** - * Takes an XPath query and returns the results - * - * @deprecated Use {@link Zotero.Utilities.xpath} or doc.evaluate() directly - * @type Node[] - */ -Zotero.Utilities.Translate.prototype.gatherElementsOnXPath = function(doc, parentNode, xpath, nsResolver) { - var elmts = []; - - var iterator = doc.evaluate(xpath, parentNode, nsResolver, XPathResult.ANY_TYPE, null); - var elmt = iterator.iterateNext(); - var i = 0; - while (elmt) { - elmts[i++] = elmt; - elmt = iterator.iterateNext(); - } - return elmts; -} - -/** - * Gets a given node as a string containing all child nodes - * - * @deprecated Use doc.evaluate and the "nodeValue" or "textContent" property - * @type String - */ -Zotero.Utilities.Translate.prototype.getNodeString = function(doc, contextNode, xpath, nsResolver) { - var elmts = this.gatherElementsOnXPath(doc, contextNode, xpath, nsResolver); - var returnVar = ""; - for(var i=0; i textContent pairs, suitable for passing to - * Zotero.selectItems from within a translator - */ -Zotero.Utilities.Translate.prototype.getItemArray = function(doc, inHere, urlRe, rejectRe) { - var availableItems = new Object(); // Technically, associative arrays are objects - - // Require link to match this - if(urlRe) { - if(urlRe.exec) { - var urlRegexp = urlRe; - } else { - var urlRegexp = new RegExp(); - urlRegexp.compile(urlRe, "i"); - } - } - // Do not allow text to match this - if(rejectRe) { - if(rejectRe.exec) { - var rejectRegexp = rejectRe; - } else { - var rejectRegexp = new RegExp(); - rejectRegexp.compile(rejectRe, "i"); - } - } - - if(!inHere.length) { - inHere = new Array(inHere); - } - - for(var j=0; j