diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..3cf275e6 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,99 @@ +version: 2.0 +jobs: + test: + docker: + - image: circleci/node:12-browsers + steps: + - checkout + - run: npm ci + - run: npm run lint + - run: npm test + - store_artifacts: + path: coverage + integration_tests: + docker: + - image: circleci/node:12-browsers + steps: + - checkout + - run: npm ci + - run: + name: Run integration test + command: ./scripts/bin/run-integration-test-circleci.sh + deploy_dev: + docker: + - image: circleci/node:12 + steps: + - checkout + - setup_remote_docker + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: docker build -t mozilla/send:latest . + - run: docker push mozilla/send:latest + deploy_vnext: + docker: + - image: circleci/node:12 + steps: + - checkout + - setup_remote_docker + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: docker build -t mozilla/send:vnext . + - run: docker push mozilla/send:vnext + deploy_stage: + docker: + - image: circleci/node:12 + steps: + - checkout + - setup_remote_docker + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: docker build -t mozilla/send:$CIRCLE_TAG . + - run: docker push mozilla/send:$CIRCLE_TAG +workflows: + version: 2 + test_pr: + jobs: + - test: + filters: + branches: + ignore: + - master + - vnext + - integration_tests: + filters: + branches: + ignore: master + build_and_deploy_dev: + jobs: + - deploy_dev: + filters: + branches: + only: master + tags: + ignore: /^v.*/ + - deploy_vnext: + filters: + branches: + only: vnext + tags: + ignore: /^v.*/ + build_and_deploy_stage: + jobs: + - test: + filters: + branches: + ignore: /.*/ + tags: + only: /^v.*/ + - integration_tests: + filters: + branches: + ignore: /.*/ + tags: + only: /^v.*/ + - deploy_stage: + requires: + - test + - integration_tests + filters: + branches: + ignore: /.*/ + tags: + only: /^v.*/ diff --git a/.dockerignore b/.dockerignore index eb85ddcc..f91dc6a9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,8 @@ -node_modules -.git +.circleci +.nyc_output +.vscode .DS_Store -firefox -assets +coverage docs -public -test +firefox +node_modules \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index 7540c39c..32edc4a2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,8 @@ dist assets firefox +coverage +android/app/build +app/locale.js +app/capabilities.js +app/qrcode.js \ No newline at end of file diff --git a/.eslintrc.yml b/.eslintrc.yml index 6556e4c1..c8b60c4c 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,6 +4,7 @@ env: extends: - eslint:recommended + - prettier - plugin:node/recommended - plugin:security/recommended @@ -14,18 +15,14 @@ plugins: root: true rules: + node/no-deprecated-api: off + node/no-unsupported-features/es-syntax: off + node/no-unsupported-features/node-builtins: off node/no-unpublished-require: off + node/no-unpublished-import: off security/detect-non-literal-fs-filename: off security/detect-object-injection: off - eol-last: [error, always] - eqeqeq: error - no-alert: warn - no-console: warn - no-path-concat: error no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}] - no-var: error - one-var: [error, never] - prefer-const: error - quotes: [error, single, {avoidEscape: true}] + require-atomic-updates: warn diff --git a/.gitattributes b/.gitattributes index 0f491c95..b7c76f43 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -public/locales/* linguist-documentation -docs/* linguist-documentation +public/locales/*/*.ftl linguist-documentation +docs/** linguist-documentation diff --git a/.gitignore b/.gitignore index f06235c4..893f032d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,16 @@ node_modules +coverage dist +.env +.idea +.DS_Store +.nyc_output +.tox +.pytest_cache +*.iml +android/app/src/main/assets +ios/send-ios/assets/ios.js +ios/send-ios/assets/vendor.js +ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/* +ios/send-ios.xcodeproj/xcuserdata/* +test/integration/downloads diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..6ff72043 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,72 @@ + +stages: + - test + - release + +# Build Send, run npm tests +test: + stage: test + image: "node:16-slim" + only: + - api + - branches + - chat + - merge_requests + - pushes + - schedules + - tags + - triggers + - web + before_script: + # Install dependencies + - apt-get update + - apt-get install -y git python3 build-essential libxtst6 + + # Prepare Chrome for puppeteer + - apt-get install -y wget gnupg + - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - + - sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' + - apt-get update + - apt-get install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils + - apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 --no-install-recommends + script: + - npm ci + - npm run lint + - npm test + +release-docker: + stage: release + image: docker:latest + services: + - docker:dind + only: + - api + - branches + - chat + - merge_requests + - pushes + - schedules + - tags + - triggers + - web + script: + - docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" + - docker buildx create --name sendBuilder + - docker buildx use sendBuilder + - | + if [ "$CI_PIPELINE_SOURCE" == "merge_request_event" ]; then + IMAGE_NAMES="$CI_REGISTRY_IMAGE/mr:$CI_MERGE_REQUEST_IID" + elif [ "$CI_COMMIT_TAG" != "" ]; then + IMAGE_NAMES="$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG $CI_REGISTRY_IMAGE:latest" + else + IMAGE_NAMES="$CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHORT_SHA" + fi + - | + for image in $IMAGE_NAMES; do + docker buildx build --platform linux/amd64,linux/arm64 -t $image . --push + done + - | + echo "Container image pushed. You can pull it with"; + for image in $IMAGE_NAMES; do + echo "docker pull $image" + done diff --git a/.nsprc b/.nsprc deleted file mode 100644 index e7831e90..00000000 --- a/.nsprc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "exceptions": ["https://nodesecurity.io/advisories/534"] -} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index c4ae50c4..994b9f2f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,4 @@ dist -assets/*.js +android/app/src/main/assets +android/app/build +coverage \ No newline at end of file diff --git a/.stylelintrc b/.stylelintrc index 9ade6144..afc9e08d 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -10,3 +10,6 @@ rules: declaration-colon-newline-after: null selector-list-comma-newline-after: null value-list-comma-newline-after: null + at-rule-no-unknown: null + # Conflicts with prettier + string-quotes: null diff --git a/CHANGELOG.md b/CHANGELOG.md index 49216149..2c1f5b62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,98 @@ ## Change Log +### v2.5.1 (2018/03/12 19:26 +00:00) +- [#789](https://github.com/mozilla/send/pull/789) Fixed #775 : Made text not-selectable (@RCMainak) + +### v2.5.0 (2018/03/08 19:31 +00:00) +- [#782](https://github.com/mozilla/send/pull/782) updated docs (@dannycoates) +- [#781](https://github.com/mozilla/send/pull/781) Don't translate URL-safe chars, b64 is doing it for us (@timvisee) +- [#779](https://github.com/mozilla/send/pull/779) implemented crypto polyfills for ms edge (@dannycoates) + +### v2.4.1 (2018/02/28 17:05 +00:00) +- [#777](https://github.com/mozilla/send/pull/777) use a separate circle in the progress svg for indefinite progress (@dannycoates) + +### v2.4.0 (2018/02/27 01:55 +00:00) +- [#769](https://github.com/mozilla/send/pull/769) removed unsafe-inline styles via svgo-loader (@dannycoates) +- [#767](https://github.com/mozilla/send/pull/767) added coverage artifact to circleci (@dannycoates) +- [#766](https://github.com/mozilla/send/pull/766) Some frontend unit tests [WIP] (@dannycoates) +- [#761](https://github.com/mozilla/send/pull/761) added maxPasswordLength and passwordError messages (@dannycoates) +- [#764](https://github.com/mozilla/send/pull/764) added indefinite progress mode (@dannycoates) +- [#760](https://github.com/mozilla/send/pull/760) refactored css: phase 1 (@dannycoates) +- [#759](https://github.com/mozilla/send/pull/759) Switch en-US FTL file to new syntax (@flodolo) +- [#758](https://github.com/mozilla/send/pull/758) refactored server (@dannycoates) +- [#757](https://github.com/mozilla/send/pull/757) Update to fluent 0.4.3 (@stasm) + +### v2.3.0 (2018/02/01 23:27 +00:00) +- [#536](https://github.com/mozilla/send/pull/536) use redis expire event to delete stored data immediately (@ehuggett) +- [#744](https://github.com/mozilla/send/pull/744) Gradient experiment (@dannycoates) +- [#739](https://github.com/mozilla/send/pull/739) added /api/info/:id route (@dannycoates) +- [#737](https://github.com/mozilla/send/pull/737) big refactor (@dannycoates) +- [#722](https://github.com/mozilla/send/pull/722) Add localization note to 'Time' and 'Downloads' string (@flodolo) +- [#721](https://github.com/mozilla/send/pull/721) show download Limits on page; Fixes #661 (@shikhar-scs) +- [#694](https://github.com/mozilla/send/pull/694) Passwords can now be changed (#687) (@himanish-star) +- [#702](https://github.com/mozilla/send/pull/702) Restricted the banner from showing on unsupported browsers (@himanish-star) +- [#701](https://github.com/mozilla/send/pull/701) improved popup for mobile display; Fixes #699 (@shikhar-scs) +- [#683](https://github.com/mozilla/send/pull/683) API changes to accommodate 3rd party clients (@ehuggett) +- [#698](https://github.com/mozilla/send/pull/698) Popup for delete button attached (@himanish-star) +- [#695](https://github.com/mozilla/send/pull/695) Show Warning, Cancel and Redirect on size > 2GB ; fixes #578 (@shikhar-scs) +- [#684](https://github.com/mozilla/send/pull/684) delete btn popup attached (@himanish-star) +- [#686](https://github.com/mozilla/send/pull/686) Hide password while Typing and after Entering: Fixes #670 (@shikhar-scs) +- [#679](https://github.com/mozilla/send/pull/679) changed font to sans sherif: Solves #676 (@shikhar-scs) +- [#693](https://github.com/mozilla/send/pull/693) README: Fix query link for "good first bugs" (@jspam) +- [#685](https://github.com/mozilla/send/pull/685) checkbox now has a hover effect: fixes #635 (@himanish-star) +- [#668](https://github.com/mozilla/send/pull/668) Add possibility to bind to a specific IP address (@TwizzyDizzy) +- [#682](https://github.com/mozilla/send/pull/682) [Docs] - README.md - minor spelling fixes (@tmm2018) +- [#672](https://github.com/mozilla/send/pull/672) Use EXPIRE_SECONDS to calculate file ttl for static content (@derektamsen) +- [#680](https://github.com/mozilla/send/pull/680) adjusted line height of label : fixes #609 (@himanish-star) + +### v2.2.2 (2017/12/19 18:06 +00:00) +- [#667](https://github.com/mozilla/send/pull/667) Make develop the default NODE_ENV (@claudijd) + +### v2.2.1 (2017/12/08 18:00 +00:00) +- [#665](https://github.com/mozilla/send/pull/665) stop drag target from flickering when dragging over children (@ericawright) + +### v2.2.0 (2017/12/06 23:57 +00:00) +- [#654](https://github.com/mozilla/send/pull/654) Multiple download UI (@dannycoates) +- [#650](https://github.com/mozilla/send/pull/650) #634: overwrite appearance of password submit input (@ovlb) +- [#649](https://github.com/mozilla/send/pull/649) #609 share interface: align text in input and button (@ovlb) + +### v2.1.2 (2017/11/16 19:03 +00:00) +- [#645](https://github.com/mozilla/send/pull/645) Remove the leak of the password into the console (@laurentj) + +### v2.1.0 (2017/11/15 03:07 +00:00) +- [#641](https://github.com/mozilla/send/pull/641) Added experiment for firefox download promo (@dannycoates) +- [#640](https://github.com/mozilla/send/pull/640) use fluent-langneg for subtag support (@dannycoates) +- [#639](https://github.com/mozilla/send/pull/639) wrap number localization in try/catch (@dannycoates) + +### v2.0.0 (2017/11/08 05:31 +00:00) +- [#633](https://github.com/mozilla/send/pull/633) Keyboard navigation/visual feedback regression (@ehuggett) +- [#632](https://github.com/mozilla/send/pull/632) display the 'add password' button only when the input field isn't empty (@dannycoates) +- [#626](https://github.com/mozilla/send/pull/626) Partial fix for #623 (@ehuggett) +- [#624](https://github.com/mozilla/send/pull/624) set a default MIME type in file metadata (@ehuggett) +- [#612](https://github.com/mozilla/send/pull/612) Password UI nits (@dannycoates, @ericawright) +- [#617](https://github.com/mozilla/send/pull/617) allow drag and drop if navigating from shared page (@ericawright) +- [#608](https://github.com/mozilla/send/pull/608) disable copying link when password not completed (@ericawright) +- [#605](https://github.com/mozilla/send/pull/605) align the "Password" and "Copy to clipboard" fields. (@ericawright) +- [#582](https://github.com/mozilla/send/pull/582) Add optional password to the download url (@dannycoates) + +### v1.2.4 (2017/10/10 17:34 +00:00) +- [#583](https://github.com/mozilla/send/pull/583) Promote the beefy UI to default (@dannycoates) +- [#581](https://github.com/mozilla/send/pull/581) introducing ToC to README.md (@tmm2018) +- [#579](https://github.com/mozilla/send/pull/579) Hide cancel button when upload reaches 100% (@ericawright) +- [#580](https://github.com/mozilla/send/pull/580) Change Favicon in to look better in a variety of cases (@ericawright) +- [#571](https://github.com/mozilla/send/pull/571) Centre logo (@ehuggett) +- [#574](https://github.com/mozilla/send/pull/574) Make upload button focusable (accessibility/tab navigation) (@ehuggett) + +### v1.2.0 (2017/09/12 22:42 +00:00) +- [#559](https://github.com/mozilla/send/pull/559) added first A/B experiment (@dannycoates) +- [#542](https://github.com/mozilla/send/pull/542) fix docker link typo (@ehuggett) +- [#541](https://github.com/mozilla/send/pull/541) removed .title and .alt attributes from ftl (@dannycoates) +- [#537](https://github.com/mozilla/send/pull/537) a few changes to make A/B testing easier (@dannycoates) +- [#533](https://github.com/mozilla/send/pull/533) minor UI fixes (@youwenliang) +- [#531](https://github.com/mozilla/send/pull/531) Add CHANGELOG script (@pdehaan) +- [#535](https://github.com/mozilla/send/pull/535) Fixed minimum NodeJS version in README (@LuFlo) +- [#528](https://github.com/mozilla/send/pull/528) adding separators to README (@tmm2018) + ### v1.1.1 (2017/08/17 01:29 +00:00) - [#516](https://github.com/mozilla/send/pull/516) cache assets (@dannycoates) - [#520](https://github.com/mozilla/send/pull/520) fix drag & drop (@dannycoates) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..498baa3f --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,15 @@ +# Community Participation Guidelines + +This repository is governed by Mozilla's code of conduct and etiquette guidelines. +For more details, please read the +[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/). + +## How to Report +For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page. + + diff --git a/CONTRIBUTORS b/CONTRIBUTORS index a611f693..87dd4c15 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,92 +1,332 @@ +Abd ar-Rahman Hamidi +Abdalrahman Hwoij +Abdulrash6211 +Abdulrasheed Idris +Abelardo Ayala Rodríguez Abhinav Adduri +Adaobi +Adnan Kičin +Adolfo Jayme Barrientos +Alberto Castro +Alexander Parada Alexander Slovesnik +Alfredos-Panagiotis Damkalis +Aman Alam Amin Mahmudian +Ander Elortondo Andreas Pettersson +Anesu Chiodza +Anika Dorn +Anish Sheela Arash Mousavi +Artem Polivanchuk +Ashesh Vidyut +Ashikur Rahman +Ashok kumar +Ayobamiadebayo375 +Balasankar C +Bald3mar Balázs Meskó Belayet Hossain +Benjamin Forehand Jr +Besnik Bleta +Björn I Bjørn I Boopesh Mahendran +Brahim Essaidi +Brainlulz +Breana Gonzales +CLASSIFIED +Christian Elbrianno +Christoph Kührer +Christopher Ramírez Chuck Harmston +Cloney 173741 Cláudio Esperança +Connor Ford +Cristian Silaghi Cynthia Pereira Daniel Thorn Daniela Arcese Danny Coates +David Dumas +Davide +Derek Tamsen +Dhyey Thakore +Donovan Preston +Edi Santoso +Edmund Huggett +Eduard Bopp +Elisa X +Emily +Emily Hou Emin Mastizada Enol Erica Erica Wright +Fauzan Alfi +Filip Hruška Fjoerfoks Francesco Lodolo Francesco Lodolo [:flod] +Frederick Villaluna +G12r +Gabriela +Garysqo Gautam krishna.R +George Raptis +Georgianizator +Gery Escalier +Gisela Solis +Gonçalo Matos +Gwenn +Hampus +Hmxhmx +Hrant +Hugo +Hugo Abreu +Hyeonseok Shin Håvar Henriksen +Ian Neal +ItielMaN Jae Hyeon Park +Jakob Kappel Jakub Rychlý Jamie +Jan Schloß +Jarmo Jim Spentzos +Jiri Grönroos +Jirka Soukeník +Jobava +Joe Becher +Joe ST +Joergen Johann-S John Gruen +John Zonunmawi Vankal +Jon Buckley Jon Vadillo +Jonathan Claudius +Jordi Cuevas Jordi Serratosa +Joseph.maza +José Manuel +Juan Esteban Ajsivinac Sián +Juan Pablo +Juan Sián +Julio Gomez Juraj Cigáň +Jwtiyar +Kerim Kalamujić +Khaled Hosny +Kim Ludvigsen +Kim YoungCheon +Kim Younggeon Kohei Yoshino Lan Glad +Lasse Liehu +Laurent Jouanneau +Lobodzets +LuFlo +Luis A. Sánchez +Luis Flores Martínez +Luiz Carlos de Morais +Luiz Felipe F M Costa Luna Jernberg +Mahay Alam Khan +Manuela Silva +Marcelo Ghelman Marcelo Poli Marco Aurélio +Mark Heijl Mark Liang +Mark Liang (You-Wen) +Marko Andrejić +Martijn Dekker +Marwan Mohamad +Mathieu Lecarme Matjaž Horvat Maykon Chagas +Melo46 +Merike Sell Michael Köhler +Michael Peter Michael Wolf Michal Stanke Michal Vašíček +Miguel +Mikeyy +Milo +Miro Rauhala +Misael Hernández +Mozilla Pontoon +Mozilla-GitHub-Standards +Mozinet Moḥend Belqasem +Muhend Belkacem +Muḥend Belqasem +Myungjae Won +Netza López Nicholas Skinsacos +Nihad +Nihad Suljić +Niksend Mizuhara +Oscar +Paulius +Pedro Burlamaqui Bendahan Peter deHaan Pierre Neter Pin-guang Chen +Piotr Drąg +Pontoon +Quentí +Quế Tùng +Rachel Tublitz +Radu Popescu Rhoslyn Prys +RickieES +Ricky Rosario +Rimas Kudelis Rizky Ariestiyansyah +Rob Powell +Robert Roberto Alvarado Rodrigo +Rodrigo Guerra Rok Žerdin +Romi Hardiyanto +Rongjian Zhang +Ruba Sahithi Sairam Raavi +Sander Lepik Sandro +Sara Todaro +Sav22999 Schieck :) Selim Şumlu +Selyan Sliman Amiri +Selyan Slimane Amiri +Sidak Singh Aulakh Slimane Amiri +Slimane Selyan AMIRI +Soumya Himanish Mohapatra +Staś Małolepszy +Suriyaa ✌️️ +Tema +Thomas Dalichow Théo Chevalier +Tiago Morais Morgado +Tim Visée +Tomer Cohen Tomáš Zelina Ton +Top Tymur Faradzhev +Uccen Marzuq +Umegbewe Varghese Thomas Victor Bychek +Victor Davila +Victor Ibragimov +Vimal Raghubir +Vitaliy Krutko Weihang Lo +Wiktor Furman Wil Clouser YFdyh000 +Yassine Aït-El-Mouden +Yongmin H You-Wen Liang (Mark) +Zhenya Tikhonov +ZiriSut +aaaaalbert +abtin +ada_okeke60 +aefgh39622 +alamanda +albertdcastro alex_mayorga +ali.malek.71 ariestiyansyah avelper +biobell2000 +bulut +chilledfrogs +clouserw-mozilla-owner +dependabot[bot] dgadelha +dskmori ehuggett +elenatambriz eljuno +emily-hou1 erdem cobanoglu +fcortess gautamkrishnar +gmontagu goofy +hello hi +ivan.pompa +jackyzy823 jesferman1993 +jlG +jnunezf96 +johngruen josotrix +jspam +julen +julenx kenrick95 +kumincir +leo.toneff +m4hdi.pdroid +mail +manuel padilla sanchez manxmensch +marigalicer +marsf +merianosnikos +minvs1 +mirzet.omerovic.1992 +mujeebcpy +okyanusoz +p.sanroman.bengoetxea +passionforlife +paul.trevor +pyup.io bot ravmn +rcmainak reza.habibi2008 +rgpublic +risger +robbp +ruikunai +savemore99.sm +sergio +shamanchic2011 +shikhar-scs siparon skystar-p +stripTM +sugabelly +tatalmondmush +tiagomoraismorgado +timvisee +victor.gonzalezro xcffl +ybouhamam +yoshimitsu002 +yusup.ramdani +zankomhamad Μιχάλης Марко Костић (Marko Kostić) +Ратко Вујановић +صفا الفليج +వీవెన్ +ജോയ്സ് +张无忌 +新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美 +莫非前世那一眼 diff --git a/Dockerfile b/Dockerfile index 93f3a47b..53220098 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,73 @@ -FROM node:8-alpine +## +# Send +# +# License https://gitlab.com/timvisee/send/blob/master/LICENSE +## + +# Build project +FROM node:16.13-alpine3.13 AS builder + +RUN set -x \ + # Change node uid/gid + && apk --no-cache add shadow \ + && groupmod -g 1001 node \ + && usermod -u 1001 -g 1001 node + +RUN set -x \ + # Add user + && addgroup --gid 1000 app \ + && adduser --disabled-password \ + --gecos '' \ + --ingroup app \ + --home /app \ + --uid 1000 \ + app + +COPY --chown=app:app . /app -RUN apk add --no-cache git -RUN addgroup -S -g 10001 app && adduser -S -D -G app -u 10001 app -COPY . /app -RUN chown -R app /app USER app WORKDIR /app -RUN mkdir static -RUN npm install --production && npm cache clean --force + +RUN set -x \ + # Build + && PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm ci \ + && npm run build + +# Main image +FROM node:16.13-alpine3.13 + +RUN set -x \ + # Change node uid/gid + && apk --no-cache add shadow \ + && groupmod -g 1001 node \ + && usermod -u 1001 -g 1001 node + +RUN set -x \ + # Add user + && addgroup --gid 1000 app \ + && adduser --disabled-password \ + --gecos '' \ + --ingroup app \ + --home /app \ + --uid 1000 \ + app + +USER app +WORKDIR /app + +COPY --chown=app:app package*.json ./ +COPY --chown=app:app app app +COPY --chown=app:app common common +COPY --chown=app:app public/locales public/locales +COPY --chown=app:app server server +COPY --chown=app:app --from=builder /app/dist dist + +RUN npm ci --production && npm cache clean --force +RUN mkdir -p /app/.config/configstore +RUN ln -s dist/version.json version.json ENV PORT=1443 -EXPOSE $PORT -CMD ["npm", "run", "prod"] +EXPOSE ${PORT} + +CMD ["node", "server/bin/prod.js"] diff --git a/README.md b/README.md index c9ac6f68..b05f668f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,59 @@ -# Firefox Send +# [![Send](./assets/icon-64x64.png)](https://gitlab.com/timvisee/send/) Send -[![CircleCI](https://img.shields.io/circleci/project/github/mozilla/send.svg)](https://circleci.com/gh/mozilla/send) -[![Available on Test Pilot](https://img.shields.io/badge/available_on-Test_Pilot-0996F8.svg)](https://testpilot.firefox.com/experiments/send) +[![Build status on GitLab CI][gitlab-ci-master-badge]][gitlab-ci-link] +[![Latest release][release-badge]][release-link] +[![Docker image][docker-image-badge]][docker-image-link] +[![Project license][repo-license-badge]](LICENSE) -**Docs:** [Docker](docs/docker.md), [Metrics](docs/metrics.md) +[docker-image-badge]: https://img.shields.io/badge/docker-latest-blue.svg +[docker-image-link]: https://gitlab.com/timvisee/send/container_registry/eyJuYW1lIjoidGltdmlzZWUvc2VuZCIsInRhZ3NfcGF0aCI6Ii90aW12aXNlZS9zZW5kL3JlZ2lzdHJ5L3JlcG9zaXRvcnkvMTQxODUwNC90YWdzP2Zvcm1hdD1qc29uIiwiaWQiOjE0MTg1MDQsImNsZWFudXBfcG9saWN5X3N0YXJ0ZWRfYXQiOm51bGx9 +[gitlab-ci-link]: https://gitlab.com/timvisee/send/pipelines +[gitlab-ci-master-badge]: https://gitlab.com/timvisee/send/badges/master/pipeline.svg +[release-badge]: https://img.shields.io/github/v/tag/timvisee/send +[release-link]: https://gitlab.com/timvisee/send/-/tags +[repo-license-badge]: https://img.shields.io/github/license/timvisee/send.svg + +A fork of Mozilla's [Firefox Send][mozilla-send]. +Mozilla discontinued Send, this fork is a community effort to keep the project +up-to-date and alive. + +- Forked [at][fork-commit] Mozilla's last publicly hosted version +- _Mozilla_ & _Firefox_ branding [is][remove-branding-pr] removed so you can legally self-host +- Kept compatible with [`ffsend`][ffsend] (CLI for Send) +- Dependencies have been updated +- Mozilla's [changes][mozilla-patches] since the fork have been selectively [merged][mozilla-patches-pr] +- Mozilla's experimental report feature, download tokens, trust warnings and FxA changes are not included + +Find an up-to-date Docker image here: [docs/docker.md](docs/docker.md) + +The original project by Mozilla can be found [here][mozilla-send]. +The [`mozilla-master`][branch-mozilla-master] branch holds the `master` branch +as left by Mozilla. +The [`send-v3`][branch-send-v3] branch holds the commit tree of Mozilla's last +publicly hosted version, which this fork is based on. +The [`send-v4`][branch-send-v4] branch holds the commit tree of Mozilla's last +experimental version which was still a work in progress (featuring file +reporting, download tokens, trust warnings and FxA changes), this has +selectively been merged into this fork. +Please consider to [donate][donate] to allow me to keep working on this. + +Thanks [Mozilla][mozilla] for building this amazing tool! + +[branch-mozilla-master]: https://gitlab.com/timvisee/send/-/tree/mozilla-master +[branch-send-v3]: https://gitlab.com/timvisee/send/-/tree/send-v3 +[branch-send-v4]: https://gitlab.com/timvisee/send/-/tree/send-v4 +[donate]: https://timvisee.com/donate +[ffsend]: https://github.com/timvisee/ffsend +[fork-commit]: https://gitlab.com/timvisee/send/-/commit/3e9be676413a6e1baaf6a354c180e91899d10bec +[mozilla-patches-pr]: https://gitlab.com/timvisee/send/-/merge_requests/3 +[mozilla-patches]: https://gitlab.com/timvisee/send/-/compare/3e9be676413a6e1baaf6a354c180e91899d10bec...mozilla-master +[mozilla-send]: https://github.com/mozilla/send +[mozilla]: https://mozilla.org/ +[remove-branding-pr]: https://gitlab.com/timvisee/send/-/merge_requests/2 + +--- + +**Docs:** [FAQ](docs/faq.md), [Encryption](docs/encryption.md), [Build](docs/build.md), [Docker](docs/docker.md), [More](docs/) --- @@ -16,7 +66,9 @@ * [Configuration](#configuration) * [Localization](#localization) * [Contributing](#contributing) -* [Testing](#testing) +* [Instances](#instances) +* [Deployment](#deployment) +* [Clients](#clients) * [License](#license) --- @@ -29,22 +81,22 @@ A file sharing experiment which allows you to send encrypted files to other user ## Requirements -- [Node.js 8.2+](https://nodejs.org/) +- [Node.js 16.x](https://nodejs.org/) - [Redis server](https://redis.io/) (optional for development) -- [AWS S3](https://aws.amazon.com/s3/) or compatible service. (optional) +- [AWS S3](https://aws.amazon.com/s3/) or compatible service (optional) --- ## Development -To start an ephemeral development server run: +To start an ephemeral development server, run: ```sh npm install npm start ``` -Then browse to http://localhost:8080 +Then, browse to http://localhost:8080 --- @@ -69,23 +121,45 @@ The server is configured with environment variables. See [server/config.js](serv ## Localization -Firefox Send localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language, or Mozilla’s [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance. +See: [docs/localization.md](docs/localization.md) --- ## Contributing -Pull requests are always welcome! Feel free to check out the list of ["good first bugs"](https://github.com/mozilla/send/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+bug%22). +Pull requests are always welcome! Feel free to check out the list of "good first issues" (to be implemented). --- -## Testing +## Instances -| ENVIRONMENT | URL -|-------------|----- -| Production | -| Stage | -| Development | +Find a list of public instances here: https://github.com/timvisee/send-instances/ + +--- + +## Deployment + +See: [docs/deployment.md](docs/deployment.md) + +Docker quickstart: [docs/docker.md](docs/docker.md) + +AWS example using Ubuntu Server `20.04`: [docs/AWS.md](docs/AWS.md) + +--- + +## Clients + +- Web: _this repository_ +- Command-line: [`ffsend`](https://github.com/timvisee/ffsend) +- Android: _see [Android](#android) section_ +- Thunderbird: [FileLink provider for Send](https://addons.thunderbird.net/thunderbird/addon/filelink-provider-for-send/) + +#### Android + +The android implementation is contained in the `android` directory, +and can be viewed locally for easy testing and editing by running `ANDROID=1 npm +start` and then visiting . CSS and image files are +located in the `android/app/src/main/assets` directory. --- @@ -93,4 +167,6 @@ Pull requests are always welcome! Feel free to check out the list of ["good firs [Mozilla Public License Version 2.0](LICENSE) +[qrcode.js](https://github.com/kazuhikoarase/qrcode-generator) licensed under MIT + --- diff --git a/android/.eslintrc.yaml b/android/.eslintrc.yaml new file mode 100644 index 00000000..73942709 --- /dev/null +++ b/android/.eslintrc.yaml @@ -0,0 +1,6 @@ +env: + browser: true + +parserOptions: + sourceType: module + diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 00000000..caa8065e --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,4 @@ +local.properties +.gradle +build + diff --git a/android/README.md b/android/README.md new file mode 100644 index 00000000..50c7c533 --- /dev/null +++ b/android/README.md @@ -0,0 +1,9 @@ +Readme +===== + +The Send Android app allows you to choose any file from your android device, encrypt it with a password, and get a URL which will allow secure download of the file. By default, this URL will expire after one download or 24 hours. + +Building the Send Android app. +===== + +First, install Android Studio. Open the `android` directory in Android Studio, plug in your android phone, and press the run button. \ No newline at end of file diff --git a/android/SendAndroid.iml b/android/SendAndroid.iml new file mode 100644 index 00000000..3a01e9b2 --- /dev/null +++ b/android/SendAndroid.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/android.js b/android/android.js new file mode 100644 index 00000000..8e194c9e --- /dev/null +++ b/android/android.js @@ -0,0 +1,99 @@ +import 'intl-pluralrules'; +import choo from 'choo'; +import html from 'choo/html'; +import * as Sentry from '@sentry/browser'; + +import { setApiUrlPrefix, getConstants } from '../app/api'; +//import assets from '../common/assets'; +import Archive from '../app/archive'; +import Header from '../app/ui/header'; +import storage from '../app/storage'; +import controller from '../app/controller'; +import User from './user'; +import intents from './stores/intents'; +import home from './pages/home'; +import upload from './pages/upload'; +import share from './pages/share'; +import preferences from './pages/preferences'; +import error from './pages/error'; +import { getTranslator } from '../app/locale'; +import { setTranslate } from '../app/utils'; + +import { delay } from '../app/utils'; + +if (navigator.userAgent === 'Send Android') { + setApiUrlPrefix('https://send.firefox.com'); +} + +const app = choo(); +//app.use(state); +app.use(controller); +app.use(intents); + +window.finishLogin = async function(accountInfo) { + while (!(app.state && app.state.user)) { + await delay(); + } + await app.state.user.finishLogin(accountInfo); + await app.state.user.syncFileList(); + app.emitter.emit('replaceState', '/'); +}; + +function body(main) { + return function(state, emit) { + /* + Disable the preferences menu for now since it is ugly and isn't + relevant to the beta + function clickPreferences(event) { + event.preventDefault(); + emit('pushState', '/preferences'); + } + + const menu = html` + + `; + */ + return html` + + ${state.cache(Header, 'header').render()} ${main(state, emit)} + + `; + }; +} +(async function start() { + const translate = await getTranslator('en-US'); + setTranslate(translate); + const { LIMITS, WEB_UI, DEFAULTS } = await getConstants(); + app.use(state => { + state.LIMITS = LIMITS; + state.WEB_UI = WEB_UI; + state.DEFAULTS = DEFAULTS; + state.translate = translate; + state.capabilities = { + account: true + }; //TODO + state.archive = new Archive( + [], + DEFAULTS.EXPIRE_SECONDS, + DEFAULTS.DOWNLOADS + ); + state.storage = storage; + state.user = new User(storage, LIMITS); + state.sentry = Sentry; + }); + app.route('/', body(home)); + app.route('/upload', upload); + app.route('/share/:id', share); + app.route('/preferences', preferences); + app.route('/error', error); + //app.route('/debugging', require('./pages/debugging').default); + // add /api/filelist + app.mount('body'); +})(); + +window.app = app; diff --git a/android/app/.gitignore b/android/app/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/android/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 00000000..471a3a21 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId "org.mozilla.firefoxsend" + minSdkVersion 26 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation 'com.github.delight-im:Android-AdvancedWebView:v3.0.0' + implementation "org.mozilla.components:service-firefox-accounts:$android_components_version" +} + +task generateAndLinkBundle(type: Exec, description: 'Generate the android.js bundle and link it into the assets directory') { + commandLine './buildAssets.sh' +} + +tasks.withType(JavaCompile) { + compileTask -> compileTask.dependsOn generateAndLinkBundle +} diff --git a/android/app/buildAssets.sh b/android/app/buildAssets.sh new file mode 100755 index 00000000..b936c8db --- /dev/null +++ b/android/app/buildAssets.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +if [ -d "../../node_modules" ] +then + echo "node_modules already present." +else + echo "node_modules not present, running npm install." + npm install +fi +npm run build +rm -rf src/main/assets +mkdir -p src/main/assets +cp -R ../../dist/* src/main/assets diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..9e4163fa --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/ic_launcher-web.png b/android/app/src/main/ic_launcher-web.png new file mode 100644 index 00000000..07411c11 Binary files /dev/null and b/android/app/src/main/ic_launcher-web.png differ diff --git a/android/app/src/main/java/org/mozilla/firefoxsend/MainActivity.kt b/android/app/src/main/java/org/mozilla/firefoxsend/MainActivity.kt new file mode 100644 index 00000000..8b3d475a --- /dev/null +++ b/android/app/src/main/java/org/mozilla/firefoxsend/MainActivity.kt @@ -0,0 +1,226 @@ +package org.mozilla.firefoxsend + +import android.annotation.SuppressLint +import android.content.ComponentName +import android.content.Intent +import android.graphics.Bitmap +import android.net.Uri +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.util.Base64 +import android.util.Log +import android.view.View +import android.webkit.* +import im.delight.android.webview.AdvancedWebView +import kotlinx.android.synthetic.main.activity_main.* +import mozilla.components.service.fxa.Config +import mozilla.components.service.fxa.FirefoxAccount +import mozilla.components.service.fxa.FxaResult +import org.json.JSONObject + +internal class LoggingWebChromeClient : WebChromeClient() { + override fun onConsoleMessage(cm: ConsoleMessage): Boolean { + Log.d(TAG, String.format("%s @ %d: %s", + cm.message(), cm.lineNumber(), cm.sourceId())) + return true + } + + companion object { + private const val TAG = "CONTENT" + } +} + +class WebAppInterface(private val mContext: MainActivity) { + @JavascriptInterface + fun beginOAuthFlow() { + mContext.beginOAuthFlow() + } + + @JavascriptInterface + fun shareUrl(url: String) { + mContext.shareUrl(url) + } +} + +class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { + + private var mToShare: String? = null + private var mToCall: String? = null + private var mAccount: FirefoxAccount? = null + + @SuppressLint("SetJavaScriptEnabled") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG) + webView.apply { + setListener(this@MainActivity, this@MainActivity) + addJavascriptInterface(WebAppInterface(this@MainActivity), JS_INTERFACE_NAME) + setLayerType(View.LAYER_TYPE_HARDWARE, null) + webChromeClient = LoggingWebChromeClient() + + settings.apply { + userAgentString = "Send Android" + allowUniversalAccessFromFileURLs = true + javaScriptEnabled = true + } + } + + val type = intent.type + if (Intent.ACTION_SEND == intent.action && type != null) { + if (type == "text/plain") { + val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT) + // Log.d(TAG_INTENT, "text/plain $sharedText") + mToShare = "data:text/plain;base64," + Base64.encodeToString(sharedText.toByteArray(), 16).trim() + } else if (type.startsWith("image/")) { + val imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM) as Uri + // Log.d(TAG_INTENT, "image/ $imageUri") + mToShare = "data:text/plain;base64," + Base64.encodeToString(imageUri.path.toByteArray(), 16).trim() + } + } + webView.loadUrl("file:///android_asset/android.html") + } + + fun beginOAuthFlow() { + Config.release().then { value -> + mAccount = FirefoxAccount(value, "20f7931c9054d833", "https://send.firefox.com/fxa/android-redirect.html") + mAccount?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true) + ?.then { url -> + // Log.d(TAG_CONFIG, "GOT A URL $url") + this@MainActivity.runOnUiThread { + webView.loadUrl(url) + } + FxaResult.fromValue(Unit) + } + // Log.d(TAG_CONFIG, "CREATED FIREFOXACCOUNT") + FxaResult.fromValue(Unit) + } + } + + fun shareUrl(url: String) { + val shareIntent = Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, url) + } + + val components = arrayOf(ComponentName(applicationContext, MainActivity::class.java)) + val chooser = Intent.createChooser(shareIntent, "") + .putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, components) + + startActivity(chooser) + } + + override fun onResume() { + super.onResume() + webView.onResume() + } + + override fun onPause() { + webView.onPause() + super.onPause() + } + + override fun onDestroy() { + webView.onDestroy() + super.onDestroy() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) { + super.onActivityResult(requestCode, resultCode, intent) + webView.onActivityResult(requestCode, resultCode, intent) + } + + override fun onBackPressed() { + if (!webView.onBackPressed()) { + return + } + super.onBackPressed() + } + + override fun onPageStarted(url: String, favicon: Bitmap?) { + if (url.startsWith("https://send.firefox.com/fxa/android-redirect.html")) { + // We load this here so the user doesn't see the android-redirect.html page + webView.loadUrl("file:///android_asset/android.html") + + val uri = Uri.parse(url) + uri.getQueryParameter("code")?.let { code -> + uri.getQueryParameter("state")?.let { state -> + mAccount?.completeOAuthFlow(code, state)?.whenComplete { info -> + mAccount?.getProfile(false)?.then { profile -> + val profileJsonPayload = JSONObject() + .put("accessToken", info.accessToken) + .put("keys", info.keys) + .put("avatar", profile.avatar) + .put("displayName", profile.displayName) + .put("email", profile.email) + .put("uid", profile.uid).toString() + mToCall = "finishLogin($profileJsonPayload)" + this@MainActivity.runOnUiThread { + // Clear the history so that the user can't use the back button to see broken pages + // that were inserted into the history by the login process. + webView.clearHistory() + + // We also reload this here because we need to make sure onPageFinished runs after mToCall has been set. + // We can't guarantee that onPageFinished wasn't already called at this point. + webView.loadUrl("file:///android_asset/android.html") + } + FxaResult.fromValue(Unit) + } + } + } + } + } + if (!url.startsWith("file:///android_asset/") && !url.startsWith("https://accounts.firefox.com/")) { + // Don't allow loading anything other than the app in our webview + // It should be possible to do this with shouldOverrideUrlLoading + // but it didn't seem to be working, so this works as a hack. + webView.loadUrl("file:///android_asset/android.html") + Log.d(TAG_MAIN, "BAD URL " + url) + } else { + // Log.d(TAG_MAIN, "onPageStarted " + url) + } + } + + override fun onPageFinished(url: String) { + // Log.d(TAG_MAIN, "onPageFinished") + if (mToShare != null) { + // Log.d(TAG_INTENT, mToShare) + + webView.postWebMessage(WebMessage(mToShare), Uri.EMPTY) + mToShare = null + } + if (mToCall != null) { + this@MainActivity.runOnUiThread { + webView.evaluateJavascript(mToCall) { + mToCall = null + } + } + } + } + + override fun onPageError(errorCode: Int, description: String, failingUrl: String) { + Log.d(TAG_MAIN, "onPageError($errorCode, $description, $failingUrl)") + } + + override fun onDownloadRequested(url: String, + suggestedFilename: String, + mimeType: String, + contentLength: Long, + contentDisposition: String, + userAgent: String) { + // Log.d(TAG_MAIN, "onDownloadRequested") + } + + override fun onExternalPageRequest(url: String) { + // Log.d(TAG_MAIN, "onExternalPageRequest($url)") + } + + companion object { + private const val TAG_MAIN = "MAIN" + private const val TAG_INTENT = "INTENT" + private const val TAG_CONFIG = "CONFIG" + private const val JS_INTERFACE_NAME = "Android" + } +} diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..218e2ce2 --- /dev/null +++ b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..514163b3 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..d2b2ba3f --- /dev/null +++ b/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..7353dbd1 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..7353dbd1 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 00000000..59b62ada Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 00000000..ea8650ff Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 00000000..2e5dcb94 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 00000000..2bfe5555 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 00000000..8bacced7 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 00000000..348c18eb Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 00000000..bce6cd3c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 00000000..dc5be3e8 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000..9e061723 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 00000000..c606d9cb Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..3ab3e9cb --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 00000000..3587ae3a --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #220033 + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..81a068af --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Send + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..0eb88fe3 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 00000000..bae18a8d --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext.kotlin_version = '1.3.21' + ext.android_components_version = '0.26.0' + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.3.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21" + } +} + +allprojects { + repositories { + google() + maven { url "https://maven.mozilla.org/maven2" } + jcenter() + maven { url "https://jitpack.io" } + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 00000000..743d692c --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,13 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..7a3265ee Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..5d0c12e4 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Feb 19 08:34:25 EST 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 00000000..cccdd3d5 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 00000000..e95643d6 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/pages/.eslintrc.yaml b/android/pages/.eslintrc.yaml new file mode 100644 index 00000000..73942709 --- /dev/null +++ b/android/pages/.eslintrc.yaml @@ -0,0 +1,6 @@ +env: + browser: true + +parserOptions: + sourceType: module + diff --git a/android/pages/error.js b/android/pages/error.js new file mode 100644 index 00000000..b85d53a4 --- /dev/null +++ b/android/pages/error.js @@ -0,0 +1,12 @@ +const html = require('choo/html'); + +export default function error(_state, _emit) { + return html` + +
+

Error

+

Sorry, an error occurred.

+
+ + `; +} diff --git a/android/pages/home.js b/android/pages/home.js new file mode 100644 index 00000000..5bc1cc15 --- /dev/null +++ b/android/pages/home.js @@ -0,0 +1,69 @@ +const html = require('choo/html'); +const { list } = require('../../app/utils'); +const archiveTile = require('../../app/ui/archiveTile'); +const modal = require('../../app/ui/modal'); +const intro = require('../../app/ui/intro'); +const assets = require('../../common/assets'); + +module.exports = function(state, emit) { + function onchange(event) { + event.preventDefault(); + const newFiles = Array.from(event.target.files); + + emit('addFiles', { files: newFiles }); + } + + function onclick() { + document.getElementById('file-upload').click(); + } + + const archives = state.storage.files + .filter(archive => !archive.expired) + .map(archive => archiveTile(state, emit, archive)) + .reverse(); + + let content = ''; + let button = html` +
+ +
+ `; + if (state.uploading) { + content = archiveTile.uploading(state, emit); + button = ''; + } else if (state.archive.numFiles > 0) { + content = archiveTile.wip(state, emit); + button = ''; + } else { + content = + archives.length < 1 + ? intro(state) + : list(archives, 'h-full overflow-y-auto w-full', 'mb-3 w-full'); + } + + return html` +
+ ${state.modal && modal(state, emit)} +
+ ${content} +
+
+ ${button} + +
+
+ `; +}; diff --git a/android/pages/preferences.js b/android/pages/preferences.js new file mode 100644 index 00000000..bfc5a5a2 --- /dev/null +++ b/android/pages/preferences.js @@ -0,0 +1,34 @@ +const html = require('choo/html'); + +import { setFileProtocolWssUrl, getFileProtocolWssUrl } from '../../app/api'; + +export default function preferences(state, emit) { + const wssURL = getFileProtocolWssUrl(); + + function updateWssUrl(event) { + state.wssURL = event.target.value; + setFileProtocolWssUrl(state.wssURL); + emit('render'); + } + + function clickDone(event) { + event.preventDefault(); + emit('pushState', '/'); + } + + return html` + +
+
+ done +
+
wss url:
+
+ +
+
+
+
+ + `; +} diff --git a/android/pages/share.js b/android/pages/share.js new file mode 100644 index 00000000..220808cb --- /dev/null +++ b/android/pages/share.js @@ -0,0 +1,51 @@ +const html = require('choo/html'); + +export default function uploadComplete(state, emit) { + const file = state.storage.files[state.storage.files.length - 1]; + function onclick(e) { + e.preventDefault(); + input.select(); + document.execCommand('copy'); + input.selectionEnd = input.selectionStart; + copyText.textContent = 'Copied!'; + setTimeout(function() { + copyText.textContent = 'Copy link'; + }, 2000); + } + + function uploadFile(event) { + event.preventDefault(); + const target = event.target; + const file = target.files[0]; + if (file.size === 0) { + return; + } + + emit('pushState', '/upload'); + emit('addFiles', { files: [file] }); + emit('upload', {}); + } + + const input = html` + + `; + const copyText = html` + Copy link + `; + return html` +
+
+
The card contents will be here.
+
Expires after: exp
+ ${input} + + + +
+`; +} diff --git a/android/pages/upload.js b/android/pages/upload.js new file mode 100644 index 00000000..c98962dd --- /dev/null +++ b/android/pages/upload.js @@ -0,0 +1,26 @@ +const html = require('choo/html'); + +export default function progressBar(state, emit) { + let percent = 0; + if (state.transfer && state.transfer.progress) { + percent = Math.floor(state.transfer.progressRatio * 100); + } + function onclick(e) { + e.preventDefault(); + if (state.uploading) { + emit('cancel'); + } + emit('pushState', '/'); + } + return html` + +
+
+
${percent}%
+ . +
CANCEL
+
+
+ + `; +} diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/android/stores/intents.js b/android/stores/intents.js new file mode 100644 index 00000000..ba757eaa --- /dev/null +++ b/android/stores/intents.js @@ -0,0 +1,20 @@ +/* eslint-disable no-console */ + +export default function intentHandler(state, emitter) { + window.addEventListener( + 'message', + event => { + if (typeof event.data !== 'string' || !event.data.startsWith('data:')) { + return; + } + fetch(event.data) + .then(res => res.blob()) + .then(blob => { + emitter.emit('addFiles', { files: [blob] }); + emitter.emit('upload', {}); + }) + .catch(e => console.error('ERROR ' + e + ' ' + e.stack)); + }, + false + ); +} diff --git a/android/stores/state.js b/android/stores/state.js new file mode 100644 index 00000000..a11058b5 --- /dev/null +++ b/android/stores/state.js @@ -0,0 +1,41 @@ +/* eslint-disable no-console */ + +import User from '../user'; +import storage from '../../app/storage'; + +export default function initialState(state, emitter) { + const files = []; + + Object.assign(state, { + prefix: '/android_asset', + user: new User(storage), + getAsset(name) { + return `${state.prefix}/${name}`; + }, + sentry: { + captureException: e => { + console.error('ERROR ' + e + ' ' + e.stack); + } + }, + storage: { + files, + remove: function(fileId) { + console.log('REMOVE FILEID', fileId); + }, + writeFile: function(file) { + console.log('WRITEFILE', file); + }, + addFile: function(file) { + console.log('addfile' + JSON.stringify(file)); + files.push(file); + emitter.emit('pushState', `/share/${file.id}`); + }, + totalUploads: 0 + }, + transfer: null, + uploading: false, + settingPassword: false, + passwordSetError: null, + route: '/' + }); +} diff --git a/android/user.js b/android/user.js new file mode 100644 index 00000000..f9c056b6 --- /dev/null +++ b/android/user.js @@ -0,0 +1,30 @@ +/* global Android */ +import User from '../app/user'; +import { deriveFileListKey } from '../app/fxa'; + +export default class AndroidUser extends User { + constructor(storage, limits) { + super(storage, limits); + } + + async login() { + Android.beginOAuthFlow(); + } + + startAuthFlow() { + return Promise.resolve(); + } + + async finishLogin(accountInfo) { + const jwks = JSON.parse(accountInfo.keys); + const ikm = jwks['https://identity.mozilla.com/apps/send'].k; + const profile = { + displayName: accountInfo.displayName, + email: accountInfo.email, + avatar: accountInfo.avatar, + access_token: accountInfo.accessToken + }; + profile.fileListKey = await deriveFileListKey(ikm); + this.info = profile; + } +} diff --git a/app/api.js b/app/api.js new file mode 100644 index 00000000..2d1238c2 --- /dev/null +++ b/app/api.js @@ -0,0 +1,432 @@ +import { arrayToB64, b64ToArray, delay } from './utils'; +import { ECE_RECORD_SIZE } from './ece'; + +let fileProtocolWssUrl = null; +try { + fileProtocolWssUrl = localStorage.getItem('wssURL'); +} catch (e) { + // NOOP +} +if (!fileProtocolWssUrl) { + fileProtocolWssUrl = 'wss://send.firefox.com/api/ws'; +} + +export class ConnectionError extends Error { + constructor(cancelled, duration, size) { + super(cancelled ? '0' : 'connection closed'); + this.cancelled = cancelled; + this.duration = duration; + this.size = size; + } +} + +export function setFileProtocolWssUrl(url) { + localStorage && localStorage.setItem('wssURL', url); + fileProtocolWssUrl = url; +} + +export function getFileProtocolWssUrl() { + return fileProtocolWssUrl; +} + +let apiUrlPrefix = ''; +export function getApiUrl(path) { + return apiUrlPrefix + path; +} + +export function setApiUrlPrefix(prefix) { + apiUrlPrefix = prefix; +} + +function post(obj, bearerToken) { + const h = { + 'Content-Type': 'application/json' + }; + if (bearerToken) { + h['Authorization'] = `Bearer ${bearerToken}`; + } + return { + method: 'POST', + headers: new Headers(h), + body: JSON.stringify(obj) + }; +} + +export function parseNonce(header) { + header = header || ''; + return header.split(' ')[1]; +} + +async function fetchWithAuth(url, params, keychain) { + const result = {}; + params = params || {}; + const h = await keychain.authHeader(); + params.headers = new Headers({ + Authorization: h, + 'Content-Type': 'application/json' + }); + const response = await fetch(url, params); + result.response = response; + result.ok = response.ok; + const nonce = parseNonce(response.headers.get('WWW-Authenticate')); + result.shouldRetry = response.status === 401 && nonce !== keychain.nonce; + keychain.nonce = nonce; + return result; +} + +async function fetchWithAuthAndRetry(url, params, keychain) { + const result = await fetchWithAuth(url, params, keychain); + if (result.shouldRetry) { + return fetchWithAuth(url, params, keychain); + } + return result; +} + +export async function del(id, owner_token) { + const response = await fetch( + getApiUrl(`/api/delete/${id}`), + post({ owner_token }) + ); + return response.ok; +} + +export async function setParams(id, owner_token, bearerToken, params) { + const response = await fetch( + getApiUrl(`/api/params/${id}`), + post( + { + owner_token, + dlimit: params.dlimit + }, + bearerToken + ) + ); + return response.ok; +} + +export async function fileInfo(id, owner_token) { + const response = await fetch( + getApiUrl(`/api/info/${id}`), + post({ owner_token }) + ); + + if (response.ok) { + const obj = await response.json(); + return obj; + } + + throw new Error(response.status); +} + +export async function metadata(id, keychain) { + const result = await fetchWithAuthAndRetry( + getApiUrl(`/api/metadata/${id}`), + { method: 'GET' }, + keychain + ); + if (result.ok) { + const data = await result.response.json(); + const meta = await keychain.decryptMetadata(b64ToArray(data.metadata)); + return { + size: meta.size, + ttl: data.ttl, + iv: meta.iv, + name: meta.name, + type: meta.type, + manifest: meta.manifest + }; + } + throw new Error(result.response.status); +} + +export async function setPassword(id, owner_token, keychain) { + const auth = await keychain.authKeyB64(); + const response = await fetch( + getApiUrl(`/api/password/${id}`), + post({ owner_token, auth }) + ); + return response.ok; +} + +function asyncInitWebSocket(server) { + return new Promise((resolve, reject) => { + try { + const ws = new WebSocket(server); + ws.addEventListener('open', () => resolve(ws), { once: true }); + } catch (e) { + reject(new ConnectionError(false)); + } + }); +} + +function listenForResponse(ws, canceller) { + return new Promise((resolve, reject) => { + function handleClose(event) { + // a 'close' event before a 'message' event means the request failed + ws.removeEventListener('message', handleMessage); + reject(new ConnectionError(canceller.cancelled)); + } + function handleMessage(msg) { + ws.removeEventListener('close', handleClose); + try { + const response = JSON.parse(msg.data); + if (response.error) { + throw new Error(response.error); + } else { + resolve(response); + } + } catch (e) { + reject(e); + } + } + ws.addEventListener('message', handleMessage, { once: true }); + ws.addEventListener('close', handleClose, { once: true }); + }); +} + +async function upload( + stream, + metadata, + verifierB64, + timeLimit, + dlimit, + bearerToken, + onprogress, + canceller +) { + let size = 0; + const start = Date.now(); + const host = window.location.hostname; + const port = window.location.port; + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const endpoint = + window.location.protocol === 'file:' + ? fileProtocolWssUrl + : `${protocol}//${host}${port ? ':' : ''}${port}/api/ws`; + + const ws = await asyncInitWebSocket(endpoint); + + try { + const metadataHeader = arrayToB64(new Uint8Array(metadata)); + const fileMeta = { + fileMetadata: metadataHeader, + authorization: `send-v1 ${verifierB64}`, + bearer: bearerToken, + timeLimit, + dlimit + }; + const uploadInfoResponse = listenForResponse(ws, canceller); + ws.send(JSON.stringify(fileMeta)); + const uploadInfo = await uploadInfoResponse; + + const completedResponse = listenForResponse(ws, canceller); + + const reader = stream.getReader(); + let state = await reader.read(); + while (!state.done) { + if (canceller.cancelled) { + ws.close(); + } + if (ws.readyState !== WebSocket.OPEN) { + break; + } + const buf = state.value; + ws.send(buf); + onprogress(size); + size += buf.length; + state = await reader.read(); + while ( + ws.bufferedAmount > ECE_RECORD_SIZE * 2 && + ws.readyState === WebSocket.OPEN && + !canceller.cancelled + ) { + await delay(); + } + } + if (ws.readyState === WebSocket.OPEN) { + ws.send(new Uint8Array([0])); //EOF + } + + await completedResponse; + uploadInfo.duration = Date.now() - start; + return uploadInfo; + } catch (e) { + e.size = size; + e.duration = Date.now() - start; + throw e; + } finally { + if (![WebSocket.CLOSED, WebSocket.CLOSING].includes(ws.readyState)) { + ws.close(); + } + } +} + +export function uploadWs( + encrypted, + metadata, + verifierB64, + timeLimit, + dlimit, + bearerToken, + onprogress +) { + const canceller = { cancelled: false }; + + return { + cancel: function() { + canceller.cancelled = true; + }, + + result: upload( + encrypted, + metadata, + verifierB64, + timeLimit, + dlimit, + bearerToken, + onprogress, + canceller + ) + }; +} + +//////////////////////// + +async function downloadS(id, keychain, signal) { + const auth = await keychain.authHeader(); + + const response = await fetch(getApiUrl(`/api/download/${id}`), { + signal: signal, + method: 'GET', + headers: { Authorization: auth } + }); + + const authHeader = response.headers.get('WWW-Authenticate'); + if (authHeader) { + keychain.nonce = parseNonce(authHeader); + } + + if (response.status !== 200) { + throw new Error(response.status); + } + + return response.body; +} + +async function tryDownloadStream(id, keychain, signal, tries = 2) { + try { + const result = await downloadS(id, keychain, signal); + return result; + } catch (e) { + if (e.message === '401' && --tries > 0) { + return tryDownloadStream(id, keychain, signal, tries); + } + if (e.name === 'AbortError') { + throw new Error('0'); + } + throw e; + } +} + +export function downloadStream(id, keychain) { + const controller = new AbortController(); + function cancel() { + controller.abort(); + } + return { + cancel, + result: tryDownloadStream(id, keychain, controller.signal) + }; +} + +////////////////// + +async function download(id, keychain, onprogress, canceller) { + const auth = await keychain.authHeader(); + const xhr = new XMLHttpRequest(); + canceller.oncancel = function() { + xhr.abort(); + }; + return new Promise(function(resolve, reject) { + xhr.addEventListener('loadend', function() { + canceller.oncancel = function() {}; + const authHeader = xhr.getResponseHeader('WWW-Authenticate'); + if (authHeader) { + keychain.nonce = parseNonce(authHeader); + } + if (xhr.status !== 200) { + return reject(new Error(xhr.status)); + } + + const blob = new Blob([xhr.response]); + resolve(blob); + }); + + xhr.addEventListener('progress', function(event) { + if (event.target.status === 200) { + onprogress(event.loaded); + } + }); + xhr.open('get', getApiUrl(`/api/download/blob/${id}`)); + xhr.setRequestHeader('Authorization', auth); + xhr.responseType = 'blob'; + xhr.send(); + onprogress(0); + }); +} + +async function tryDownload(id, keychain, onprogress, canceller, tries = 2) { + try { + const result = await download(id, keychain, onprogress, canceller); + return result; + } catch (e) { + if (e.message === '401' && --tries > 0) { + return tryDownload(id, keychain, onprogress, canceller, tries); + } + throw e; + } +} + +export function downloadFile(id, keychain, onprogress) { + const canceller = { + oncancel: function() {} // download() sets this + }; + function cancel() { + canceller.oncancel(); + } + return { + cancel, + result: tryDownload(id, keychain, onprogress, canceller) + }; +} + +export async function getFileList(bearerToken, kid) { + const headers = new Headers({ Authorization: `Bearer ${bearerToken}` }); + const response = await fetch(getApiUrl(`/api/filelist/${kid}`), { headers }); + if (response.ok) { + const encrypted = await response.blob(); + return encrypted; + } + throw new Error(response.status); +} + +export async function setFileList(bearerToken, kid, data) { + const headers = new Headers({ Authorization: `Bearer ${bearerToken}` }); + const response = await fetch(getApiUrl(`/api/filelist/${kid}`), { + headers, + method: 'POST', + body: data + }); + return response.ok; +} + +export async function getConstants() { + const response = await fetch(getApiUrl('/config')); + + if (response.ok) { + const obj = await response.json(); + return obj; + } + + throw new Error(response.status); +} diff --git a/app/archive.js b/app/archive.js new file mode 100644 index 00000000..683cc370 --- /dev/null +++ b/app/archive.js @@ -0,0 +1,84 @@ +import { blobStream, concatStream } from './streams'; + +function isDupe(newFile, array) { + for (const file of array) { + if ( + newFile.name === file.name && + newFile.size === file.size && + newFile.lastModified === file.lastModified + ) { + return true; + } + } + return false; +} + +export default class Archive { + constructor(files = [], defaultTimeLimit = 86400, defaultDownloadLimit = 1) { + this.files = Array.from(files); + this.defaultTimeLimit = defaultTimeLimit; + this.defaultDownloadLimit = defaultDownloadLimit; + this.timeLimit = defaultTimeLimit; + this.dlimit = defaultDownloadLimit; + this.password = null; + } + + get name() { + return this.files.length > 1 ? 'Send-Archive.zip' : this.files[0].name; + } + + get type() { + return this.files.length > 1 ? 'send-archive' : this.files[0].type; + } + + get size() { + return this.files.reduce((total, file) => total + file.size, 0); + } + + get numFiles() { + return this.files.length; + } + + get manifest() { + return { + files: this.files.map(file => ({ + name: file.name, + size: file.size, + type: file.type + })) + }; + } + + get stream() { + return concatStream(this.files.map(file => blobStream(file))); + } + + addFiles(files, maxSize, maxFiles) { + if (this.files.length + files.length > maxFiles) { + throw new Error('tooManyFiles'); + } + const newFiles = files.filter( + file => file.size > 0 && !isDupe(file, this.files) + ); + const newSize = newFiles.reduce((total, file) => total + file.size, 0); + if (this.size + newSize > maxSize) { + throw new Error('fileTooBig'); + } + this.files = this.files.concat(newFiles); + return true; + } + + remove(file) { + const index = this.files.indexOf(file); + if (index > -1) { + this.files.splice(index, 1); + } + } + + clear() { + this.files = []; + this.dlimit = this.defaultDownloadLimit; + this.timeLimit = this.defaultTimeLimit; + this.password = null; + } +} diff --git a/app/capabilities.js b/app/capabilities.js new file mode 100644 index 00000000..d43a6b10 --- /dev/null +++ b/app/capabilities.js @@ -0,0 +1,116 @@ +/* global AUTH_CONFIG */ +import { browserName, locale } from './utils'; + +async function checkCrypto() { + try { + const key = await crypto.subtle.generateKey( + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ); + await crypto.subtle.exportKey('raw', key); + await crypto.subtle.encrypt( + { + name: 'AES-GCM', + iv: crypto.getRandomValues(new Uint8Array(12)), + tagLength: 128 + }, + key, + new ArrayBuffer(8) + ); + await crypto.subtle.importKey( + 'raw', + crypto.getRandomValues(new Uint8Array(16)), + 'PBKDF2', + false, + ['deriveKey'] + ); + await crypto.subtle.importKey( + 'raw', + crypto.getRandomValues(new Uint8Array(16)), + 'HKDF', + false, + ['deriveKey'] + ); + await crypto.subtle.generateKey( + { + name: 'ECDH', + namedCurve: 'P-256' + }, + true, + ['deriveBits'] + ); + return true; + } catch (err) { + try { + window.asmCrypto = await import('asmcrypto.js'); + await import('@dannycoates/webcrypto-liner/build/shim'); + return true; + } catch (e) { + return false; + } + } +} + +function checkStreams() { + try { + new ReadableStream({ + pull() {} + }); + return true; + } catch (e) { + return false; + } +} + +async function polyfillStreams() { + try { + await import('@mattiasbuelens/web-streams-polyfill'); + return true; + } catch (e) { + return false; + } +} + +export default async function getCapabilities() { + const browser = browserName(); + const isMobile = /mobi|android/i.test(navigator.userAgent); + const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge'; + let crypto = await checkCrypto(); + const nativeStreams = checkStreams(); + let polyStreams = false; + if (!nativeStreams) { + polyStreams = await polyfillStreams(); + } + let account = typeof AUTH_CONFIG !== 'undefined'; + try { + account = account && !!localStorage; + } catch (e) { + account = false; + } + const share = + isMobile && + typeof navigator.share === 'function' && + locale().startsWith('en'); // en until strings merge + + const standalone = + window.matchMedia('(display-mode: standalone)').matches || + navigator.standalone; + + const mobileFirefox = browser === 'firefox' && isMobile; + + return { + account, + crypto, + serviceWorker, + streamUpload: nativeStreams || polyStreams, + streamDownload: + nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox, + multifile: nativeStreams || polyStreams, + share, + standalone + }; +} diff --git a/app/controller.js b/app/controller.js new file mode 100644 index 00000000..8c6945ac --- /dev/null +++ b/app/controller.js @@ -0,0 +1,309 @@ +import FileReceiver from './fileReceiver'; +import FileSender from './fileSender'; +import copyDialog from './ui/copyDialog'; +import faviconProgressbar from './ui/faviconProgressbar'; +import okDialog from './ui/okDialog'; +import shareDialog from './ui/shareDialog'; +import signupDialog from './ui/signupDialog'; +import surveyDialog from './ui/surveyDialog'; +import { bytes, locale } from './utils'; +import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils'; + +export default function(state, emitter) { + let lastRender = 0; + let updateTitle = false; + + function render() { + emitter.emit('render'); + } + + async function checkFiles() { + const changes = await state.user.syncFileList(); + const rerender = changes.incoming || changes.downloadCount; + if (rerender) { + render(); + } + } + + function updateProgress() { + if (updateTitle) { + emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio)); + } + faviconProgressbar.updateFavicon(state.transfer.progressRatio); + render(); + } + + emitter.on('DOMContentLoaded', () => { + document.addEventListener('blur', () => (updateTitle = true)); + document.addEventListener('focus', () => { + updateTitle = false; + emitter.emit('DOMTitleChange', 'Send'); + faviconProgressbar.updateFavicon(0); + }); + checkFiles(); + }); + + emitter.on('render', () => { + lastRender = Date.now(); + }); + + emitter.on('login', email => { + state.user.login(email); + }); + + emitter.on('logout', async () => { + await state.user.logout(); + emitter.emit('pushState', '/'); + }); + + emitter.on('removeUpload', file => { + state.archive.remove(file); + if (state.archive.numFiles === 0) { + state.archive.clear(); + } + render(); + }); + + emitter.on('delete', async ownedFile => { + try { + state.storage.remove(ownedFile.id); + await ownedFile.del(); + } catch (e) { + state.sentry.captureException(e); + } + render(); + }); + + emitter.on('cancel', () => { + state.transfer.cancel(); + faviconProgressbar.updateFavicon(0); + }); + + emitter.on('addFiles', async ({ files }) => { + if (files.length < 1) { + return; + } + const maxSize = state.user.maxSize; + try { + state.archive.addFiles( + files, + maxSize, + state.LIMITS.MAX_FILES_PER_ARCHIVE + ); + } catch (e) { + state.modal = okDialog( + state.translate(e.message, { + size: bytes(maxSize), + count: state.LIMITS.MAX_FILES_PER_ARCHIVE + }) + ); + } + render(); + }); + + emitter.on('signup-cta', source => { + const query = state.query; + state.user.startAuthFlow(source, { + campaign: query.utm_campaign, + content: query.utm_content, + medium: query.utm_medium, + source: query.utm_source, + term: query.utm_term + }); + state.modal = signupDialog(); + render(); + }); + + emitter.on('authenticate', async (code, oauthState) => { + try { + await state.user.finishLogin(code, oauthState); + await state.user.syncFileList(); + emitter.emit('replaceState', '/'); + } catch (e) { + emitter.emit('replaceState', '/error'); + setTimeout(render); + } + }); + + emitter.on('upload', async () => { + if (state.storage.files.length >= state.LIMITS.MAX_ARCHIVES_PER_USER) { + state.modal = okDialog( + state.translate('tooManyArchives', { + count: state.LIMITS.MAX_ARCHIVES_PER_USER + }) + ); + return render(); + } + const archive = state.archive; + const sender = new FileSender(); + + sender.on('progress', updateProgress); + sender.on('encrypting', render); + sender.on('complete', render); + state.transfer = sender; + state.uploading = true; + render(); + + const links = openLinksInNewTab(); + await delay(200); + try { + const ownedFile = await sender.upload(archive, state.user.bearerToken); + state.storage.totalUploads += 1; + faviconProgressbar.updateFavicon(0); + + state.storage.addFile(ownedFile); + // TODO integrate password into /upload request + if (archive.password) { + emitter.emit('password', { + password: archive.password, + file: ownedFile + }); + } + state.modal = state.capabilities.share + ? shareDialog(ownedFile.name, ownedFile.url) + : copyDialog(ownedFile.name, ownedFile.url); + } catch (err) { + if (err.message === '0') { + //cancelled. do nothing + render(); + } else if (err.message === '401') { + const refreshed = await state.user.refresh(); + if (refreshed) { + return emitter.emit('upload'); + } + emitter.emit('pushState', '/error'); + } else { + // eslint-disable-next-line no-console + console.error(err); + state.sentry.withScope(scope => { + scope.setExtra('duration', err.duration); + scope.setExtra('size', err.size); + state.sentry.captureException(err); + }); + emitter.emit('pushState', '/error'); + } + } finally { + openLinksInNewTab(links, false); + archive.clear(); + state.uploading = false; + state.transfer = null; + await state.user.syncFileList(); + render(); + } + }); + + emitter.on('password', async ({ password, file }) => { + try { + state.settingPassword = true; + render(); + await file.setPassword(password); + state.storage.writeFile(file); + await delay(1000); + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + state.passwordSetError = err; + } finally { + state.settingPassword = false; + } + render(); + }); + + emitter.on('getMetadata', async () => { + const file = state.fileInfo; + + const receiver = new FileReceiver(file); + try { + await receiver.getMetadata(); + state.transfer = receiver; + } catch (e) { + if (e.message === '401' || e.message === '404') { + file.password = null; + if (!file.requiresPassword) { + return emitter.emit('pushState', '/404'); + } + } else { + console.error(e); + return emitter.emit('pushState', '/error'); + } + } + + render(); + }); + + emitter.on('download', async () => { + state.transfer.on('progress', updateProgress); + state.transfer.on('decrypting', render); + state.transfer.on('complete', render); + const links = openLinksInNewTab(); + try { + const dl = state.transfer.download({ + stream: state.capabilities.streamDownload + }); + render(); + await dl; + state.storage.totalDownloads += 1; + faviconProgressbar.updateFavicon(0); + } catch (err) { + if (err.message === '0') { + // download cancelled + state.transfer.reset(); + render(); + } else { + // eslint-disable-next-line no-console + state.transfer = null; + const location = err.message === '404' ? '/404' : '/error'; + if (location === '/error') { + state.sentry.withScope(scope => { + scope.setExtra('duration', err.duration); + scope.setExtra('size', err.size); + scope.setExtra('progress', err.progress); + state.sentry.captureException(err); + }); + } + emitter.emit('pushState', location); + } + } finally { + openLinksInNewTab(links, false); + } + }); + + emitter.on('copy', ({ url }) => { + copyToClipboard(url); + }); + + emitter.on('closeModal', () => { + if ( + state.PREFS.surveyUrl && + ['copy', 'share'].includes(state.modal.type) && + locale().startsWith('en') && + (state.storage.totalUploads > 1 || state.storage.totalDownloads > 0) && + !state.user.surveyed + ) { + state.user.surveyed = true; + state.modal = surveyDialog(); + } else { + state.modal = null; + } + render(); + }); + + setInterval(() => { + // poll for updates of the upload list + if (!state.modal && state.route === '/') { + checkFiles(); + } + }, 2 * 60 * 1000); + + setInterval(() => { + // poll for rerendering the file list countdown timers + if ( + !state.modal && + state.route === '/' && + state.storage.files.length > 0 && + Date.now() - lastRender > 30000 + ) { + render(); + } + }, 60000); +} diff --git a/app/dragManager.js b/app/dragManager.js index a878853a..1379c004 100644 --- a/app/dragManager.js +++ b/app/dragManager.js @@ -6,18 +6,16 @@ export default function(state, emitter) { } }); document.body.addEventListener('drop', event => { - if (state.route === '/' && !state.transfer) { + if ( + state.route === '/' && + !state.uploading && + event.dataTransfer && + event.dataTransfer.files + ) { event.preventDefault(); - document.querySelector('.upload-window').classList.remove('ondrag'); - const target = event.dataTransfer; - if (target.files.length === 0) { - return; - } - if (target.files.length > 1 || target.files[0].size === 0) { - return alert(state.translate('uploadPageMultipleFilesAlert')); - } - const file = target.files[0]; - emitter.emit('upload', { file, type: 'drop' }); + emitter.emit('addFiles', { + files: Array.from(event.dataTransfer.files) + }); } }); }); diff --git a/app/ece.js b/app/ece.js new file mode 100644 index 00000000..4cd6b45e --- /dev/null +++ b/app/ece.js @@ -0,0 +1,310 @@ +import 'buffer'; +import { transformStream } from './streams'; + +const NONCE_LENGTH = 12; +const TAG_LENGTH = 16; +const KEY_LENGTH = 16; +const MODE_ENCRYPT = 'encrypt'; +const MODE_DECRYPT = 'decrypt'; +export const ECE_RECORD_SIZE = 1024 * 64; + +const encoder = new TextEncoder(); + +function generateSalt(len) { + const randSalt = new Uint8Array(len); + crypto.getRandomValues(randSalt); + return randSalt.buffer; +} + +class ECETransformer { + constructor(mode, ikm, rs, salt) { + this.mode = mode; + this.prevChunk; + this.seq = 0; + this.firstchunk = true; + this.rs = rs; + this.ikm = ikm.buffer; + this.salt = salt; + } + + async generateKey() { + const inputKey = await crypto.subtle.importKey( + 'raw', + this.ikm, + 'HKDF', + false, + ['deriveKey'] + ); + + return crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: this.salt, + info: encoder.encode('Content-Encoding: aes128gcm\0'), + hash: 'SHA-256' + }, + inputKey, + { + name: 'AES-GCM', + length: 128 + }, + true, // Edge polyfill requires key to be extractable to encrypt :/ + ['encrypt', 'decrypt'] + ); + } + + async generateNonceBase() { + const inputKey = await crypto.subtle.importKey( + 'raw', + this.ikm, + 'HKDF', + false, + ['deriveKey'] + ); + + const base = await crypto.subtle.exportKey( + 'raw', + await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: this.salt, + info: encoder.encode('Content-Encoding: nonce\0'), + hash: 'SHA-256' + }, + inputKey, + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ) + ); + + return Buffer.from(base.slice(0, NONCE_LENGTH)); + } + + generateNonce(seq) { + if (seq > 0xffffffff) { + throw new Error('record sequence number exceeds limit'); + } + const nonce = Buffer.from(this.nonceBase); + const m = nonce.readUIntBE(nonce.length - 4, 4); + const xor = (m ^ seq) >>> 0; //forces unsigned int xor + nonce.writeUIntBE(xor, nonce.length - 4, 4); + + return nonce; + } + + pad(data, isLast) { + const len = data.length; + if (len + TAG_LENGTH >= this.rs) { + throw new Error('data too large for record size'); + } + + if (isLast) { + const padding = Buffer.alloc(1); + padding.writeUInt8(2, 0); + return Buffer.concat([data, padding]); + } else { + const padding = Buffer.alloc(this.rs - len - TAG_LENGTH); + padding.fill(0); + padding.writeUInt8(1, 0); + return Buffer.concat([data, padding]); + } + } + + unpad(data, isLast) { + for (let i = data.length - 1; i >= 0; i--) { + if (data[i]) { + if (isLast) { + if (data[i] !== 2) { + throw new Error('delimiter of final record is not 2'); + } + } else { + if (data[i] !== 1) { + throw new Error('delimiter of not final record is not 1'); + } + } + return data.slice(0, i); + } + } + throw new Error('no delimiter found'); + } + + createHeader() { + const nums = Buffer.alloc(5); + nums.writeUIntBE(this.rs, 0, 4); + nums.writeUIntBE(0, 4, 1); + return Buffer.concat([Buffer.from(this.salt), nums]); + } + + readHeader(buffer) { + if (buffer.length < 21) { + throw new Error('chunk too small for reading header'); + } + const header = {}; + header.salt = buffer.buffer.slice(0, KEY_LENGTH); + header.rs = buffer.readUIntBE(KEY_LENGTH, 4); + const idlen = buffer.readUInt8(KEY_LENGTH + 4); + header.length = idlen + KEY_LENGTH + 5; + return header; + } + + async encryptRecord(buffer, seq, isLast) { + const nonce = this.generateNonce(seq); + const encrypted = await crypto.subtle.encrypt( + { name: 'AES-GCM', iv: nonce }, + this.key, + this.pad(buffer, isLast) + ); + return Buffer.from(encrypted); + } + + async decryptRecord(buffer, seq, isLast) { + const nonce = this.generateNonce(seq); + const data = await crypto.subtle.decrypt( + { + name: 'AES-GCM', + iv: nonce, + tagLength: 128 + }, + this.key, + buffer + ); + + return this.unpad(Buffer.from(data), isLast); + } + + async start(controller) { + if (this.mode === MODE_ENCRYPT) { + this.key = await this.generateKey(); + this.nonceBase = await this.generateNonceBase(); + controller.enqueue(this.createHeader()); + } else if (this.mode !== MODE_DECRYPT) { + throw new Error('mode must be either encrypt or decrypt'); + } + } + + async transformPrevChunk(isLast, controller) { + if (this.mode === MODE_ENCRYPT) { + controller.enqueue( + await this.encryptRecord(this.prevChunk, this.seq, isLast) + ); + this.seq++; + } else { + if (this.seq === 0) { + //the first chunk during decryption contains only the header + const header = this.readHeader(this.prevChunk); + this.salt = header.salt; + this.rs = header.rs; + this.key = await this.generateKey(); + this.nonceBase = await this.generateNonceBase(); + } else { + controller.enqueue( + await this.decryptRecord(this.prevChunk, this.seq - 1, isLast) + ); + } + this.seq++; + } + } + + async transform(chunk, controller) { + if (!this.firstchunk) { + await this.transformPrevChunk(false, controller); + } + this.firstchunk = false; + this.prevChunk = Buffer.from(chunk.buffer); + } + + async flush(controller) { + //console.log('ece stream ends') + if (this.prevChunk) { + await this.transformPrevChunk(true, controller); + } + } +} + +class StreamSlicer { + constructor(rs, mode) { + this.mode = mode; + this.rs = rs; + this.chunkSize = mode === MODE_ENCRYPT ? rs - 17 : 21; + this.partialChunk = new Uint8Array(this.chunkSize); //where partial chunks are saved + this.offset = 0; + } + + send(buf, controller) { + controller.enqueue(buf); + if (this.chunkSize === 21 && this.mode === MODE_DECRYPT) { + this.chunkSize = this.rs; + } + this.partialChunk = new Uint8Array(this.chunkSize); + this.offset = 0; + } + + //reslice input into record sized chunks + transform(chunk, controller) { + //console.log('Received chunk with %d bytes.', chunk.byteLength) + let i = 0; + + if (this.offset > 0) { + const len = Math.min(chunk.byteLength, this.chunkSize - this.offset); + this.partialChunk.set(chunk.slice(0, len), this.offset); + this.offset += len; + i += len; + + if (this.offset === this.chunkSize) { + this.send(this.partialChunk, controller); + } + } + + while (i < chunk.byteLength) { + const remainingBytes = chunk.byteLength - i; + if (remainingBytes >= this.chunkSize) { + const record = chunk.slice(i, i + this.chunkSize); + i += this.chunkSize; + this.send(record, controller); + } else { + const end = chunk.slice(i, i + remainingBytes); + i += end.byteLength; + this.partialChunk.set(end); + this.offset = end.byteLength; + } + } + } + + flush(controller) { + if (this.offset > 0) { + controller.enqueue(this.partialChunk.slice(0, this.offset)); + } + } +} + +/* +input: a ReadableStream containing data to be transformed +key: Uint8Array containing key of size KEY_LENGTH +rs: int containing record size, optional +salt: ArrayBuffer containing salt of KEY_LENGTH length, optional +*/ +export function encryptStream( + input, + key, + rs = ECE_RECORD_SIZE, + salt = generateSalt(KEY_LENGTH) +) { + const mode = 'encrypt'; + const inputStream = transformStream(input, new StreamSlicer(rs, mode)); + return transformStream(inputStream, new ECETransformer(mode, key, rs, salt)); +} + +/* +input: a ReadableStream containing data to be transformed +key: Uint8Array containing key of size KEY_LENGTH +rs: int containing record size, optional +*/ +export function decryptStream(input, key, rs = ECE_RECORD_SIZE) { + const mode = 'decrypt'; + const inputStream = transformStream(input, new StreamSlicer(rs, mode)); + return transformStream(inputStream, new ECETransformer(mode, key, rs)); +} diff --git a/app/experiments.js b/app/experiments.js index 37bce4e5..8e432e0a 100644 --- a/app/experiments.js +++ b/app/experiments.js @@ -1,25 +1,19 @@ import hash from 'string-hash'; +import Account from './ui/account'; const experiments = { - 'SyI-hI7gT9agiH-f3f0BYg': { - id: 'SyI-hI7gT9agiH-f3f0BYg', - run: function(variant, state, emitter) { - state.promo = variant === 1 ? 'body' : 'header'; - emitter.emit('render'); - }, + signin_button_color: { eligible: function() { - return ( - !/firefox/i.test(navigator.userAgent) && - document.querySelector('html').lang === 'en-US' - ); + return true; }, - variant: function(state) { - return this.luckyNumber(state) > 0.5 ? 1 : 0; + variant: function() { + return ['white-primary', 'primary', 'white-violet', 'violet'][ + Math.floor(Math.random() * 4) + ]; }, - luckyNumber: function(state) { - return luckyNumber( - `${this.id}:${state.storage.get('testpilot_ga__cid')}` - ); + run: function(variant, state) { + const account = state.cache(Account, 'account'); + account.buttonClass = variant; } } }; @@ -47,23 +41,12 @@ export default function initialize(state, emitter) { xp.run(+state.query.v, state, emitter); } }); - - if (!state.storage.get('testpilot_ga__cid')) { - // first ever visit. check again after cid is assigned. - emitter.on('DOMContentLoaded', () => { - checkExperiments(state, emitter); - }); + const enrolled = state.storage.enrolled; + // single experiment per session for now + const id = Object.keys(enrolled)[0]; + if (Object.keys(experiments).includes(id)) { + experiments[id].run(enrolled[id], state, emitter); } else { - const enrolled = state.storage.enrolled.filter(([id, variant]) => { - const xp = experiments[id]; - if (xp) { - xp.run(variant, state, emitter); - } - return !!xp; - }); - // single experiment per session for now - if (enrolled.length === 0) { - checkExperiments(state, emitter); - } + checkExperiments(state, emitter); } } diff --git a/app/fileManager.js b/app/fileManager.js deleted file mode 100644 index 588fd93a..00000000 --- a/app/fileManager.js +++ /dev/null @@ -1,249 +0,0 @@ -/* global EXPIRE_SECONDS */ -import FileSender from './fileSender'; -import FileReceiver from './fileReceiver'; -import { copyToClipboard, delay, fadeOut, percent } from './utils'; -import * as metrics from './metrics'; - -function saveFile(file) { - const dataView = new DataView(file.plaintext); - const blob = new Blob([dataView], { type: file.type }); - const downloadUrl = URL.createObjectURL(blob); - - if (window.navigator.msSaveBlob) { - return window.navigator.msSaveBlob(blob, file.name); - } - const a = document.createElement('a'); - a.href = downloadUrl; - a.download = file.name; - document.body.appendChild(a); - a.click(); - URL.revokeObjectURL(downloadUrl); -} - -function openLinksInNewTab(links, should = true) { - links = links || Array.from(document.querySelectorAll('a:not([target])')); - if (should) { - links.forEach(l => { - l.setAttribute('target', '_blank'); - l.setAttribute('rel', 'noopener noreferrer'); - }); - } else { - links.forEach(l => { - l.removeAttribute('target'); - l.removeAttribute('rel'); - }); - } - return links; -} - -function exists(id) { - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) { - resolve(xhr.status === 200); - } - }; - xhr.onerror = () => resolve(false); - xhr.ontimeout = () => resolve(false); - xhr.open('get', '/api/exists/' + id); - xhr.timeout = 2000; - xhr.send(); - }); -} - -export default function(state, emitter) { - let lastRender = 0; - let updateTitle = false; - - function render() { - emitter.emit('render'); - } - - async function checkFiles() { - const files = state.storage.files; - let rerender = false; - for (const file of files) { - const ok = await exists(file.id); - if (!ok) { - state.storage.remove(file.id); - rerender = true; - } - } - if (rerender) { - render(); - } - } - - function updateProgress() { - if (updateTitle) { - emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio)); - } - render(); - } - - emitter.on('DOMContentLoaded', () => { - document.addEventListener('blur', () => (updateTitle = true)); - document.addEventListener('focus', () => { - updateTitle = false; - emitter.emit('DOMTitleChange', 'Firefox Send'); - }); - checkFiles(); - }); - - emitter.on('navigate', checkFiles); - - emitter.on('render', () => { - lastRender = Date.now(); - }); - - emitter.on('delete', async ({ file, location }) => { - try { - metrics.deletedUpload({ - size: file.size, - time: file.time, - speed: file.speed, - type: file.type, - ttl: file.expiresAt - Date.now(), - location - }); - state.storage.remove(file.id); - await FileSender.delete(file.id, file.deleteToken); - } catch (e) { - state.raven.captureException(e); - } - state.fileInfo = null; - }); - - emitter.on('cancel', () => { - state.transfer.cancel(); - }); - - emitter.on('upload', async ({ file, type }) => { - const size = file.size; - const sender = new FileSender(file); - sender.on('progress', updateProgress); - sender.on('encrypting', render); - state.transfer = sender; - render(); - const links = openLinksInNewTab(); - await delay(200); - try { - const start = Date.now(); - metrics.startedUpload({ size, type }); - const info = await sender.upload(); - const time = Date.now() - start; - const speed = size / (time / 1000); - metrics.completedUpload({ size, time, speed, type }); - document.getElementById('cancel-upload').hidden = 'hidden'; - await delay(1000); - await fadeOut('upload-progress'); - info.name = file.name; - info.size = size; - info.type = type; - info.time = time; - info.speed = speed; - info.createdAt = Date.now(); - info.url = `${info.url}#${info.secretKey}`; - info.expiresAt = Date.now() + EXPIRE_SECONDS * 1000; - state.fileInfo = info; - state.storage.addFile(state.fileInfo); - openLinksInNewTab(links, false); - state.transfer = null; - state.storage.totalUploads += 1; - emitter.emit('pushState', `/share/${info.id}`); - } catch (err) { - console.error(err); - state.transfer = null; - if (err.message === '0') { - //cancelled. do nothing - metrics.cancelledUpload({ size, type }); - return render(); - } - state.raven.captureException(err); - metrics.stoppedUpload({ size, type, err }); - emitter.emit('pushState', '/error'); - } - }); - - emitter.on('password', async ({ password, file }) => { - try { - await FileSender.setPassword(password, file); - metrics.addedPassword({ size: file.size }); - file.password = password; - state.storage.writeFiles(); - } catch (e) { - console.error(e); - } - render(); - }); - - emitter.on('preview', async () => { - const file = state.fileInfo; - const url = `/api/download/${file.id}`; - const receiver = new FileReceiver(url, file); - receiver.on('progress', updateProgress); - receiver.on('decrypting', render); - state.transfer = receiver; - try { - await receiver.getMetadata(file.nonce); - } catch (e) { - if (e.message === '401') { - file.password = null; - if (!file.pwd) { - return emitter.emit('pushState', '/404'); - } - } - } - render(); - }); - - emitter.on('download', async file => { - state.transfer.on('progress', render); - state.transfer.on('decrypting', render); - const links = openLinksInNewTab(); - const size = file.size; - try { - const start = Date.now(); - metrics.startedDownload({ size: file.size, ttl: file.ttl }); - const f = await state.transfer.download(file.nonce); - const time = Date.now() - start; - const speed = size / (time / 1000); - await delay(1000); - await fadeOut('download-progress'); - saveFile(f); - state.storage.totalDownloads += 1; - state.transfer = null; - metrics.completedDownload({ size, time, speed }); - emitter.emit('pushState', '/completed'); - } catch (err) { - console.error(err); - // TODO cancelled download - const location = err.message === 'notfound' ? '/404' : '/error'; - if (location === '/error') { - state.raven.captureException(err); - metrics.stoppedDownload({ size, err }); - } - emitter.emit('pushState', location); - } finally { - state.transfer = null; - openLinksInNewTab(links, false); - } - }); - - emitter.on('copy', ({ url, location }) => { - copyToClipboard(url); - metrics.copiedLink({ location }); - }); - - setInterval(() => { - // poll for rerendering the file list countdown timers - if ( - state.route === '/' && - state.storage.files.length > 0 && - Date.now() - lastRender > 30000 - ) { - render(); - } - }, 60000); -} diff --git a/app/fileReceiver.js b/app/fileReceiver.js index ee0cf5ca..85065429 100644 --- a/app/fileReceiver.js +++ b/app/fileReceiver.js @@ -1,110 +1,29 @@ import Nanobus from 'nanobus'; -import { arrayToB64, b64ToArray, bytes } from './utils'; +import Keychain from './keychain'; +import { delay, bytes, streamToArrayBuffer } from './utils'; +import { downloadFile, metadata, getApiUrl, reportLink } from './api'; +import { blobStream } from './streams'; +import Zip from './zip'; export default class FileReceiver extends Nanobus { - constructor(url, file) { + constructor(fileInfo) { super('FileReceiver'); - this.secretKeyPromise = window.crypto.subtle.importKey( - 'raw', - b64ToArray(file.key), - 'HKDF', - false, - ['deriveKey'] - ); - this.encryptKeyPromise = this.secretKeyPromise.then(sk => { - const encoder = new TextEncoder(); - return window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('encryption'), - hash: 'SHA-256' - }, - sk, - { - name: 'AES-GCM', - length: 128 - }, - false, - ['decrypt'] - ); - }); - if (file.pwd) { - const encoder = new TextEncoder(); - this.authKeyPromise = window.crypto.subtle - .importKey( - 'raw', - encoder.encode(file.password), - { name: 'PBKDF2' }, - false, - ['deriveKey'] - ) - .then(pwdKey => - window.crypto.subtle.deriveKey( - { - name: 'PBKDF2', - salt: encoder.encode(file.url), - iterations: 100, - hash: 'SHA-256' - }, - pwdKey, - { - name: 'HMAC', - hash: 'SHA-256' - }, - true, - ['sign'] - ) - ); - } else { - this.authKeyPromise = this.secretKeyPromise.then(sk => { - const encoder = new TextEncoder(); - return window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('authentication'), - hash: 'SHA-256' - }, - sk, - { - name: 'HMAC', - hash: { name: 'SHA-256' } - }, - false, - ['sign'] - ); - }); + this.keychain = new Keychain(fileInfo.secretKey, fileInfo.nonce); + if (fileInfo.requiresPassword) { + this.keychain.setPassword(fileInfo.password, fileInfo.url); } - this.metaKeyPromise = this.secretKeyPromise.then(sk => { - const encoder = new TextEncoder(); - return window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('metadata'), - hash: 'SHA-256' - }, - sk, - { - name: 'AES-GCM', - length: 128 - }, - false, - ['decrypt'] - ); - }); - this.file = file; - this.url = url; - this.msg = 'fileSizeProgress'; - this.state = 'initialized'; - this.progress = [0, 1]; + this.fileInfo = fileInfo; + this.reset(); } get progressRatio() { return this.progress[0] / this.progress[1]; } + get progressIndefinite() { + return this.state !== 'downloading'; + } + get sizes() { return { partialSize: bytes(this.progress[0]), @@ -113,139 +32,207 @@ export default class FileReceiver extends Nanobus { } cancel() { - // TODO - } - - fetchMetadata(sig) { - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - const nonce = xhr.getResponseHeader('WWW-Authenticate').split(' ')[1]; - this.file.nonce = nonce; - if (xhr.status === 200) { - return resolve(xhr.response); - } - reject(new Error(xhr.status)); - } - }; - xhr.onerror = () => reject(new Error(0)); - xhr.ontimeout = () => reject(new Error(0)); - xhr.open('get', `/api/metadata/${this.file.id}`); - xhr.setRequestHeader('Authorization', `send-v1 ${arrayToB64(sig)}`); - xhr.responseType = 'json'; - xhr.timeout = 2000; - xhr.send(); - }); - } - - async getMetadata(nonce) { - try { - const authKey = await this.authKeyPromise; - const sig = await window.crypto.subtle.sign( - { - name: 'HMAC' - }, - authKey, - b64ToArray(nonce) - ); - const data = await this.fetchMetadata(new Uint8Array(sig)); - const metaKey = await this.metaKeyPromise; - const json = await window.crypto.subtle.decrypt( - { - name: 'AES-GCM', - iv: new Uint8Array(12), - tagLength: 128 - }, - metaKey, - b64ToArray(data.metadata) - ); - const decoder = new TextDecoder(); - const meta = JSON.parse(decoder.decode(json)); - this.file.name = meta.name; - this.file.type = meta.type; - this.file.iv = meta.iv; - this.file.size = data.size; - this.file.ttl = data.ttl; - this.state = 'ready'; - } catch (e) { - this.state = 'invalid'; - throw e; + if (this.downloadRequest) { + this.downloadRequest.cancel(); } } - downloadFile(sig) { + reset() { + this.msg = 'fileSizeProgress'; + this.state = 'initialized'; + this.progress = [0, 1]; + } + + async getMetadata() { + const meta = await metadata(this.fileInfo.id, this.keychain); + this.fileInfo.name = meta.name; + this.fileInfo.type = meta.type; + this.fileInfo.iv = meta.iv; + this.fileInfo.size = +meta.size; + this.fileInfo.manifest = meta.manifest; + this.state = 'ready'; + } + + async reportLink(reason) { + await reportLink(this.fileInfo.id, this.keychain, reason); + } + + sendMessageToSw(msg) { return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); + const channel = new MessageChannel(); - xhr.onprogress = event => { - if (event.lengthComputable && event.target.status !== 404) { - this.progress = [event.loaded, event.total]; - this.emit('progress', this.progress); + channel.port1.onmessage = function(event) { + if (event.data === undefined) { + reject('bad response from serviceWorker'); + } else if (event.data.error !== undefined) { + reject(event.data.error); + } else { + resolve(event.data); } }; - xhr.onload = event => { - if (xhr.status === 404) { - reject(new Error('notfound')); - return; - } - - if (xhr.status !== 200) { - return reject(new Error(xhr.status)); - } - - const blob = new Blob([xhr.response]); - const fileReader = new FileReader(); - fileReader.onload = function() { - resolve(this.result); - }; - - fileReader.readAsArrayBuffer(blob); - }; - - xhr.open('get', this.url); - xhr.setRequestHeader('Authorization', `send-v1 ${arrayToB64(sig)}`); - xhr.responseType = 'blob'; - xhr.send(); + navigator.serviceWorker.controller.postMessage(msg, [channel.port2]); }); } - async download(nonce) { + async downloadBlob(noSave = false) { this.state = 'downloading'; - this.emit('progress', this.progress); + this.downloadRequest = await downloadFile( + this.fileInfo.id, + this.keychain, + p => { + this.progress = [p, this.fileInfo.size]; + this.emit('progress'); + } + ); try { - const encryptKey = await this.encryptKeyPromise; - const authKey = await this.authKeyPromise; - const sig = await window.crypto.subtle.sign( - { - name: 'HMAC' - }, - authKey, - b64ToArray(nonce) - ); - const ciphertext = await this.downloadFile(new Uint8Array(sig)); + const ciphertext = await this.downloadRequest.result; + this.downloadRequest = null; this.msg = 'decryptingFile'; + this.state = 'decrypting'; this.emit('decrypting'); - const plaintext = await window.crypto.subtle.decrypt( - { - name: 'AES-GCM', - iv: b64ToArray(this.file.iv), - tagLength: 128 - }, - encryptKey, - ciphertext - ); + let size = this.fileInfo.size; + let plainStream = this.keychain.decryptStream(blobStream(ciphertext)); + if (this.fileInfo.type === 'send-archive') { + const zip = new Zip(this.fileInfo.manifest, plainStream); + plainStream = zip.stream; + size = zip.size; + } + const plaintext = await streamToArrayBuffer(plainStream, size); + if (!noSave) { + await saveFile({ + plaintext, + name: decodeURIComponent(this.fileInfo.name), + type: this.fileInfo.type + }); + } this.msg = 'downloadFinish'; + this.emit('complete'); this.state = 'complete'; - return { - plaintext, - name: decodeURIComponent(this.file.name), - type: this.file.type - }; } catch (e) { - this.state = 'invalid'; + this.downloadRequest = null; throw e; } } + + async downloadStream(noSave = false) { + const start = Date.now(); + const onprogress = p => { + this.progress = [p, this.fileInfo.size]; + this.emit('progress'); + }; + + this.downloadRequest = { + cancel: () => { + this.sendMessageToSw({ request: 'cancel', id: this.fileInfo.id }); + } + }; + + try { + this.state = 'downloading'; + + const info = { + request: 'init', + id: this.fileInfo.id, + filename: this.fileInfo.name, + type: this.fileInfo.type, + manifest: this.fileInfo.manifest, + key: this.fileInfo.secretKey, + requiresPassword: this.fileInfo.requiresPassword, + password: this.fileInfo.password, + url: this.fileInfo.url, + size: this.fileInfo.size, + nonce: this.keychain.nonce, + noSave + }; + await this.sendMessageToSw(info); + + onprogress(0); + + if (noSave) { + const res = await fetch(getApiUrl(`/api/download/${this.fileInfo.id}`)); + if (res.status !== 200) { + throw new Error(res.status); + } + } else { + const downloadPath = `/api/download/${this.fileInfo.id}`; + let downloadUrl = getApiUrl(downloadPath); + if (downloadUrl === downloadPath) { + downloadUrl = `${location.protocol}//${location.host}${downloadPath}`; + } + const a = document.createElement('a'); + a.href = downloadUrl; + document.body.appendChild(a); + a.click(); + } + + let prog = 0; + let hangs = 0; + while (prog < this.fileInfo.size) { + const msg = await this.sendMessageToSw({ + request: 'progress', + id: this.fileInfo.id + }); + if (msg.progress === prog) { + hangs++; + } else { + hangs = 0; + } + if (hangs > 30) { + // TODO: On Chrome we don't get a cancel + // signal so one is indistinguishable from + // a hang. We may be able to detect + // which end is hung in the service worker + // to improve on this. + const e = new Error('hung download'); + e.duration = Date.now() - start; + e.size = this.fileInfo.size; + e.progress = prog; + throw e; + } + prog = msg.progress; + onprogress(prog); + await delay(1000); + } + + this.downloadRequest = null; + this.msg = 'downloadFinish'; + this.emit('complete'); + this.state = 'complete'; + } catch (e) { + this.downloadRequest = null; + if (e === 'cancelled' || e.message === '400') { + throw new Error(0); + } + throw e; + } + } + + download(options) { + if (options.stream) { + return this.downloadStream(options.noSave); + } + return this.downloadBlob(options.noSave); + } +} + +async function saveFile(file) { + return new Promise(function(resolve, reject) { + const dataView = new DataView(file.plaintext); + const blob = new Blob([dataView], { type: file.type }); + + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, file.name); + return resolve(); + } else { + const downloadUrl = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = downloadUrl; + a.download = file.name; + document.body.appendChild(a); + a.click(); + URL.revokeObjectURL(downloadUrl); + setTimeout(resolve, 100); + } + }); } diff --git a/app/fileSender.js b/app/fileSender.js index d5a00eec..e8bc6bea 100644 --- a/app/fileSender.js +++ b/app/fileSender.js @@ -1,48 +1,27 @@ import Nanobus from 'nanobus'; -import { arrayToB64, b64ToArray, bytes } from './utils'; +import OwnedFile from './ownedFile'; +import Keychain from './keychain'; +import { arrayToB64, bytes } from './utils'; +import { uploadWs } from './api'; +import { encryptedSize } from './utils'; export default class FileSender extends Nanobus { - constructor(file) { + constructor() { super('FileSender'); - this.file = file; - this.msg = 'importingFile'; - this.progress = [0, 1]; - this.cancelled = false; - this.iv = window.crypto.getRandomValues(new Uint8Array(12)); - this.uploadXHR = new XMLHttpRequest(); - this.rawSecret = window.crypto.getRandomValues(new Uint8Array(16)); - this.secretKey = window.crypto.subtle.importKey( - 'raw', - this.rawSecret, - 'HKDF', - false, - ['deriveKey'] - ); - } - - static delete(id, token) { - return new Promise((resolve, reject) => { - if (!id || !token) { - return reject(); - } - const xhr = new XMLHttpRequest(); - xhr.open('POST', `/api/delete/${id}`); - xhr.setRequestHeader('Content-Type', 'application/json'); - - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - resolve(); - } - }; - - xhr.send(JSON.stringify({ delete_token: token })); - }); + this.keychain = new Keychain(); + this.reset(); } get progressRatio() { return this.progress[0] / this.progress[1]; } + get progressIndefinite() { + return ( + ['fileSizeProgress', 'notifyUploadEncryptDone'].indexOf(this.msg) === -1 + ); + } + get sizes() { return { partialSize: bytes(this.progress[0]), @@ -50,242 +29,78 @@ export default class FileSender extends Nanobus { }; } + reset() { + this.uploadRequest = null; + this.msg = 'importingFile'; + this.progress = [0, 1]; + this.cancelled = false; + } + cancel() { this.cancelled = true; - if (this.msg === 'fileSizeProgress') { - this.uploadXHR.abort(); + if (this.uploadRequest) { + this.uploadRequest.cancel(); } } - readFile() { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsArrayBuffer(this.file); - reader.onload = function(event) { - const plaintext = new Uint8Array(this.result); - resolve(plaintext); - }; - reader.onerror = function(err) { - reject(err); - }; - }); - } - - uploadFile(encrypted, metadata, rawAuth) { - return new Promise((resolve, reject) => { - const dataView = new DataView(encrypted); - const blob = new Blob([dataView], { type: 'application/octet-stream' }); - const fd = new FormData(); - fd.append('data', blob); - - const xhr = this.uploadXHR; - - xhr.upload.addEventListener('progress', e => { - if (e.lengthComputable) { - this.progress = [e.loaded, e.total]; - this.emit('progress', this.progress); - } - }); - - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - if (xhr.status === 200) { - const nonce = xhr - .getResponseHeader('WWW-Authenticate') - .split(' ')[1]; - this.progress = [1, 1]; - this.msg = 'notifyUploadDone'; - const responseObj = JSON.parse(xhr.responseText); - return resolve({ - url: responseObj.url, - id: responseObj.id, - secretKey: arrayToB64(this.rawSecret), - deleteToken: responseObj.delete, - nonce - }); - } - this.msg = 'errorPageHeader'; - reject(new Error(xhr.status)); - } - }; - - xhr.open('post', '/api/upload', true); - xhr.setRequestHeader( - 'X-File-Metadata', - arrayToB64(new Uint8Array(metadata)) - ); - xhr.setRequestHeader('Authorization', `send-v1 ${arrayToB64(rawAuth)}`); - xhr.send(fd); - this.msg = 'fileSizeProgress'; - }); - } - - async upload() { - const encoder = new TextEncoder(); - const secretKey = await this.secretKey; - const encryptKey = await window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('encryption'), - hash: 'SHA-256' - }, - secretKey, - { - name: 'AES-GCM', - length: 128 - }, - false, - ['encrypt'] - ); - const authKey = await window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('authentication'), - hash: 'SHA-256' - }, - secretKey, - { - name: 'HMAC', - hash: 'SHA-256' - }, - true, - ['sign'] - ); - const metaKey = await window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('metadata'), - hash: 'SHA-256' - }, - secretKey, - { - name: 'AES-GCM', - length: 128 - }, - false, - ['encrypt'] - ); - const plaintext = await this.readFile(); + async upload(archive, bearerToken) { if (this.cancelled) { throw new Error(0); } this.msg = 'encryptingFile'; this.emit('encrypting'); - const encrypted = await window.crypto.subtle.encrypt( - { - name: 'AES-GCM', - iv: this.iv, - tagLength: 128 - }, - encryptKey, - plaintext + const totalSize = encryptedSize(archive.size); + const encStream = await this.keychain.encryptStream(archive.stream); + const metadata = await this.keychain.encryptMetadata(archive); + const authKeyB64 = await this.keychain.authKeyB64(); + + this.uploadRequest = uploadWs( + encStream, + metadata, + authKeyB64, + archive.timeLimit, + archive.dlimit, + bearerToken, + p => { + this.progress = [p, totalSize]; + this.emit('progress'); + } ); - const metadata = await window.crypto.subtle.encrypt( - { - name: 'AES-GCM', - iv: new Uint8Array(12), - tagLength: 128 - }, - metaKey, - encoder.encode( - JSON.stringify({ - iv: arrayToB64(this.iv), - name: this.file.name, - type: this.file.type || 'application/octet-stream' - }) - ) - ); - const rawAuth = await window.crypto.subtle.exportKey('raw', authKey); + if (this.cancelled) { throw new Error(0); } - return this.uploadFile(encrypted, metadata, new Uint8Array(rawAuth)); - } - static async setPassword(password, file) { - const encoder = new TextEncoder(); - const secretKey = await window.crypto.subtle.importKey( - 'raw', - b64ToArray(file.secretKey), - 'HKDF', - false, - ['deriveKey'] - ); - const authKey = await window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('authentication'), - hash: 'SHA-256' - }, - secretKey, - { - name: 'HMAC', - hash: 'SHA-256' - }, - true, - ['sign'] - ); - const sig = await window.crypto.subtle.sign( - { - name: 'HMAC' - }, - authKey, - b64ToArray(file.nonce) - ); - const pwdKey = await window.crypto.subtle.importKey( - 'raw', - encoder.encode(password), - { name: 'PBKDF2' }, - false, - ['deriveKey'] - ); - const newAuthKey = await window.crypto.subtle.deriveKey( - { - name: 'PBKDF2', - salt: encoder.encode(file.url), - iterations: 100, - hash: 'SHA-256' - }, - pwdKey, - { - name: 'HMAC', - hash: 'SHA-256' - }, - true, - ['sign'] - ); - const rawAuth = await window.crypto.subtle.exportKey('raw', newAuthKey); - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - if (xhr.status === 200) { - return resolve(xhr.response); - } - if (xhr.status === 401) { - const nonce = xhr - .getResponseHeader('WWW-Authenticate') - .split(' ')[1]; - file.nonce = nonce; - } - reject(new Error(xhr.status)); - } - }; - xhr.onerror = () => reject(new Error(0)); - xhr.ontimeout = () => reject(new Error(0)); - xhr.open('post', `/api/password/${file.id}`); - xhr.setRequestHeader( - 'Authorization', - `send-v1 ${arrayToB64(new Uint8Array(sig))}` - ); - xhr.setRequestHeader('Content-Type', 'application/json'); - xhr.responseType = 'json'; - xhr.timeout = 2000; - xhr.send(JSON.stringify({ auth: arrayToB64(new Uint8Array(rawAuth)) })); - }); + this.msg = 'fileSizeProgress'; + this.emit('progress'); // HACK to kick MS Edge + try { + const result = await this.uploadRequest.result; + this.msg = 'notifyUploadEncryptDone'; + this.uploadRequest = null; + this.progress = [1, 1]; + const secretKey = arrayToB64(this.keychain.rawSecret); + const ownedFile = new OwnedFile({ + id: result.id, + url: `${result.url}#${secretKey}`, + name: archive.name, + size: archive.size, + manifest: archive.manifest, + time: result.duration, + speed: archive.size / (result.duration / 1000), + createdAt: Date.now(), + expiresAt: Date.now() + archive.timeLimit * 1000, + secretKey: secretKey, + nonce: this.keychain.nonce, + ownerToken: result.ownerToken, + dlimit: archive.dlimit, + timeLimit: archive.timeLimit + }); + + return ownedFile; + } catch (e) { + this.msg = 'errorPageHeader'; + this.uploadRequest = null; + throw e; + } } } diff --git a/app/fxa.js b/app/fxa.js new file mode 100644 index 00000000..7827d33e --- /dev/null +++ b/app/fxa.js @@ -0,0 +1,181 @@ +/* global AUTH_CONFIG */ +import { arrayToB64, b64ToArray } from './utils'; + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +function getOtherInfo(enc) { + const name = encoder.encode(enc); + const length = 256; + const buffer = new ArrayBuffer(name.length + 16); + const dv = new DataView(buffer); + const result = new Uint8Array(buffer); + let i = 0; + dv.setUint32(i, name.length); + i += 4; + result.set(name, i); + i += name.length; + dv.setUint32(i, 0); + i += 4; + dv.setUint32(i, 0); + i += 4; + dv.setUint32(i, length); + return result; +} + +function concat(b1, b2) { + const result = new Uint8Array(b1.length + b2.length); + result.set(b1, 0); + result.set(b2, b1.length); + return result; +} + +async function concatKdf(key, enc) { + if (key.length !== 32) { + throw new Error('unsupported key length'); + } + const otherInfo = getOtherInfo(enc); + const buffer = new ArrayBuffer(4 + key.length + otherInfo.length); + const dv = new DataView(buffer); + const concat = new Uint8Array(buffer); + dv.setUint32(0, 1); + concat.set(key, 4); + concat.set(otherInfo, key.length + 4); + const result = await crypto.subtle.digest('SHA-256', concat); + return new Uint8Array(result); +} + +export async function prepareScopedBundleKey(storage) { + const keys = await crypto.subtle.generateKey( + { + name: 'ECDH', + namedCurve: 'P-256' + }, + true, + ['deriveBits'] + ); + const privateJwk = await crypto.subtle.exportKey('jwk', keys.privateKey); + const publicJwk = await crypto.subtle.exportKey('jwk', keys.publicKey); + const kid = await crypto.subtle.digest( + 'SHA-256', + encoder.encode(JSON.stringify(publicJwk)) + ); + privateJwk.kid = kid; + publicJwk.kid = kid; + storage.set('scopedBundlePrivateKey', JSON.stringify(privateJwk)); + return arrayToB64(encoder.encode(JSON.stringify(publicJwk))); +} + +export async function decryptBundle(storage, bundle) { + const privateJwk = JSON.parse(storage.get('scopedBundlePrivateKey')); + storage.remove('scopedBundlePrivateKey'); + const privateKey = await crypto.subtle.importKey( + 'jwk', + privateJwk, + { + name: 'ECDH', + namedCurve: 'P-256' + }, + false, + ['deriveBits'] + ); + const jweParts = bundle.split('.'); + if (jweParts.length !== 5) { + throw new Error('invalid jwe'); + } + const header = JSON.parse(decoder.decode(b64ToArray(jweParts[0]))); + const additionalData = encoder.encode(jweParts[0]); + const iv = b64ToArray(jweParts[2]); + const ciphertext = b64ToArray(jweParts[3]); + const tag = b64ToArray(jweParts[4]); + + if (header.alg !== 'ECDH-ES' || header.enc !== 'A256GCM') { + throw new Error('unsupported jwe type'); + } + + const publicKey = await crypto.subtle.importKey( + 'jwk', + header.epk, + { + name: 'ECDH', + namedCurve: 'P-256' + }, + false, + [] + ); + const sharedBits = await crypto.subtle.deriveBits( + { + name: 'ECDH', + public: publicKey + }, + privateKey, + 256 + ); + + const rawSharedKey = await concatKdf(new Uint8Array(sharedBits), header.enc); + const sharedKey = await crypto.subtle.importKey( + 'raw', + rawSharedKey, + { + name: 'AES-GCM' + }, + false, + ['decrypt'] + ); + + const plaintext = await crypto.subtle.decrypt( + { + name: 'AES-GCM', + iv: iv, + additionalData: additionalData, + tagLength: tag.length * 8 + }, + sharedKey, + concat(ciphertext, tag) + ); + + return JSON.parse(decoder.decode(plaintext)); +} + +export async function preparePkce(storage) { + const verifier = arrayToB64(crypto.getRandomValues(new Uint8Array(64))); + storage.set('pkceVerifier', verifier); + const challenge = await crypto.subtle.digest( + 'SHA-256', + encoder.encode(verifier) + ); + return arrayToB64(new Uint8Array(challenge)); +} + +export async function deriveFileListKey(ikm) { + const baseKey = await crypto.subtle.importKey( + 'raw', + b64ToArray(ikm), + { name: 'HKDF' }, + false, + ['deriveKey'] + ); + const fileListKey = await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('fileList'), + hash: 'SHA-256' + }, + baseKey, + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ); + const rawFileListKey = await crypto.subtle.exportKey('raw', fileListKey); + return arrayToB64(new Uint8Array(rawFileListKey)); +} + +export async function getFileListKey(storage, bundle) { + const jwks = await decryptBundle(storage, bundle); + const jwk = jwks[AUTH_CONFIG.key_scope]; + return deriveFileListKey(jwk.k); +} diff --git a/app/keychain.js b/app/keychain.js new file mode 100644 index 00000000..37951aa7 --- /dev/null +++ b/app/keychain.js @@ -0,0 +1,164 @@ +import { arrayToB64, b64ToArray } from './utils'; +import { decryptStream, encryptStream } from './ece.js'; +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +export default class Keychain { + constructor(secretKeyB64, nonce) { + this._nonce = nonce || 'yRCdyQ1EMSA3mo4rqSkuNQ=='; + if (secretKeyB64) { + this.rawSecret = b64ToArray(secretKeyB64); + } else { + this.rawSecret = crypto.getRandomValues(new Uint8Array(16)); + } + this.secretKeyPromise = crypto.subtle.importKey( + 'raw', + this.rawSecret, + 'HKDF', + false, + ['deriveKey'] + ); + this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) { + return crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('metadata'), + hash: 'SHA-256' + }, + secretKey, + { + name: 'AES-GCM', + length: 128 + }, + false, + ['encrypt', 'decrypt'] + ); + }); + this.authKeyPromise = this.secretKeyPromise.then(function(secretKey) { + return crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('authentication'), + hash: 'SHA-256' + }, + secretKey, + { + name: 'HMAC', + hash: { name: 'SHA-256' } + }, + true, + ['sign'] + ); + }); + } + + get nonce() { + return this._nonce; + } + + set nonce(n) { + if (n && n !== this._nonce) { + this._nonce = n; + } + } + + setPassword(password, shareUrl) { + this.authKeyPromise = crypto.subtle + .importKey('raw', encoder.encode(password), { name: 'PBKDF2' }, false, [ + 'deriveKey' + ]) + .then(passwordKey => + crypto.subtle.deriveKey( + { + name: 'PBKDF2', + salt: encoder.encode(shareUrl), + iterations: 100, + hash: 'SHA-256' + }, + passwordKey, + { + name: 'HMAC', + hash: 'SHA-256' + }, + true, + ['sign'] + ) + ); + } + + setAuthKey(authKeyB64) { + this.authKeyPromise = crypto.subtle.importKey( + 'raw', + b64ToArray(authKeyB64), + { + name: 'HMAC', + hash: 'SHA-256' + }, + true, + ['sign'] + ); + } + + async authKeyB64() { + const authKey = await this.authKeyPromise; + const rawAuth = await crypto.subtle.exportKey('raw', authKey); + return arrayToB64(new Uint8Array(rawAuth)); + } + + async authHeader() { + const authKey = await this.authKeyPromise; + const sig = await crypto.subtle.sign( + { + name: 'HMAC' + }, + authKey, + b64ToArray(this.nonce) + ); + return `send-v1 ${arrayToB64(new Uint8Array(sig))}`; + } + + async encryptMetadata(metadata) { + const metaKey = await this.metaKeyPromise; + const ciphertext = await crypto.subtle.encrypt( + { + name: 'AES-GCM', + iv: new Uint8Array(12), + tagLength: 128 + }, + metaKey, + encoder.encode( + JSON.stringify({ + name: metadata.name, + size: metadata.size, + type: metadata.type || 'application/octet-stream', + manifest: metadata.manifest || {} + }) + ) + ); + return ciphertext; + } + + encryptStream(plainStream) { + return encryptStream(plainStream, this.rawSecret); + } + + decryptStream(cryptotext) { + return decryptStream(cryptotext, this.rawSecret); + } + + async decryptMetadata(ciphertext) { + const metaKey = await this.metaKeyPromise; + const plaintext = await crypto.subtle.decrypt( + { + name: 'AES-GCM', + iv: new Uint8Array(12), + tagLength: 128 + }, + metaKey, + ciphertext + ); + return JSON.parse(decoder.decode(plaintext)); + } +} diff --git a/app/locale.js b/app/locale.js new file mode 100644 index 00000000..23dfdb7c --- /dev/null +++ b/app/locale.js @@ -0,0 +1,26 @@ +import { FluentBundle, FluentResource } from '@fluent/bundle'; + +function makeBundle(locale, ftl) { + const bundle = new FluentBundle(locale, { useIsolating: false }); + bundle.addResource(new FluentResource(ftl)); + return bundle; +} + +export async function getTranslator(locale) { + const bundles = []; + const { default: en } = await import('../public/locales/en-US/send.ftl'); + if (locale !== 'en-US') { + const { default: ftl } = await import( + `../public/locales/${locale}/send.ftl` + ); + bundles.push(makeBundle(locale, ftl)); + } + bundles.push(makeBundle('en-US', en)); + return function(id, data) { + for (let bundle of bundles) { + if (bundle.hasMessage(id)) { + return bundle.formatPattern(bundle.getMessage(id).value, data); + } + } + }; +} diff --git a/app/main.css b/app/main.css new file mode 100644 index 00000000..6a42290e --- /dev/null +++ b/app/main.css @@ -0,0 +1,412 @@ +@tailwind base; + +html { + line-height: 1.15; +} + +@tailwind components; + +:not(input) { + user-select: none; +} + +:root { + --violet-gradient: linear-gradient( + -180deg, + rgb(144 89 255 / 80%) 0%, + rgb(144 89 255 / 40%) 100% + ); +} + +a { + color: inherit; + text-decoration: none; +} + +a:focus { + outline: 1px dotted grey; +} + +body { + background-image: url('../assets/bg.svg'); + background-position: center; + background-repeat: no-repeat; + background-size: cover; + overflow-x: hidden; +} + +.btn { + @apply bg-primary; + @apply text-white; + @apply cursor-pointer; + @apply py-4; + @apply px-6; + @apply font-semibold; +} + +.btn:hover { + @apply bg-primary_accent; +} + +.btn:focus { + @apply bg-primary_accent; +} + +.checkbox { + @apply leading-normal; + @apply select-none; +} + +.checkbox > input[type='checkbox'] { + @apply absolute; + @apply opacity-0; +} + +.checkbox > label { + @apply cursor-pointer; +} + +.checkbox > label::before { + /* @apply bg-grey-10; */ + @apply border-default; + @apply rounded-sm; + + content: ''; + height: 1.5rem; + width: 1.5rem; + margin-right: 0.5rem; + float: left; +} + +.checkbox > label:hover::before { + @apply border-primary; +} + +.checkbox > input:focus + label::before { + @apply border-primary; +} + +.checkbox > input:checked + label::before { + @apply bg-primary; + @apply border-primary; + + background-image: url('../assets/lock.svg'); + background-position: center; + background-size: 1.25rem; + background-repeat: no-repeat; +} + +.checkbox > input:disabled + label { + cursor: auto; +} + +.checkbox > input:disabled + label::before { + @apply bg-primary; + @apply border-primary; + + background-image: url('../assets/lock.svg'); + background-position: center; + background-size: 1.25rem; + background-repeat: no-repeat; + cursor: auto; +} + +details { + overflow: hidden; +} + +details > summary::marker { + display: none; +} + +details > summary > svg { + transition: all 0.25s cubic-bezier(0.07, 0.95, 0, 1); +} + +details[open] { + overflow-y: auto; +} + +details[open] > summary > svg { + transform: rotate(90deg); +} + +footer li a:hover { + text-decoration: underline; +} + +.feedback-link { + background-color: #000; + background-image: url('../assets/feedback.svg'); + background-position: 0.125rem 0.25rem; + background-repeat: no-repeat; + background-size: 1.125rem; + color: #fff; + display: block; + font-size: 0.75rem; + line-height: 0.75rem; + padding: 0.375rem 0.375rem 0.375rem 1.25rem; + text-indent: 0.125rem; + white-space: nowrap; +} + +.link-primary { + @apply text-primary; +} + +.link-primary:hover { + @apply text-primary_accent; +} + +.link-primary:focus { + @apply text-primary_accent; +} + +.main-header img { + height: 32px; + width: auto; +} + +.text-underline { + text-decoration: underline; +} + +.d-block { + display: block; +} + +.d-inline-block { + display: inline-block; +} + +.align-middle { + vertical-align: middle; +} + +.main { + display: flex; + position: relative; + max-width: 64rem; + width: 100%; +} + +.main > section { + @apply bg-white; +} + +#password-msg::after { + content: '\200b'; +} + +progress { + @apply bg-grey-30; + @apply rounded-sm; + @apply w-full; + @apply h-1; +} + +progress::-webkit-progress-bar { + @apply bg-grey-30; + @apply rounded-sm; + @apply w-full; + @apply h-1; +} + +progress::-webkit-progress-value { + /* stylelint-disable */ + background-image: -webkit-linear-gradient( + -45deg, + transparent 20%, + rgb(255 255 255 / 40%) 20%, + rgb(255 255 255 / 40%) 40%, + transparent 40%, + transparent 60%, + rgb(255 255 255 / 40%) 60%, + rgb(255 255 255 / 40%) 80%, + transparent 80% + ), + -webkit-linear-gradient(left, var(--color-primary), var(--color-primary)); + /* stylelint-enable */ + border-radius: 2px; + background-size: 21px 20px, 100% 100%, 100% 100%; +} + +progress::-moz-progress-bar { + /* stylelint-disable */ + background-image: -moz-linear-gradient( + 135deg, + transparent 20%, + rgb(255 255 255 / 40%) 20%, + rgb(255 255 255 / 40%) 40%, + transparent 40%, + transparent 60%, + rgb(255 255 255 / 40%) 60%, + rgb(255 255 255 / 40%) 80%, + transparent 80% + ), + -moz-linear-gradient(left, var(--color-primary), var(--color-primary)); + /* stylelint-enable */ + border-radius: 2px; + background-size: 21px 20px, 100% 100%, 100% 100%; + animation: animate-stripes 1s linear infinite; +} + +@keyframes animate-stripes { + 100% { + background-position: -21px 0; + } +} + +select { + background-image: url('../assets/select-arrow.svg'); + background-position: calc(100% - 0.75rem); + background-repeat: no-repeat; +} + +@screen md { + .main-header img { + height: 48px; + width: auto; + } + + .main { + @apply flex-1; + @apply self-center; + @apply items-center; + @apply m-auto; + @apply py-8; + + max-height: 42rem; + width: calc(100% - 3rem); + } +} + +@screen dark { + body { + @apply text-grey-10; + + background-image: unset; + } + + .btn { + @apply bg-primary; + @apply text-white; + } + + .btn:hover { + @apply bg-primary_accent; + } + + .btn:focus { + @apply bg-primary_accent; + } + + .link-primary { + @apply text-primary; + } + + .link-primary:hover { + @apply text-primary_accent; + } + + .link-primary:focus { + @apply text-primary_accent; + } + + .main > section { + @apply bg-grey-90; + } + + @screen md { + .main > section { + @apply border-default; + @apply border-grey-80; + } + } +} + +@tailwind utilities; + +@responsive { + .shadow-light { + box-shadow: 0 0 8px 0 rgb(12 12 13 / 10%); + } + + .shadow-big { + box-shadow: 0 12px 18px 2px rgb(34 0 51 / 4%), + 0 6px 22px 4px rgb(7 48 114 / 12%), 0 6px 10px -4px rgb(14 13 26 / 12%); + } +} + +@variants focus { + .outline { + outline: 1px dotted grey; + } +} + +.word-break-all { + word-break: break-all; + line-break: anywhere; +} + +.signin { + backface-visibility: hidden; + border-radius: 6px; + transition-property: transform, background-color; + transition-duration: 250ms; + transition-timing-function: cubic-bezier(0.07, 0.95, 0, 1); +} + +.signin:hover, +.signin:focus { + transform: scale(1.0625); +} + +.signin:hover:active { + transform: scale(0.9375); +} + +/* begin signin button color experiment */ + +.white-primary { + @apply border-primary; + @apply border-2; + @apply text-primary; +} + +.white-primary:hover, +.white-primary:focus { + @apply bg-primary; + @apply text-white; +} + +.primary { + @apply bg-primary; + @apply text-white; +} + +.white-violet { + @apply border-violet; + @apply border-2; + @apply text-violet; +} + +.white-violet:hover, +.white-violet:focus { + @apply bg-violet; + @apply text-white; + + background-image: var(--violet-gradient); +} + +.violet { + @apply bg-violet; + @apply text-white; +} + +.violet:hover, +.violet:focus { + background-image: var(--violet-gradient); +} + +/* end signin button color experiment */ diff --git a/app/main.js b/app/main.js index 2c55e0ed..c6a89dce 100644 --- a/app/main.js +++ b/app/main.js @@ -1,50 +1,74 @@ -import app from './routes'; -import locale from '../common/locales'; -import fileManager from './fileManager'; +/* global DEFAULTS LIMITS WEB_UI PREFS */ +import 'core-js'; +import 'fast-text-encoding'; // MS Edge support +import 'intl-pluralrules'; +import choo from 'choo'; +import nanotiming from 'nanotiming'; +import routes from './routes'; +import getCapabilities from './capabilities'; +import controller from './controller'; import dragManager from './dragManager'; -import { canHasSend } from './utils'; -import assets from '../common/assets'; +import pasteManager from './pasteManager'; import storage from './storage'; -import metrics from './metrics'; import experiments from './experiments'; -import Raven from 'raven-js'; +import * as Sentry from '@sentry/browser'; +import './main.css'; +import User from './user'; +import { getTranslator } from './locale'; +import Archive from './archive'; +import { setTranslate, locale } from './utils'; -if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) { - Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install(); +if (navigator.doNotTrack !== '1' && window.SENTRY_CONFIG) { + Sentry.init(window.SENTRY_CONFIG); } -app.use((state, emitter) => { - // init state - state.transfer = null; - state.fileInfo = null; - state.translate = locale.getTranslator(); - state.storage = storage; - state.raven = Raven; - emitter.on('DOMContentLoaded', async () => { - let reason = null; - if ( - /firefox/i.test(navigator.userAgent) && - parseInt(navigator.userAgent.match(/firefox\/*([^\n\r]*)\./i)[1], 10) <= - 49 - ) { - reason = 'outdated'; - } - if (/edge\/\d+/i.test(navigator.userAgent)) { - reason = 'edge'; - } - const ok = await canHasSend(assets.get('cryptofill.js')); - if (!ok) { - reason = /firefox/i.test(navigator.userAgent) ? 'outdated' : 'gcm'; - } - if (reason) { - setTimeout(() => emitter.emit('replaceState', `/unsupported/${reason}`)); - } - }); -}); +if (process.env.NODE_ENV === 'production') { + nanotiming.disabled = true; +} -app.use(metrics); -app.use(fileManager); -app.use(dragManager); -app.use(experiments); +(async function start() { + const capabilities = await getCapabilities(); + if ( + !capabilities.crypto && + window.location.pathname !== '/unsupported/crypto' + ) { + return window.location.assign('/unsupported/crypto'); + } + if (capabilities.serviceWorker) { + try { + await navigator.serviceWorker.register('/serviceWorker.js'); + await navigator.serviceWorker.ready; + } catch (e) { + // continue but disable streaming downloads + capabilities.streamDownload = false; + } + } -app.mount('body'); + const translate = await getTranslator(locale()); + setTranslate(translate); + // eslint-disable-next-line require-atomic-updates + window.initialState = { + LIMITS, + DEFAULTS, + WEB_UI, + PREFS, + archive: new Archive([], DEFAULTS.EXPIRE_SECONDS, DEFAULTS.DOWNLOADS), + capabilities, + translate, + storage, + sentry: Sentry, + user: new User(storage, LIMITS, window.AUTH_CONFIG), + transfer: null, + fileInfo: null, + locale: locale() + }; + + const app = routes(choo({ hash: true })); + // eslint-disable-next-line require-atomic-updates + window.app = app; + app.use(experiments); + app.use(controller); + app.use(dragManager); + app.use(pasteManager); + app.mount('body'); +})(); diff --git a/app/metrics.js b/app/metrics.js deleted file mode 100644 index 3f3adf4e..00000000 --- a/app/metrics.js +++ /dev/null @@ -1,283 +0,0 @@ -import testPilotGA from 'testpilot-ga/src/TestPilotGA'; -import storage from './storage'; - -let hasLocalStorage = false; -try { - hasLocalStorage = typeof localStorage !== 'undefined'; -} catch (e) { - // when disabled, any mention of localStorage throws an error -} - -const analytics = new testPilotGA({ - an: 'Firefox Send', - ds: 'web', - tid: window.GOOGLE_ANALYTICS_ID -}); - -let appState = null; -let experiment = null; - -export default function initialize(state, emitter) { - appState = state; - emitter.on('DOMContentLoaded', () => { - // addExitHandlers(); - experiment = storage.enrolled[0]; - sendEvent(category(), 'visit', { - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads - }); - //TODO restart handlers... somewhere - }); - emitter.on('exit', evt => { - exitEvent(evt); - }); -} - -function category() { - switch (appState.route) { - case '/': - case '/share/:id': - return 'sender'; - case '/download/:id/:key': - case '/download/:id': - case '/completed': - return 'recipient'; - default: - return 'other'; - } -} - -function sendEvent() { - const args = Array.from(arguments); - if (experiment && args[2]) { - args[2].xid = experiment[0]; - args[2].xvar = experiment[1]; - } - return ( - hasLocalStorage && analytics.sendEvent.apply(analytics, args).catch(() => 0) - ); -} - -function urlToMetric(url) { - switch (url) { - case 'https://www.mozilla.org/': - return 'mozilla'; - case 'https://www.mozilla.org/about/legal': - return 'legal'; - case 'https://testpilot.firefox.com/about': - return 'about'; - case 'https://testpilot.firefox.com/privacy': - return 'privacy'; - case 'https://testpilot.firefox.com/terms': - return 'terms'; - case 'https://www.mozilla.org/privacy/websites/#cookies': - return 'cookies'; - case 'https://github.com/mozilla/send': - return 'github'; - case 'https://twitter.com/FxTestPilot': - return 'twitter'; - case 'https://www.mozilla.org/firefox/new/?scene=2': - return 'download-firefox'; - case 'https://qsurvey.mozilla.com/s3/txp-firefox-send': - return 'survey'; - case 'https://testpilot.firefox.com/': - case 'https://testpilot.firefox.com/experiments/send': - return 'testpilot'; - case 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com': - return 'promo'; - default: - return 'other'; - } -} - -function setReferrer(state) { - if (category() === 'sender') { - if (state) { - storage.referrer = `${state}-upload`; - } - } else if (category() === 'recipient') { - if (state) { - storage.referrer = `${state}-download`; - } - } -} - -function externalReferrer() { - if (/^https:\/\/testpilot\.firefox\.com/.test(document.referrer)) { - return 'testpilot'; - } - return 'external'; -} - -function takeReferrer() { - const referrer = storage.referrer || externalReferrer(); - storage.referrer = null; - return referrer; -} - -function startedUpload(params) { - return sendEvent('sender', 'upload-started', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length + 1, - cm7: storage.totalDownloads, - cd1: params.type, - cd5: takeReferrer() - }); -} - -function cancelledUpload(params) { - setReferrer('cancelled'); - return sendEvent('sender', 'upload-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd2: 'cancelled' - }); -} - -function completedUpload(params) { - return sendEvent('sender', 'upload-stopped', { - cm1: params.size, - cm2: params.time, - cm3: params.speed, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd2: 'completed' - }); -} - -function addedPassword(params) { - return sendEvent('sender', 'password-added', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads - }); -} - -function startedDownload(params) { - return sendEvent('recipient', 'download-started', { - cm1: params.size, - cm4: params.ttl, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads - }); -} - -function stoppedDownload(params) { - return sendEvent('recipient', 'download-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd2: 'errored', - cd6: params.err - }); -} - -function cancelledDownload(params) { - setReferrer('cancelled'); - return sendEvent('recipient', 'download-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd2: 'cancelled' - }); -} - -function stoppedUpload(params) { - return sendEvent('sender', 'upload-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd2: 'errored', - cd6: params.err - }); -} - -function completedDownload(params) { - return sendEvent('recipient', 'download-stopped', { - cm1: params.size, - cm2: params.time, - cm3: params.speed, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd2: 'completed' - }); -} - -function deletedUpload(params) { - return sendEvent(category(), 'upload-deleted', { - cm1: params.size, - cm2: params.time, - cm3: params.speed, - cm4: params.ttl, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd4: params.location - }); -} - -function unsupported(params) { - return sendEvent(category(), 'unsupported', { - cd6: params.err - }); -} - -function copiedLink(params) { - return sendEvent('sender', 'copied', { - cd4: params.location - }); -} - -function exitEvent(target) { - return sendEvent(category(), 'exited', { - cd3: urlToMetric(target.currentTarget.href) - }); -} - -// eslint-disable-next-line no-unused-vars -function addExitHandlers() { - const links = Array.from(document.querySelectorAll('a')); - links.forEach(l => { - if (/^http/.test(l.getAttribute('href'))) { - l.addEventListener('click', exitEvent); - } - }); -} - -function restart(state) { - setReferrer(state); - return sendEvent(category(), 'restarted', { - cd2: state - }); -} - -export { - copiedLink, - startedUpload, - cancelledUpload, - stoppedUpload, - completedUpload, - deletedUpload, - startedDownload, - cancelledDownload, - stoppedDownload, - completedDownload, - addedPassword, - restart, - unsupported -}; diff --git a/app/ownedFile.js b/app/ownedFile.js new file mode 100644 index 00000000..04b497d1 --- /dev/null +++ b/app/ownedFile.js @@ -0,0 +1,96 @@ +import Keychain from './keychain'; +import { arrayToB64 } from './utils'; +import { del, fileInfo, setParams, setPassword } from './api'; + +export default class OwnedFile { + constructor(obj) { + if (!obj.manifest) { + throw new Error('invalid file object'); + } + this.id = obj.id; + this.url = obj.url; + this.name = obj.name; + this.size = obj.size; + this.manifest = obj.manifest; + this.time = obj.time; + this.speed = obj.speed; + this.createdAt = obj.createdAt; + this.expiresAt = obj.expiresAt; + this.ownerToken = obj.ownerToken; + this.dlimit = obj.dlimit || 1; + this.dtotal = obj.dtotal || 0; + this.keychain = new Keychain(obj.secretKey, obj.nonce); + this._hasPassword = !!obj.hasPassword; + this.timeLimit = obj.timeLimit; + } + + get hasPassword() { + return !!this._hasPassword; + } + + get expired() { + return this.dlimit === this.dtotal || Date.now() > this.expiresAt; + } + + async setPassword(password) { + try { + this.password = password; + this._hasPassword = true; + this.keychain.setPassword(password, this.url); + const result = await setPassword(this.id, this.ownerToken, this.keychain); + return result; + } catch (e) { + this.password = null; + this._hasPassword = false; + throw e; + } + } + + del() { + return del(this.id, this.ownerToken); + } + + changeLimit(dlimit, user = {}) { + if (this.dlimit !== dlimit) { + this.dlimit = dlimit; + return setParams(this.id, this.ownerToken, user.bearerToken, { dlimit }); + } + return Promise.resolve(true); + } + + async updateDownloadCount() { + const oldTotal = this.dtotal; + const oldLimit = this.dlimit; + try { + const result = await fileInfo(this.id, this.ownerToken); + this.dtotal = result.dtotal; + this.dlimit = result.dlimit; + } catch (e) { + if (e.message === '404') { + this.dtotal = this.dlimit; + } + // ignore other errors + } + return oldTotal !== this.dtotal || oldLimit !== this.dlimit; + } + + toJSON() { + return { + id: this.id, + url: this.url, + name: this.name, + size: this.size, + manifest: this.manifest, + time: this.time, + speed: this.speed, + createdAt: this.createdAt, + expiresAt: this.expiresAt, + secretKey: arrayToB64(this.keychain.rawSecret), + ownerToken: this.ownerToken, + dlimit: this.dlimit, + dtotal: this.dtotal, + hasPassword: this.hasPassword, + timeLimit: this.timeLimit + }; + } +} diff --git a/app/pasteManager.js b/app/pasteManager.js new file mode 100644 index 00000000..c35c7f82 --- /dev/null +++ b/app/pasteManager.js @@ -0,0 +1,36 @@ +function getString(item) { + return new Promise(resolve => { + item.getAsString(resolve); + }); +} + +export default function(state, emitter) { + window.addEventListener('paste', async event => { + if (state.route !== '/' || state.uploading) return; + if (['password', 'text', 'email'].includes(event.target.type)) return; + + const items = Array.from(event.clipboardData.items); + const transferFiles = items.filter(item => item.kind === 'file'); + const strings = items.filter(item => item.kind === 'string'); + if (transferFiles.length) { + const promises = transferFiles.map(async (f, i) => { + const blob = f.getAsFile(); + if (!blob) { + return null; + } + const name = await getString(strings[i]); + const file = new File([blob], name, { type: blob.type }); + return file; + }); + const files = (await Promise.all(promises)).filter(f => !!f); + if (files.length) { + emitter.emit('addFiles', { files }); + } + } else if (strings.length) { + strings[0].getAsString(s => { + const file = new File([s], 'pasted.txt', { type: 'text/plain' }); + emitter.emit('addFiles', { files: [file] }); + }); + } + }); +} diff --git a/app/qrcode.js b/app/qrcode.js new file mode 100644 index 00000000..5d960df3 --- /dev/null +++ b/app/qrcode.js @@ -0,0 +1,2345 @@ +//--------------------------------------------------------------------- +// +// QR Code Generator for JavaScript +// +// Copyright (c) 2009 Kazuhiko Arase +// +// URL: http://www.d-project.com/ +// +// Licensed under the MIT license: +// http://www.opensource.org/licenses/mit-license.php +// +// The word 'QR Code' is registered trademark of +// DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/faqpatent-e.html +// +//--------------------------------------------------------------------- + +var qrcode = (function() { + //--------------------------------------------------------------------- + // qrcode + //--------------------------------------------------------------------- + + /** + * qrcode + * @param typeNumber 1 to 40 + * @param errorCorrectionLevel 'L','M','Q','H' + */ + var qrcode = function(typeNumber, errorCorrectionLevel) { + var PAD0 = 0xec; + var PAD1 = 0x11; + + var _typeNumber = typeNumber; + var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel]; + var _modules = null; + var _moduleCount = 0; + var _dataCache = null; + var _dataList = []; + + var _this = {}; + + var makeImpl = function(test, maskPattern) { + _moduleCount = _typeNumber * 4 + 17; + _modules = (function(moduleCount) { + var modules = new Array(moduleCount); + for (var row = 0; row < moduleCount; row += 1) { + modules[row] = new Array(moduleCount); + for (var col = 0; col < moduleCount; col += 1) { + modules[row][col] = null; + } + } + return modules; + })(_moduleCount); + + setupPositionProbePattern(0, 0); + setupPositionProbePattern(_moduleCount - 7, 0); + setupPositionProbePattern(0, _moduleCount - 7); + setupPositionAdjustPattern(); + setupTimingPattern(); + setupTypeInfo(test, maskPattern); + + if (_typeNumber >= 7) { + setupTypeNumber(test); + } + + if (_dataCache == null) { + _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList); + } + + mapData(_dataCache, maskPattern); + }; + + var setupPositionProbePattern = function(row, col) { + for (var r = -1; r <= 7; r += 1) { + if (row + r <= -1 || _moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c += 1) { + if (col + c <= -1 || _moduleCount <= col + c) continue; + + if ( + (0 <= r && r <= 6 && (c == 0 || c == 6)) || + (0 <= c && c <= 6 && (r == 0 || r == 6)) || + (2 <= r && r <= 4 && 2 <= c && c <= 4) + ) { + _modules[row + r][col + c] = true; + } else { + _modules[row + r][col + c] = false; + } + } + } + }; + + var getBestMaskPattern = function() { + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i += 1) { + makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(_this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }; + + var setupTimingPattern = function() { + for (var r = 8; r < _moduleCount - 8; r += 1) { + if (_modules[r][6] != null) { + continue; + } + _modules[r][6] = r % 2 == 0; + } + + for (var c = 8; c < _moduleCount - 8; c += 1) { + if (_modules[6][c] != null) { + continue; + } + _modules[6][c] = c % 2 == 0; + } + }; + + var setupPositionAdjustPattern = function() { + var pos = QRUtil.getPatternPosition(_typeNumber); + + for (var i = 0; i < pos.length; i += 1) { + for (var j = 0; j < pos.length; j += 1) { + var row = pos[i]; + var col = pos[j]; + + if (_modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r += 1) { + for (var c = -2; c <= 2; c += 1) { + if ( + r == -2 || + r == 2 || + c == -2 || + c == 2 || + (r == 0 && c == 0) + ) { + _modules[row + r][col + c] = true; + } else { + _modules[row + r][col + c] = false; + } + } + } + } + } + }; + + var setupTypeNumber = function(test) { + var bits = QRUtil.getBCHTypeNumber(_typeNumber); + + for (var i = 0; i < 18; i += 1) { + var mod = !test && ((bits >> i) & 1) == 1; + _modules[Math.floor(i / 3)][(i % 3) + _moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i += 1) { + var mod = !test && ((bits >> i) & 1) == 1; + _modules[(i % 3) + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }; + + var setupTypeInfo = function(test, maskPattern) { + var data = (_errorCorrectionLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i += 1) { + var mod = !test && ((bits >> i) & 1) == 1; + + if (i < 6) { + _modules[i][8] = mod; + } else if (i < 8) { + _modules[i + 1][8] = mod; + } else { + _modules[_moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i += 1) { + var mod = !test && ((bits >> i) & 1) == 1; + + if (i < 8) { + _modules[8][_moduleCount - i - 1] = mod; + } else if (i < 9) { + _modules[8][15 - i - 1 + 1] = mod; + } else { + _modules[8][15 - i - 1] = mod; + } + } + + // fixed module + _modules[_moduleCount - 8][8] = !test; + }; + + var mapData = function(data, maskPattern) { + var inc = -1; + var row = _moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + var maskFunc = QRUtil.getMaskFunction(maskPattern); + + for (var col = _moduleCount - 1; col > 0; col -= 2) { + if (col == 6) col -= 1; + + while (true) { + for (var c = 0; c < 2; c += 1) { + if (_modules[row][col - c] == null) { + var dark = false; + + if (byteIndex < data.length) { + dark = ((data[byteIndex] >>> bitIndex) & 1) == 1; + } + + var mask = maskFunc(row, col - c); + + if (mask) { + dark = !dark; + } + + _modules[row][col - c] = dark; + bitIndex -= 1; + + if (bitIndex == -1) { + byteIndex += 1; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || _moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + }; + + var createBytes = function(buffer, rsBlocks) { + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r += 1) { + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i += 1) { + dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i += 1) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = modIndex >= 0 ? modPoly.getAt(modIndex) : 0; + } + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i += 1) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i += 1) { + for (var r = 0; r < rsBlocks.length; r += 1) { + if (i < dcdata[r].length) { + data[index] = dcdata[r][i]; + index += 1; + } + } + } + + for (var i = 0; i < maxEcCount; i += 1) { + for (var r = 0; r < rsBlocks.length; r += 1) { + if (i < ecdata[r].length) { + data[index] = ecdata[r][i]; + index += 1; + } + } + } + + return data; + }; + + var createData = function(typeNumber, errorCorrectionLevel, dataList) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel); + + var buffer = qrBitBuffer(); + + for (var i = 0; i < dataList.length; i += 1) { + var data = dataList[i]; + buffer.put(data.getMode(), 4); + buffer.put( + data.getLength(), + QRUtil.getLengthInBits(data.getMode(), typeNumber) + ); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i += 1) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw 'code length overflow. (' + + buffer.getLengthInBits() + + '>' + + totalDataCount * 8 + + ')'; + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(PAD1, 8); + } + + return createBytes(buffer, rsBlocks); + }; + + _this.addData = function(data, mode) { + mode = mode || 'Byte'; + + var newData = null; + + switch (mode) { + case 'Numeric': + newData = qrNumber(data); + break; + case 'Alphanumeric': + newData = qrAlphaNum(data); + break; + case 'Byte': + newData = qr8BitByte(data); + break; + case 'Kanji': + newData = qrKanji(data); + break; + default: + throw 'mode:' + mode; + } + + _dataList.push(newData); + _dataCache = null; + }; + + _this.isDark = function(row, col) { + if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) { + throw row + ',' + col; + } + return _modules[row][col]; + }; + + _this.getModuleCount = function() { + return _moduleCount; + }; + + _this.make = function() { + if (_typeNumber < 1) { + var typeNumber = 1; + + for (; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks( + typeNumber, + _errorCorrectionLevel + ); + var buffer = qrBitBuffer(); + + for (var i = 0; i < _dataList.length; i++) { + var data = _dataList[i]; + buffer.put(data.getMode(), 4); + buffer.put( + data.getLength(), + QRUtil.getLengthInBits(data.getMode(), typeNumber) + ); + data.write(buffer); + } + + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() <= totalDataCount * 8) { + break; + } + } + + _typeNumber = typeNumber; + } + + makeImpl(false, getBestMaskPattern()); + }; + + _this.createTableTag = function(cellSize, margin) { + cellSize = cellSize || 2; + margin = typeof margin == 'undefined' ? cellSize * 4 : margin; + + var qrHtml = ''; + + qrHtml += ''; + qrHtml += ''; + + for (var r = 0; r < _this.getModuleCount(); r += 1) { + qrHtml += ''; + + for (var c = 0; c < _this.getModuleCount(); c += 1) { + qrHtml += ''; + } + + qrHtml += ''; + qrHtml += '
'; + } + + qrHtml += '
'; + + return qrHtml; + }; + + _this.createSvgTag = function(cellSize, margin, alt, title) { + var opts = {}; + if (typeof arguments[0] == 'object') { + // Called by options. + opts = arguments[0]; + // overwrite cellSize and margin. + cellSize = opts.cellSize; + margin = opts.margin; + alt = opts.alt; + title = opts.title; + } + + cellSize = cellSize || 2; + margin = typeof margin == 'undefined' ? cellSize * 4 : margin; + + // Compose alt property surrogate + alt = typeof alt === 'string' ? { text: alt } : alt || {}; + alt.text = alt.text || null; + alt.id = alt.text ? alt.id || 'qrcode-description' : null; + + // Compose title property surrogate + title = typeof title === 'string' ? { text: title } : title || {}; + title.text = title.text || null; + title.id = title.text ? title.id || 'qrcode-title' : null; + + var size = _this.getModuleCount() * cellSize + margin * 2; + var c, + mc, + r, + mr, + qrSvg = '', + rect; + + rect = + 'l' + + cellSize + + ',0 0,' + + cellSize + + ' -' + + cellSize + + ',0 0,-' + + cellSize + + 'z '; + + qrSvg += '' + + escapeXml(title.text) + + '' + : ''; + qrSvg += alt.text + ? '' + + escapeXml(alt.text) + + '' + : ''; + qrSvg += ''; + qrSvg += ''; + qrSvg += ''; + + return qrSvg; + }; + + _this.createDataURL = function(cellSize, margin) { + cellSize = cellSize || 2; + margin = typeof margin == 'undefined' ? cellSize * 4 : margin; + + var size = _this.getModuleCount() * cellSize + margin * 2; + var min = margin; + var max = size - margin; + + return createDataURL(size, size, function(x, y) { + if (min <= x && x < max && min <= y && y < max) { + var c = Math.floor((x - min) / cellSize); + var r = Math.floor((y - min) / cellSize); + return _this.isDark(r, c) ? 0 : 1; + } else { + return 1; + } + }); + }; + + _this.createImgTag = function(cellSize, margin, alt) { + cellSize = cellSize || 2; + margin = typeof margin == 'undefined' ? cellSize * 4 : margin; + + var size = _this.getModuleCount() * cellSize + margin * 2; + + var img = ''; + img += '': + escaped += '>'; + break; + case '&': + escaped += '&'; + break; + case '"': + escaped += '"'; + break; + default: + escaped += c; + break; + } + } + return escaped; + }; + + var _createHalfASCII = function(margin) { + var cellSize = 1; + margin = typeof margin == 'undefined' ? cellSize * 2 : margin; + + var size = _this.getModuleCount() * cellSize + margin * 2; + var min = margin; + var max = size - margin; + + var y, x, r1, r2, p; + + var blocks = { + '██': '█', + '█ ': '▀', + ' █': '▄', + ' ': ' ' + }; + + var blocksLastLineNoMargin = { + '██': '▀', + '█ ': '▀', + ' █': ' ', + ' ': ' ' + }; + + var ascii = ''; + for (y = 0; y < size; y += 2) { + r1 = Math.floor((y - min) / cellSize); + r2 = Math.floor((y + 1 - min) / cellSize); + for (x = 0; x < size; x += 1) { + p = '█'; + + if ( + min <= x && + x < max && + min <= y && + y < max && + _this.isDark(r1, Math.floor((x - min) / cellSize)) + ) { + p = ' '; + } + + if ( + min <= x && + x < max && + min <= y + 1 && + y + 1 < max && + _this.isDark(r2, Math.floor((x - min) / cellSize)) + ) { + p += ' '; + } else { + p += '█'; + } + + // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square. + ascii += + margin < 1 && y + 1 >= max ? blocksLastLineNoMargin[p] : blocks[p]; + } + + ascii += '\n'; + } + + if (size % 2 && margin > 0) { + return ( + ascii.substring(0, ascii.length - size - 1) + + Array(size + 1).join('▀') + ); + } + + return ascii.substring(0, ascii.length - 1); + }; + + _this.createASCII = function(cellSize, margin) { + cellSize = cellSize || 1; + + if (cellSize < 2) { + return _createHalfASCII(margin); + } + + cellSize -= 1; + margin = typeof margin == 'undefined' ? cellSize * 2 : margin; + + var size = _this.getModuleCount() * cellSize + margin * 2; + var min = margin; + var max = size - margin; + + var y, x, r, p; + + var white = Array(cellSize + 1).join('██'); + var black = Array(cellSize + 1).join(' '); + + var ascii = ''; + var line = ''; + for (y = 0; y < size; y += 1) { + r = Math.floor((y - min) / cellSize); + line = ''; + for (x = 0; x < size; x += 1) { + p = 1; + + if ( + min <= x && + x < max && + min <= y && + y < max && + _this.isDark(r, Math.floor((x - min) / cellSize)) + ) { + p = 0; + } + + // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square. + line += p ? white : black; + } + + for (r = 0; r < cellSize; r += 1) { + ascii += line + '\n'; + } + } + + return ascii.substring(0, ascii.length - 1); + }; + + _this.renderTo2dContext = function(context, cellSize) { + cellSize = cellSize || 2; + var length = _this.getModuleCount(); + for (var row = 0; row < length; row++) { + for (var col = 0; col < length; col++) { + context.fillStyle = _this.isDark(row, col) ? 'black' : 'white'; + context.fillRect(row * cellSize, col * cellSize, cellSize, cellSize); + } + } + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // qrcode.stringToBytes + //--------------------------------------------------------------------- + + qrcode.stringToBytesFuncs = { + default: function(s) { + var bytes = []; + for (var i = 0; i < s.length; i += 1) { + var c = s.charCodeAt(i); + bytes.push(c & 0xff); + } + return bytes; + } + }; + + qrcode.stringToBytes = qrcode.stringToBytesFuncs['default']; + + //--------------------------------------------------------------------- + // qrcode.createStringToBytes + //--------------------------------------------------------------------- + + /** + * @param unicodeData base64 string of byte array. + * [16bit Unicode],[16bit Bytes], ... + * @param numChars + */ + qrcode.createStringToBytes = function(unicodeData, numChars) { + // create conversion map. + + var unicodeMap = (function() { + var bin = base64DecodeInputStream(unicodeData); + var read = function() { + var b = bin.read(); + if (b == -1) throw 'eof'; + return b; + }; + + var count = 0; + var unicodeMap = {}; + while (true) { + var b0 = bin.read(); + if (b0 == -1) break; + var b1 = read(); + var b2 = read(); + var b3 = read(); + var k = String.fromCharCode((b0 << 8) | b1); + var v = (b2 << 8) | b3; + unicodeMap[k] = v; + count += 1; + } + if (count != numChars) { + throw count + ' != ' + numChars; + } + + return unicodeMap; + })(); + + var unknownChar = '?'.charCodeAt(0); + + return function(s) { + var bytes = []; + for (var i = 0; i < s.length; i += 1) { + var c = s.charCodeAt(i); + if (c < 128) { + bytes.push(c); + } else { + var b = unicodeMap[s.charAt(i)]; + if (typeof b == 'number') { + if ((b & 0xff) == b) { + // 1byte + bytes.push(b); + } else { + // 2bytes + bytes.push(b >>> 8); + bytes.push(b & 0xff); + } + } else { + bytes.push(unknownChar); + } + } + } + return bytes; + }; + }; + + //--------------------------------------------------------------------- + // QRMode + //--------------------------------------------------------------------- + + var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3 + }; + + //--------------------------------------------------------------------- + // QRErrorCorrectionLevel + //--------------------------------------------------------------------- + + var QRErrorCorrectionLevel = { + L: 1, + M: 0, + Q: 3, + H: 2 + }; + + //--------------------------------------------------------------------- + // QRMaskPattern + //--------------------------------------------------------------------- + + var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7 + }; + + //--------------------------------------------------------------------- + // QRUtil + //--------------------------------------------------------------------- + + var QRUtil = (function() { + var PATTERN_POSITION_TABLE = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ]; + var G15 = + (1 << 10) | + (1 << 8) | + (1 << 5) | + (1 << 4) | + (1 << 2) | + (1 << 1) | + (1 << 0); + var G18 = + (1 << 12) | + (1 << 11) | + (1 << 10) | + (1 << 9) | + (1 << 8) | + (1 << 5) | + (1 << 2) | + (1 << 0); + var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1); + + var _this = {}; + + var getBCHDigit = function(data) { + var digit = 0; + while (data != 0) { + digit += 1; + data >>>= 1; + } + return digit; + }; + + _this.getBCHTypeInfo = function(data) { + var d = data << 10; + while (getBCHDigit(d) - getBCHDigit(G15) >= 0) { + d ^= G15 << (getBCHDigit(d) - getBCHDigit(G15)); + } + return ((data << 10) | d) ^ G15_MASK; + }; + + _this.getBCHTypeNumber = function(data) { + var d = data << 12; + while (getBCHDigit(d) - getBCHDigit(G18) >= 0) { + d ^= G18 << (getBCHDigit(d) - getBCHDigit(G18)); + } + return (data << 12) | d; + }; + + _this.getPatternPosition = function(typeNumber) { + return PATTERN_POSITION_TABLE[typeNumber - 1]; + }; + + _this.getMaskFunction = function(maskPattern) { + switch (maskPattern) { + case QRMaskPattern.PATTERN000: + return function(i, j) { + return (i + j) % 2 == 0; + }; + case QRMaskPattern.PATTERN001: + return function(i, j) { + return i % 2 == 0; + }; + case QRMaskPattern.PATTERN010: + return function(i, j) { + return j % 3 == 0; + }; + case QRMaskPattern.PATTERN011: + return function(i, j) { + return (i + j) % 3 == 0; + }; + case QRMaskPattern.PATTERN100: + return function(i, j) { + return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; + }; + case QRMaskPattern.PATTERN101: + return function(i, j) { + return ((i * j) % 2) + ((i * j) % 3) == 0; + }; + case QRMaskPattern.PATTERN110: + return function(i, j) { + return (((i * j) % 2) + ((i * j) % 3)) % 2 == 0; + }; + case QRMaskPattern.PATTERN111: + return function(i, j) { + return (((i * j) % 3) + ((i + j) % 2)) % 2 == 0; + }; + + default: + throw 'bad maskPattern:' + maskPattern; + } + }; + + _this.getErrorCorrectPolynomial = function(errorCorrectLength) { + var a = qrPolynomial([1], 0); + for (var i = 0; i < errorCorrectLength; i += 1) { + a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0)); + } + return a; + }; + + _this.getLengthInBits = function(mode, type) { + if (1 <= type && type < 10) { + // 1 - 9 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 10; + case QRMode.MODE_ALPHA_NUM: + return 9; + case QRMode.MODE_8BIT_BYTE: + return 8; + case QRMode.MODE_KANJI: + return 8; + default: + throw 'mode:' + mode; + } + } else if (type < 27) { + // 10 - 26 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 12; + case QRMode.MODE_ALPHA_NUM: + return 11; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 10; + default: + throw 'mode:' + mode; + } + } else if (type < 41) { + // 27 - 40 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 14; + case QRMode.MODE_ALPHA_NUM: + return 13; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 12; + default: + throw 'mode:' + mode; + } + } else { + throw 'type:' + type; + } + }; + + _this.getLostPoint = function(qrcode) { + var moduleCount = qrcode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row += 1) { + for (var col = 0; col < moduleCount; col += 1) { + var sameCount = 0; + var dark = qrcode.isDark(row, col); + + for (var r = -1; r <= 1; r += 1) { + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c += 1) { + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrcode.isDark(row + r, col + c)) { + sameCount += 1; + } + } + } + + if (sameCount > 5) { + lostPoint += 3 + sameCount - 5; + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row += 1) { + for (var col = 0; col < moduleCount - 1; col += 1) { + var count = 0; + if (qrcode.isDark(row, col)) count += 1; + if (qrcode.isDark(row + 1, col)) count += 1; + if (qrcode.isDark(row, col + 1)) count += 1; + if (qrcode.isDark(row + 1, col + 1)) count += 1; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row += 1) { + for (var col = 0; col < moduleCount - 6; col += 1) { + if ( + qrcode.isDark(row, col) && + !qrcode.isDark(row, col + 1) && + qrcode.isDark(row, col + 2) && + qrcode.isDark(row, col + 3) && + qrcode.isDark(row, col + 4) && + !qrcode.isDark(row, col + 5) && + qrcode.isDark(row, col + 6) + ) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col += 1) { + for (var row = 0; row < moduleCount - 6; row += 1) { + if ( + qrcode.isDark(row, col) && + !qrcode.isDark(row + 1, col) && + qrcode.isDark(row + 2, col) && + qrcode.isDark(row + 3, col) && + qrcode.isDark(row + 4, col) && + !qrcode.isDark(row + 5, col) && + qrcode.isDark(row + 6, col) + ) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col += 1) { + for (var row = 0; row < moduleCount; row += 1) { + if (qrcode.isDark(row, col)) { + darkCount += 1; + } + } + } + + var ratio = + Math.abs((100 * darkCount) / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + }; + + return _this; + })(); + + //--------------------------------------------------------------------- + // QRMath + //--------------------------------------------------------------------- + + var QRMath = (function() { + var EXP_TABLE = new Array(256); + var LOG_TABLE = new Array(256); + + // initialize tables + for (var i = 0; i < 8; i += 1) { + EXP_TABLE[i] = 1 << i; + } + for (var i = 8; i < 256; i += 1) { + EXP_TABLE[i] = + EXP_TABLE[i - 4] ^ + EXP_TABLE[i - 5] ^ + EXP_TABLE[i - 6] ^ + EXP_TABLE[i - 8]; + } + for (var i = 0; i < 255; i += 1) { + LOG_TABLE[EXP_TABLE[i]] = i; + } + + var _this = {}; + + _this.glog = function(n) { + if (n < 1) { + throw 'glog(' + n + ')'; + } + + return LOG_TABLE[n]; + }; + + _this.gexp = function(n) { + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return EXP_TABLE[n]; + }; + + return _this; + })(); + + //--------------------------------------------------------------------- + // qrPolynomial + //--------------------------------------------------------------------- + + function qrPolynomial(num, shift) { + if (typeof num.length == 'undefined') { + throw num.length + '/' + shift; + } + + var _num = (function() { + var offset = 0; + while (offset < num.length && num[offset] == 0) { + offset += 1; + } + var _num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i += 1) { + _num[i] = num[i + offset]; + } + return _num; + })(); + + var _this = {}; + + _this.getAt = function(index) { + return _num[index]; + }; + + _this.getLength = function() { + return _num.length; + }; + + _this.multiply = function(e) { + var num = new Array(_this.getLength() + e.getLength() - 1); + + for (var i = 0; i < _this.getLength(); i += 1) { + for (var j = 0; j < e.getLength(); j += 1) { + num[i + j] ^= QRMath.gexp( + QRMath.glog(_this.getAt(i)) + QRMath.glog(e.getAt(j)) + ); + } + } + + return qrPolynomial(num, 0); + }; + + _this.mod = function(e) { + if (_this.getLength() - e.getLength() < 0) { + return _this; + } + + var ratio = QRMath.glog(_this.getAt(0)) - QRMath.glog(e.getAt(0)); + + var num = new Array(_this.getLength()); + for (var i = 0; i < _this.getLength(); i += 1) { + num[i] = _this.getAt(i); + } + + for (var i = 0; i < e.getLength(); i += 1) { + num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i)) + ratio); + } + + // recursive call + return qrPolynomial(num, 0).mod(e); + }; + + return _this; + } + + //--------------------------------------------------------------------- + // QRRSBlock + //--------------------------------------------------------------------- + + var QRRSBlock = (function() { + var RS_BLOCK_TABLE = [ + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12, 7, 37, 13], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] + ]; + + var qrRSBlock = function(totalCount, dataCount) { + var _this = {}; + _this.totalCount = totalCount; + _this.dataCount = dataCount; + return _this; + }; + + var _this = {}; + + var getRsBlockTable = function(typeNumber, errorCorrectionLevel) { + switch (errorCorrectionLevel) { + case QRErrorCorrectionLevel.L: + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectionLevel.M: + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectionLevel.Q: + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectionLevel.H: + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default: + return undefined; + } + }; + + _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) { + var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel); + + if (typeof rsBlock == 'undefined') { + throw 'bad rs block @ typeNumber:' + + typeNumber + + '/errorCorrectionLevel:' + + errorCorrectionLevel; + } + + var length = rsBlock.length / 3; + + var list = []; + + for (var i = 0; i < length; i += 1) { + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j += 1) { + list.push(qrRSBlock(totalCount, dataCount)); + } + } + + return list; + }; + + return _this; + })(); + + //--------------------------------------------------------------------- + // qrBitBuffer + //--------------------------------------------------------------------- + + var qrBitBuffer = function() { + var _buffer = []; + var _length = 0; + + var _this = {}; + + _this.getBuffer = function() { + return _buffer; + }; + + _this.getAt = function(index) { + var bufIndex = Math.floor(index / 8); + return ((_buffer[bufIndex] >>> (7 - (index % 8))) & 1) == 1; + }; + + _this.put = function(num, length) { + for (var i = 0; i < length; i += 1) { + _this.putBit(((num >>> (length - i - 1)) & 1) == 1); + } + }; + + _this.getLengthInBits = function() { + return _length; + }; + + _this.putBit = function(bit) { + var bufIndex = Math.floor(_length / 8); + if (_buffer.length <= bufIndex) { + _buffer.push(0); + } + + if (bit) { + _buffer[bufIndex] |= 0x80 >>> _length % 8; + } + + _length += 1; + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // qrNumber + //--------------------------------------------------------------------- + + var qrNumber = function(data) { + var _mode = QRMode.MODE_NUMBER; + var _data = data; + + var _this = {}; + + _this.getMode = function() { + return _mode; + }; + + _this.getLength = function(buffer) { + return _data.length; + }; + + _this.write = function(buffer) { + var data = _data; + + var i = 0; + + while (i + 2 < data.length) { + buffer.put(strToNum(data.substring(i, i + 3)), 10); + i += 3; + } + + if (i < data.length) { + if (data.length - i == 1) { + buffer.put(strToNum(data.substring(i, i + 1)), 4); + } else if (data.length - i == 2) { + buffer.put(strToNum(data.substring(i, i + 2)), 7); + } + } + }; + + var strToNum = function(s) { + var num = 0; + for (var i = 0; i < s.length; i += 1) { + num = num * 10 + chatToNum(s.charAt(i)); + } + return num; + }; + + var chatToNum = function(c) { + if ('0' <= c && c <= '9') { + return c.charCodeAt(0) - '0'.charCodeAt(0); + } + throw 'illegal char :' + c; + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // qrAlphaNum + //--------------------------------------------------------------------- + + var qrAlphaNum = function(data) { + var _mode = QRMode.MODE_ALPHA_NUM; + var _data = data; + + var _this = {}; + + _this.getMode = function() { + return _mode; + }; + + _this.getLength = function(buffer) { + return _data.length; + }; + + _this.write = function(buffer) { + var s = _data; + + var i = 0; + + while (i + 1 < s.length) { + buffer.put(getCode(s.charAt(i)) * 45 + getCode(s.charAt(i + 1)), 11); + i += 2; + } + + if (i < s.length) { + buffer.put(getCode(s.charAt(i)), 6); + } + }; + + var getCode = function(c) { + if ('0' <= c && c <= '9') { + return c.charCodeAt(0) - '0'.charCodeAt(0); + } else if ('A' <= c && c <= 'Z') { + return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10; + } else { + switch (c) { + case ' ': + return 36; + case '$': + return 37; + case '%': + return 38; + case '*': + return 39; + case '+': + return 40; + case '-': + return 41; + case '.': + return 42; + case '/': + return 43; + case ':': + return 44; + default: + throw 'illegal char :' + c; + } + } + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // qr8BitByte + //--------------------------------------------------------------------- + + var qr8BitByte = function(data) { + var _mode = QRMode.MODE_8BIT_BYTE; + var _data = data; + var _bytes = qrcode.stringToBytes(data); + + var _this = {}; + + _this.getMode = function() { + return _mode; + }; + + _this.getLength = function(buffer) { + return _bytes.length; + }; + + _this.write = function(buffer) { + for (var i = 0; i < _bytes.length; i += 1) { + buffer.put(_bytes[i], 8); + } + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // qrKanji + //--------------------------------------------------------------------- + + var qrKanji = function(data) { + var _mode = QRMode.MODE_KANJI; + var _data = data; + + var stringToBytes = qrcode.stringToBytesFuncs['SJIS']; + if (!stringToBytes) { + throw 'sjis not supported.'; + } + !(function(c, code) { + // self test for sjis support. + var test = stringToBytes(c); + if (test.length != 2 || ((test[0] << 8) | test[1]) != code) { + throw 'sjis not supported.'; + } + })('\u53cb', 0x9746); + + var _bytes = stringToBytes(data); + + var _this = {}; + + _this.getMode = function() { + return _mode; + }; + + _this.getLength = function(buffer) { + return ~~(_bytes.length / 2); + }; + + _this.write = function(buffer) { + var data = _bytes; + + var i = 0; + + while (i + 1 < data.length) { + var c = ((0xff & data[i]) << 8) | (0xff & data[i + 1]); + + if (0x8140 <= c && c <= 0x9ffc) { + c -= 0x8140; + } else if (0xe040 <= c && c <= 0xebbf) { + c -= 0xc140; + } else { + throw 'illegal char at ' + (i + 1) + '/' + c; + } + + c = ((c >>> 8) & 0xff) * 0xc0 + (c & 0xff); + + buffer.put(c, 13); + + i += 2; + } + + if (i < data.length) { + throw 'illegal char at ' + (i + 1); + } + }; + + return _this; + }; + + //===================================================================== + // GIF Support etc. + // + + //--------------------------------------------------------------------- + // byteArrayOutputStream + //--------------------------------------------------------------------- + + var byteArrayOutputStream = function() { + var _bytes = []; + + var _this = {}; + + _this.writeByte = function(b) { + _bytes.push(b & 0xff); + }; + + _this.writeShort = function(i) { + _this.writeByte(i); + _this.writeByte(i >>> 8); + }; + + _this.writeBytes = function(b, off, len) { + off = off || 0; + len = len || b.length; + for (var i = 0; i < len; i += 1) { + _this.writeByte(b[i + off]); + } + }; + + _this.writeString = function(s) { + for (var i = 0; i < s.length; i += 1) { + _this.writeByte(s.charCodeAt(i)); + } + }; + + _this.toByteArray = function() { + return _bytes; + }; + + _this.toString = function() { + var s = ''; + s += '['; + for (var i = 0; i < _bytes.length; i += 1) { + if (i > 0) { + s += ','; + } + s += _bytes[i]; + } + s += ']'; + return s; + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // base64EncodeOutputStream + //--------------------------------------------------------------------- + + var base64EncodeOutputStream = function() { + var _buffer = 0; + var _buflen = 0; + var _length = 0; + var _base64 = ''; + + var _this = {}; + + var writeEncoded = function(b) { + _base64 += String.fromCharCode(encode(b & 0x3f)); + }; + + var encode = function(n) { + if (n < 0) { + // error. + } else if (n < 26) { + return 0x41 + n; + } else if (n < 52) { + return 0x61 + (n - 26); + } else if (n < 62) { + return 0x30 + (n - 52); + } else if (n == 62) { + return 0x2b; + } else if (n == 63) { + return 0x2f; + } + throw 'n:' + n; + }; + + _this.writeByte = function(n) { + _buffer = (_buffer << 8) | (n & 0xff); + _buflen += 8; + _length += 1; + + while (_buflen >= 6) { + writeEncoded(_buffer >>> (_buflen - 6)); + _buflen -= 6; + } + }; + + _this.flush = function() { + if (_buflen > 0) { + writeEncoded(_buffer << (6 - _buflen)); + _buffer = 0; + _buflen = 0; + } + + if (_length % 3 != 0) { + // padding + var padlen = 3 - (_length % 3); + for (var i = 0; i < padlen; i += 1) { + _base64 += '='; + } + } + }; + + _this.toString = function() { + return _base64; + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // base64DecodeInputStream + //--------------------------------------------------------------------- + + var base64DecodeInputStream = function(str) { + var _str = str; + var _pos = 0; + var _buffer = 0; + var _buflen = 0; + + var _this = {}; + + _this.read = function() { + while (_buflen < 8) { + if (_pos >= _str.length) { + if (_buflen == 0) { + return -1; + } + throw 'unexpected end of file./' + _buflen; + } + + var c = _str.charAt(_pos); + _pos += 1; + + if (c == '=') { + _buflen = 0; + return -1; + } else if (c.match(/^\s$/)) { + // ignore if whitespace. + continue; + } + + _buffer = (_buffer << 6) | decode(c.charCodeAt(0)); + _buflen += 6; + } + + var n = (_buffer >>> (_buflen - 8)) & 0xff; + _buflen -= 8; + return n; + }; + + var decode = function(c) { + if (0x41 <= c && c <= 0x5a) { + return c - 0x41; + } else if (0x61 <= c && c <= 0x7a) { + return c - 0x61 + 26; + } else if (0x30 <= c && c <= 0x39) { + return c - 0x30 + 52; + } else if (c == 0x2b) { + return 62; + } else if (c == 0x2f) { + return 63; + } else { + throw 'c:' + c; + } + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // gifImage (B/W) + //--------------------------------------------------------------------- + + var gifImage = function(width, height) { + var _width = width; + var _height = height; + var _data = new Array(width * height); + + var _this = {}; + + _this.setPixel = function(x, y, pixel) { + _data[y * _width + x] = pixel; + }; + + _this.write = function(out) { + //--------------------------------- + // GIF Signature + + out.writeString('GIF87a'); + + //--------------------------------- + // Screen Descriptor + + out.writeShort(_width); + out.writeShort(_height); + + out.writeByte(0x80); // 2bit + out.writeByte(0); + out.writeByte(0); + + //--------------------------------- + // Global Color Map + + // black + out.writeByte(0x00); + out.writeByte(0x00); + out.writeByte(0x00); + + // white + out.writeByte(0xff); + out.writeByte(0xff); + out.writeByte(0xff); + + //--------------------------------- + // Image Descriptor + + out.writeString(','); + out.writeShort(0); + out.writeShort(0); + out.writeShort(_width); + out.writeShort(_height); + out.writeByte(0); + + //--------------------------------- + // Local Color Map + + //--------------------------------- + // Raster Data + + var lzwMinCodeSize = 2; + var raster = getLZWRaster(lzwMinCodeSize); + + out.writeByte(lzwMinCodeSize); + + var offset = 0; + + while (raster.length - offset > 255) { + out.writeByte(255); + out.writeBytes(raster, offset, 255); + offset += 255; + } + + out.writeByte(raster.length - offset); + out.writeBytes(raster, offset, raster.length - offset); + out.writeByte(0x00); + + //--------------------------------- + // GIF Terminator + out.writeString(';'); + }; + + var bitOutputStream = function(out) { + var _out = out; + var _bitLength = 0; + var _bitBuffer = 0; + + var _this = {}; + + _this.write = function(data, length) { + if (data >>> length != 0) { + throw 'length over'; + } + + while (_bitLength + length >= 8) { + _out.writeByte(0xff & ((data << _bitLength) | _bitBuffer)); + length -= 8 - _bitLength; + data >>>= 8 - _bitLength; + _bitBuffer = 0; + _bitLength = 0; + } + + _bitBuffer = (data << _bitLength) | _bitBuffer; + _bitLength = _bitLength + length; + }; + + _this.flush = function() { + if (_bitLength > 0) { + _out.writeByte(_bitBuffer); + } + }; + + return _this; + }; + + var getLZWRaster = function(lzwMinCodeSize) { + var clearCode = 1 << lzwMinCodeSize; + var endCode = (1 << lzwMinCodeSize) + 1; + var bitLength = lzwMinCodeSize + 1; + + // Setup LZWTable + var table = lzwTable(); + + for (var i = 0; i < clearCode; i += 1) { + table.add(String.fromCharCode(i)); + } + table.add(String.fromCharCode(clearCode)); + table.add(String.fromCharCode(endCode)); + + var byteOut = byteArrayOutputStream(); + var bitOut = bitOutputStream(byteOut); + + // clear code + bitOut.write(clearCode, bitLength); + + var dataIndex = 0; + + var s = String.fromCharCode(_data[dataIndex]); + dataIndex += 1; + + while (dataIndex < _data.length) { + var c = String.fromCharCode(_data[dataIndex]); + dataIndex += 1; + + if (table.contains(s + c)) { + s = s + c; + } else { + bitOut.write(table.indexOf(s), bitLength); + + if (table.size() < 0xfff) { + if (table.size() == 1 << bitLength) { + bitLength += 1; + } + + table.add(s + c); + } + + s = c; + } + } + + bitOut.write(table.indexOf(s), bitLength); + + // end code + bitOut.write(endCode, bitLength); + + bitOut.flush(); + + return byteOut.toByteArray(); + }; + + var lzwTable = function() { + var _map = {}; + var _size = 0; + + var _this = {}; + + _this.add = function(key) { + if (_this.contains(key)) { + throw 'dup key:' + key; + } + _map[key] = _size; + _size += 1; + }; + + _this.size = function() { + return _size; + }; + + _this.indexOf = function(key) { + return _map[key]; + }; + + _this.contains = function(key) { + return typeof _map[key] != 'undefined'; + }; + + return _this; + }; + + return _this; + }; + + var createDataURL = function(width, height, getPixel) { + var gif = gifImage(width, height); + for (var y = 0; y < height; y += 1) { + for (var x = 0; x < width; x += 1) { + gif.setPixel(x, y, getPixel(x, y)); + } + } + + var b = byteArrayOutputStream(); + gif.write(b); + + var base64 = base64EncodeOutputStream(); + var bytes = b.toByteArray(); + for (var i = 0; i < bytes.length; i += 1) { + base64.writeByte(bytes[i]); + } + base64.flush(); + + return 'data:image/gif;base64,' + base64; + }; + + //--------------------------------------------------------------------- + // returns qrcode function. + + return qrcode; +})(); + +// multibyte support +!(function() { + qrcode.stringToBytesFuncs['UTF-8'] = function(s) { + // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array + function toUTF8Array(str) { + var utf8 = []; + for (var i = 0; i < str.length; i++) { + var charcode = str.charCodeAt(i); + if (charcode < 0x80) utf8.push(charcode); + else if (charcode < 0x800) { + utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f)); + } else if (charcode < 0xd800 || charcode >= 0xe000) { + utf8.push( + 0xe0 | (charcode >> 12), + 0x80 | ((charcode >> 6) & 0x3f), + 0x80 | (charcode & 0x3f) + ); + } + // surrogate pair + else { + i++; + // UTF-16 encodes 0x10000-0x10FFFF by + // subtracting 0x10000 and splitting the + // 20 bits of 0x0-0xFFFFF into two halves + charcode = + 0x10000 + + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)); + utf8.push( + 0xf0 | (charcode >> 18), + 0x80 | ((charcode >> 12) & 0x3f), + 0x80 | ((charcode >> 6) & 0x3f), + 0x80 | (charcode & 0x3f) + ); + } + } + return utf8; + } + return toUTF8Array(s); + }; +})(); + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define([], factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } +})(function() { + return qrcode; +}); diff --git a/app/readme.md b/app/readme.md new file mode 100644 index 00000000..b80e5246 --- /dev/null +++ b/app/readme.md @@ -0,0 +1,9 @@ +# Application Code + +`app/` contains the browser code that gets bundled into `app.[hash].js`. It's got all the logic, crypto, and UI. All of it gets used in the browser, and some of it by the server for server side rendering. + +The main entrypoint for the browser is [main.js](./main.js) and on the server [routes.js](./routes.js) is imported by [/server/routes/pages.js](../server/routes/pages.js) + +- `pages` contains display logic an markup for pages +- `routes` contains route definitions and logic +- `templates` contains ui elements smaller than pages diff --git a/app/routes.js b/app/routes.js new file mode 100644 index 00000000..6a259710 --- /dev/null +++ b/app/routes.js @@ -0,0 +1,21 @@ +const choo = require('choo'); +const download = require('./ui/download'); +const body = require('./ui/body'); + +module.exports = function(app = choo({ hash: true })) { + app.route('/', body(require('./ui/home'))); + app.route('/download/:id', body(download)); + app.route('/download/:id/:key', body(download)); + app.route('/unsupported/:reason', body(require('./ui/unsupported'))); + app.route('/error', body(require('./ui/error'))); + app.route('/blank', body(require('./ui/blank'))); + app.route('/oauth', function(state, emit) { + emit('authenticate', state.query.code, state.query.state); + }); + app.route('/login', function(state, emit) { + emit('replaceState', '/'); + setTimeout(() => emit('render')); + }); + app.route('*', body(require('./ui/notFound'))); + return app; +}; diff --git a/app/routes/download.js b/app/routes/download.js deleted file mode 100644 index c0a47a4c..00000000 --- a/app/routes/download.js +++ /dev/null @@ -1,12 +0,0 @@ -const preview = require('../templates/preview'); -const download = require('../templates/download'); - -module.exports = function(state, emit) { - if (state.transfer) { - const s = state.transfer.state; - if (s === 'downloading' || s === 'complete') { - return download(state, emit); - } - } - return preview(state, emit); -}; diff --git a/app/routes/home.js b/app/routes/home.js deleted file mode 100644 index 0059ceb0..00000000 --- a/app/routes/home.js +++ /dev/null @@ -1,10 +0,0 @@ -const welcome = require('../templates/welcome'); -const upload = require('../templates/upload'); - -module.exports = function(state, emit) { - if (state.transfer && state.transfer.iv) { - //TODO relying on 'iv' is gross - return upload(state, emit); - } - return welcome(state, emit); -}; diff --git a/app/routes/index.js b/app/routes/index.js deleted file mode 100644 index 12b33c1d..00000000 --- a/app/routes/index.js +++ /dev/null @@ -1,43 +0,0 @@ -const choo = require('choo'); -const html = require('choo/html'); -const download = require('./download'); -const header = require('../templates/header'); -const footer = require('../templates/footer'); -const fxPromo = require('../templates/fxPromo'); - -const app = choo(); - -function body(template) { - return function(state, emit) { - const b = html` - ${state.promo === 'header' ? fxPromo(state, emit) : ''} - ${header(state)} -
- - ${template(state, emit)} -
- ${footer(state)} - `; - if (state.layout) { - return state.layout(state, b); - } - return b; - }; -} - -app.route('/', body(require('./home'))); -app.route('/share/:id', body(require('../templates/share'))); -app.route('/download/:id', body(download)); -app.route('/download/:id/:key', body(download)); -app.route('/completed', body(require('../templates/completed'))); -app.route('/unsupported/:reason', body(require('../templates/unsupported'))); -app.route('/legal', body(require('../templates/legal'))); -app.route('/error', body(require('../templates/error'))); -app.route('/blank', body(require('../templates/blank'))); -app.route('*', body(require('../templates/notFound'))); - -module.exports = app; diff --git a/app/serviceWorker.js b/app/serviceWorker.js new file mode 100644 index 00000000..34ae25b2 --- /dev/null +++ b/app/serviceWorker.js @@ -0,0 +1,174 @@ +import assets from '../common/assets'; +import { version } from '../package.json'; +import Keychain from './keychain'; +import { downloadStream } from './api'; +import { transformStream } from './streams'; +import Zip from './zip'; +import contentDisposition from 'content-disposition'; + +let noSave = false; +const map = new Map(); +const IMAGES = /.*\.(png|svg|jpg)$/; +const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)(#\w+)?$/; +const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/; +const FONT = /\.woff2?$/; + +self.addEventListener('install', () => { + self.skipWaiting(); +}); + +self.addEventListener('activate', event => { + event.waitUntil(self.clients.claim().then(precache)); +}); + +async function decryptStream(id) { + const file = map.get(id); + if (!file) { + return new Response(null, { status: 400 }); + } + try { + let size = file.size; + let type = file.type; + const keychain = new Keychain(file.key, file.nonce); + if (file.requiresPassword) { + keychain.setPassword(file.password, file.url); + } + + file.download = downloadStream(id, keychain); + + const body = await file.download.result; + + const decrypted = keychain.decryptStream(body); + + let zipStream = null; + if (file.type === 'send-archive') { + const zip = new Zip(file.manifest, decrypted); + zipStream = zip.stream; + type = 'application/zip'; + size = zip.size; + } + const responseStream = transformStream( + zipStream || decrypted, + { + transform(chunk, controller) { + file.progress += chunk.length; + controller.enqueue(chunk); + } + }, + function oncancel() { + // NOTE: cancel doesn't currently fire on chrome + // https://bugs.chromium.org/p/chromium/issues/detail?id=638494 + file.download.cancel(); + map.delete(id); + } + ); + + const headers = { + 'Content-Disposition': contentDisposition(file.filename), + 'Content-Type': type, + 'Content-Length': size + }; + return new Response(responseStream, { headers }); + } catch (e) { + if (noSave) { + return new Response(null, { status: e.message }); + } + + return new Response(null, { + status: 302, + headers: { + Location: `/download/${id}/#${file.key}` + } + }); + } +} + +async function precache() { + try { + await cleanCache(); + const cache = await caches.open(version); + const images = assets.match(IMAGES); + await cache.addAll(images); + } catch (e) { + console.error(e); + // cache will get populated on demand + } +} + +async function cleanCache() { + const oldCaches = await caches.keys(); + for (const c of oldCaches) { + if (c !== version) { + await caches.delete(c); + } + } +} + +function cacheable(url) { + return VERSIONED_ASSET.test(url) || FONT.test(url); +} + +async function cachedOrFetched(req) { + const cache = await caches.open(version); + const cached = await cache.match(req); + if (cached) { + return cached; + } + const fetched = await fetch(req); + if (fetched.ok && cacheable(req.url)) { + cache.put(req, fetched.clone()); + } + return fetched; +} + +self.onfetch = event => { + const req = event.request; + if (req.method !== 'GET') return; + const url = new URL(req.url); + const dlmatch = DOWNLOAD_URL.exec(url.pathname); + if (dlmatch) { + event.respondWith(decryptStream(dlmatch[1])); + } else if (cacheable(url.pathname)) { + event.respondWith(cachedOrFetched(req)); + } +}; + +self.onmessage = event => { + if (event.data.request === 'init') { + noSave = event.data.noSave; + const info = { + key: event.data.key, + nonce: event.data.nonce, + filename: event.data.filename, + requiresPassword: event.data.requiresPassword, + password: event.data.password, + url: event.data.url, + type: event.data.type, + manifest: event.data.manifest, + size: event.data.size, + progress: 0 + }; + map.set(event.data.id, info); + + event.ports[0].postMessage('file info received'); + } else if (event.data.request === 'progress') { + const file = map.get(event.data.id); + if (!file) { + event.ports[0].postMessage({ error: 'cancelled' }); + } else { + if (file.progress === file.size) { + map.delete(event.data.id); + } + event.ports[0].postMessage({ progress: file.progress }); + } + } else if (event.data.request === 'cancel') { + const file = map.get(event.data.id); + if (file) { + if (file.download) { + file.download.cancel(); + } + map.delete(event.data.id); + } + event.ports[0].postMessage('download cancelled'); + } +}; diff --git a/app/storage.js b/app/storage.js index 27cba1cb..304759ea 100644 --- a/app/storage.js +++ b/app/storage.js @@ -1,4 +1,5 @@ -import { isFile } from './utils'; +import { arrayToB64, isFile } from './utils'; +import OwnedFile from './ownedFile'; class Mem { constructor() { @@ -37,23 +38,33 @@ class Storage { } loadFiles() { - const fs = []; + const fs = new Map(); for (let i = 0; i < this.engine.length; i++) { const k = this.engine.key(i); if (isFile(k)) { try { - const f = JSON.parse(this.engine.getItem(k)); + const f = new OwnedFile(JSON.parse(this.engine.getItem(k))); if (!f.id) { f.id = f.fileId; } - fs.push(f); + + fs.set(f.id, f); } catch (err) { // obviously you're not a golfer this.engine.removeItem(k); } } } - return fs.sort((a, b) => a.createdAt - b.createdAt); + return fs; + } + + get id() { + let id = this.engine.getItem('device_id'); + if (!id) { + id = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); + this.engine.setItem('device_id', id); + } + return id; } get totalDownloads() { @@ -75,44 +86,99 @@ class Storage { this.engine.setItem('referrer', str); } get enrolled() { - return JSON.parse(this.engine.getItem('experiments') || '[]'); + return JSON.parse(this.engine.getItem('ab_experiments') || '{}'); } enroll(id, variant) { - const enrolled = this.enrolled; - // eslint-disable-next-line no-unused-vars - if (!enrolled.find(([i, v]) => i === id)) { - enrolled.push([id, variant]); - this.engine.setItem('experiments', JSON.stringify(enrolled)); - } + const enrolled = {}; + enrolled[id] = variant; + this.engine.setItem('ab_experiments', JSON.stringify(enrolled)); } get files() { - return this._files; + return Array.from(this._files.values()).sort( + (a, b) => a.createdAt - b.createdAt + ); + } + + get user() { + try { + return JSON.parse(this.engine.getItem('user')); + } catch (e) { + return null; + } + } + + set user(info) { + return this.engine.setItem('user', JSON.stringify(info)); } getFileById(id) { - return this._files.find(f => f.id === id); + return this._files.get(id); } get(id) { return this.engine.getItem(id); } + set(id, value) { + return this.engine.setItem(id, value); + } + remove(property) { if (isFile(property)) { - this._files.splice(this._files.findIndex(f => f.id === property), 1); + this._files.delete(property); } this.engine.removeItem(property); } addFile(file) { - this._files.push(file); + this._files.set(file.id, file); + this.writeFile(file); + } + + writeFile(file) { this.engine.setItem(file.id, JSON.stringify(file)); } writeFiles() { - this._files.forEach(f => this.engine.setItem(f.id, JSON.stringify(f))); + this._files.forEach(f => this.writeFile(f)); + } + + clearLocalFiles() { + this._files.forEach(f => this.engine.removeItem(f.id)); + this._files = new Map(); + } + + async merge(files = []) { + let incoming = false; + let outgoing = false; + let downloadCount = false; + for (const f of files) { + if (!this.getFileById(f.id)) { + this.addFile(new OwnedFile(f)); + incoming = true; + } + } + const workingFiles = this.files.slice(); + for (const f of workingFiles) { + const cc = await f.updateDownloadCount(); + if (cc) { + await this.writeFile(f); + } + downloadCount = downloadCount || cc; + outgoing = outgoing || f.expired; + if (f.expired) { + this.remove(f.id); + } else if (!files.find(x => x.id === f.id)) { + outgoing = true; + } + } + return { + incoming, + outgoing, + downloadCount + }; } } diff --git a/app/streams.js b/app/streams.js new file mode 100644 index 00000000..00159a24 --- /dev/null +++ b/app/streams.js @@ -0,0 +1,103 @@ +/* global TransformStream */ + +export function transformStream(readable, transformer, oncancel) { + try { + return readable.pipeThrough(new TransformStream(transformer)); + } catch (e) { + const reader = readable.getReader(); + return new ReadableStream({ + start(controller) { + if (transformer.start) { + return transformer.start(controller); + } + }, + async pull(controller) { + let enqueued = false; + const wrappedController = { + enqueue(d) { + enqueued = true; + controller.enqueue(d); + } + }; + while (!enqueued) { + const data = await reader.read(); + if (data.done) { + if (transformer.flush) { + await transformer.flush(controller); + } + return controller.close(); + } + await transformer.transform(data.value, wrappedController); + } + }, + cancel(reason) { + readable.cancel(reason); + if (oncancel) { + oncancel(reason); + } + } + }); + } +} + +class BlobStreamController { + constructor(blob, size) { + this.blob = blob; + this.index = 0; + this.chunkSize = size || 1024 * 64; + } + + pull(controller) { + return new Promise((resolve, reject) => { + const bytesLeft = this.blob.size - this.index; + if (bytesLeft <= 0) { + controller.close(); + return resolve(); + } + const size = Math.min(this.chunkSize, bytesLeft); + const slice = this.blob.slice(this.index, this.index + size); + const reader = new FileReader(); + reader.onload = () => { + controller.enqueue(new Uint8Array(reader.result)); + resolve(); + }; + reader.onerror = reject; + reader.readAsArrayBuffer(slice); + this.index += size; + }); + } +} + +export function blobStream(blob, size) { + return new ReadableStream(new BlobStreamController(blob, size)); +} + +class ConcatStreamController { + constructor(streams) { + this.streams = streams; + this.index = 0; + this.reader = null; + this.nextReader(); + } + + nextReader() { + const next = this.streams[this.index++]; + this.reader = next && next.getReader(); + } + + async pull(controller) { + if (!this.reader) { + return controller.close(); + } + const data = await this.reader.read(); + if (data.done) { + this.nextReader(); + return this.pull(controller); + } + controller.enqueue(data.value); + } +} + +export function concatStream(streams) { + return new ReadableStream(new ConcatStreamController(streams)); +} diff --git a/app/templates/blank.js b/app/templates/blank.js deleted file mode 100644 index 080a3232..00000000 --- a/app/templates/blank.js +++ /dev/null @@ -1,6 +0,0 @@ -const html = require('choo/html'); - -module.exports = function() { - const div = html`
`; - return div; -}; diff --git a/app/templates/completed.js b/app/templates/completed.js deleted file mode 100644 index 751b9de7..00000000 --- a/app/templates/completed.js +++ /dev/null @@ -1,35 +0,0 @@ -const html = require('choo/html'); -const progress = require('./progress'); -const { fadeOut } = require('../utils'); -const fxPromo = require('./fxPromo'); - -module.exports = function(state, emit) { - const div = html` -
-
-
-
${state.translate( - 'downloadFinish' - )}
-
- ${progress(1)} -
-
-
-
- ${state.translate('sendYourFilesLink')} -
- ${state.promo === 'body' ? fxPromo(state, emit) : ''} -
- `; - - async function sendNew(e) { - e.preventDefault(); - await fadeOut('download'); - emit('pushState', '/'); - } - - return div; -}; diff --git a/app/templates/download.js b/app/templates/download.js deleted file mode 100644 index 7551eb5f..00000000 --- a/app/templates/download.js +++ /dev/null @@ -1,32 +0,0 @@ -const html = require('choo/html'); -const progress = require('./progress'); -const { bytes } = require('../utils'); -const fxPromo = require('./fxPromo'); - -module.exports = function(state, emit) { - const transfer = state.transfer; - const div = html` -
-
-
${state.translate( - 'downloadingPageProgress', - { - filename: state.fileInfo.name, - size: bytes(state.fileInfo.size) - } - )}
-
${state.translate('downloadingPageMessage')}
- ${progress(transfer.progressRatio)} -
-
${state.translate( - transfer.msg, - transfer.sizes - )}
-
-
- ${state.promo === 'body' ? fxPromo(state, emit) : ''} -
- `; - - return div; -}; diff --git a/app/templates/downloadPassword.js b/app/templates/downloadPassword.js deleted file mode 100644 index 4ce13608..00000000 --- a/app/templates/downloadPassword.js +++ /dev/null @@ -1,56 +0,0 @@ -const html = require('choo/html'); - -module.exports = function(state, emit) { - const fileInfo = state.fileInfo; - const label = - fileInfo.password === null - ? html` - ` - : html` - `; - const div = html` -
- ${label} -
- - -
-
`; - - function inputChanged() { - const input = document.getElementById('unlock-input'); - const btn = document.getElementById('unlock-btn'); - if (input.value.length > 0) { - btn.classList.remove('btn-hidden'); - input.classList.remove('input-no-btn'); - } else { - btn.classList.add('btn-hidden'); - input.classList.add('input-no-btn'); - } - } - - function checkPassword(event) { - event.preventDefault(); - const password = document.getElementById('unlock-input').value; - if (password.length > 0) { - document.getElementById('unlock-btn').disabled = true; - state.fileInfo.url = window.location.href; - state.fileInfo.password = password; - emit('preview'); - } - } - - return div; -}; diff --git a/app/templates/error.js b/app/templates/error.js deleted file mode 100644 index f7751faa..00000000 --- a/app/templates/error.js +++ /dev/null @@ -1,10 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - return html` -
-
${state.translate('errorPageHeader')}
- -
`; -}; diff --git a/app/templates/file.js b/app/templates/file.js deleted file mode 100644 index 7fc665e9..00000000 --- a/app/templates/file.js +++ /dev/null @@ -1,84 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -function timeLeft(milliseconds) { - const minutes = Math.floor(milliseconds / 1000 / 60); - const hours = Math.floor(minutes / 60); - const seconds = Math.floor((milliseconds / 1000) % 60); - if (hours >= 1) { - return `${hours}h ${minutes % 60}m`; - } else if (hours === 0) { - return `${minutes}m ${seconds}s`; - } - return null; -} - -module.exports = function(file, state, emit) { - const ttl = file.expiresAt - Date.now(); - const remaining = timeLeft(ttl) || state.translate('linkExpiredAlt'); - const row = html` - - ${file.name} - - - - - ${remaining} - - - - - - `; - - function copyClick(e) { - emit('copy', { url: file.url, location: 'upload-list' }); - const icon = e.target; - const text = e.target.nextSibling; - icon.hidden = true; - text.hidden = false; - setTimeout(() => { - icon.hidden = false; - text.hidden = true; - }, 500); - } - - function showPopup() { - const tr = document.getElementById(file.id); - const popup = tr.querySelector('.popuptext'); - popup.classList.add('show'); - popup.focus(); - } - - function cancel(e) { - e.stopPropagation(); - const tr = document.getElementById(file.id); - const popup = tr.querySelector('.popuptext'); - popup.classList.remove('show'); - } - - function deleteFile() { - emit('delete', { file, location: 'upload-list' }); - emit('render'); - } - - return row; -}; diff --git a/app/templates/fileList.js b/app/templates/fileList.js deleted file mode 100644 index eed2465f..00000000 --- a/app/templates/fileList.js +++ /dev/null @@ -1,32 +0,0 @@ -const html = require('choo/html'); -const file = require('./file'); - -module.exports = function(state, emit) { - let table = ''; - if (state.storage.files.length) { - table = html` - - - - - - - - - - - ${state.storage.files.map(f => file(f, state, emit))} - -
${state.translate('uploadedFile')}${state.translate( - 'copyFileList' - )}${state.translate('expiryFileList')}${state.translate( - 'deleteFileList' - )}
- `; - } - return html` -
- ${table} -
- `; -}; diff --git a/app/templates/footer.js b/app/templates/footer.js deleted file mode 100644 index 795cdfda..00000000 --- a/app/templates/footer.js +++ /dev/null @@ -1,31 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - return html``; -}; diff --git a/app/templates/fxPromo.js b/app/templates/fxPromo.js deleted file mode 100644 index 5098314d..00000000 --- a/app/templates/fxPromo.js +++ /dev/null @@ -1,44 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -// function replaceLinks(str, urls) { -// let i = -1; -// const s = str.replace(/([^<]+)<\/a>/g, (m, v) => { -// i++; -// return `${v}`; -// }); -// return [`${s}`]; -// } - -module.exports = function(state, emit) { - // function close() { - // document.querySelector('.banner').remove(); - // } - - function clicked(evt) { - emit('exit', evt); - } - - return html` - `; -}; - -/* - -*/ diff --git a/app/templates/header.js b/app/templates/header.js deleted file mode 100644 index edd39d7a..00000000 --- a/app/templates/header.js +++ /dev/null @@ -1,21 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - return html`
- - -
`; -}; diff --git a/app/templates/legal.js b/app/templates/legal.js deleted file mode 100644 index af196ab9..00000000 --- a/app/templates/legal.js +++ /dev/null @@ -1,34 +0,0 @@ -const html = require('choo/html'); - -function replaceLinks(str, urls) { - let i = -1; - const s = str.replace(/([^<]+)<\/a>/g, (m, v) => { - i++; - return `${v}`; - }); - return [`
${s}
`]; -} - -module.exports = function(state) { - const div = html` -
- -
- `; - return div; -}; diff --git a/app/templates/notFound.js b/app/templates/notFound.js deleted file mode 100644 index c29bf194..00000000 --- a/app/templates/notFound.js +++ /dev/null @@ -1,21 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - const div = html` -
-
-
${state.translate('expiredPageHeader')}
- -
${state.translate( - 'uploadPageExplainer' - )}
- ${state.translate( - 'sendYourFilesLink' - )} -
-
`; - return div; -}; diff --git a/app/templates/preview.js b/app/templates/preview.js deleted file mode 100644 index cb5352ac..00000000 --- a/app/templates/preview.js +++ /dev/null @@ -1,74 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); -const notFound = require('./notFound'); -const downloadPassword = require('./downloadPassword'); -const { bytes } = require('../utils'); -const fxPromo = require('./fxPromo'); - -function getFileFromDOM() { - const el = document.getElementById('dl-file'); - if (!el) { - return null; - } - return { - nonce: el.getAttribute('data-nonce'), - pwd: !!+el.getAttribute('data-requires-password') - }; -} - -module.exports = function(state, emit) { - state.fileInfo = state.fileInfo || getFileFromDOM(); - if (!state.fileInfo) { - return notFound(state, emit); - } - state.fileInfo.id = state.params.id; - state.fileInfo.key = state.params.key; - const fileInfo = state.fileInfo; - const size = fileInfo.size - ? state.translate('downloadFileSize', { size: bytes(fileInfo.size) }) - : ''; - let action = html` -
- ${state.translate('downloadAltText')} -
- -
-
`; - if (fileInfo.pwd && !fileInfo.password) { - action = downloadPassword(state, emit); - } else if (!state.transfer) { - emit('preview'); - } - const title = fileInfo.name - ? state.translate('downloadFileName', { filename: fileInfo.name }) - : state.translate('downloadFileTitle'); - const div = html` -
-
-
-
- ${title} - ${' ' + size} -
-
${state.translate('downloadMessage')}
- ${action} -
- ${state.translate('sendYourFilesLink')} -
- ${state.promo === 'body' ? fxPromo(state, emit) : ''} -
- `; - - function download(event) { - event.preventDefault(); - emit('download', fileInfo); - } - return div; -}; diff --git a/app/templates/progress.js b/app/templates/progress.js deleted file mode 100644 index 997e05ba..00000000 --- a/app/templates/progress.js +++ /dev/null @@ -1,29 +0,0 @@ -const html = require('choo/html'); - -const radius = 73; -const oRadius = radius + 10; -const oDiameter = oRadius * 2; -const circumference = 2 * Math.PI * radius; - -module.exports = function(progressRatio) { - const dashOffset = (1 - progressRatio) * circumference; - const percent = Math.floor(progressRatio * 100); - const div = html` -
- - - - ${ - percent - }% - -
- `; - return div; -}; diff --git a/app/templates/share.js b/app/templates/share.js deleted file mode 100644 index 3efeb6bd..00000000 --- a/app/templates/share.js +++ /dev/null @@ -1,90 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); -const notFound = require('./notFound'); -const uploadPassword = require('./uploadPassword'); -const { allowedCopy, delay, fadeOut } = require('../utils'); - -function passwordComplete(state, password) { - const el = html([ - `
${state.translate('passwordResult', { - password: '
'
-    })}
` - ]); - el.lastElementChild.textContent = password; - return el; -} - -module.exports = function(state, emit) { - const file = state.storage.getFileById(state.params.id); - if (!file) { - return notFound(state, emit); - } - - file.password = file.password || ''; - - const passwordSection = file.password - ? passwordComplete(state, file.password) - : uploadPassword(state, emit); - const div = html` - - `; - - async function sendNew(e) { - e.preventDefault(); - await fadeOut('share-link'); - emit('pushState', '/'); - } - - async function copyLink() { - if (allowedCopy()) { - emit('copy', { url: file.url, location: 'success-screen' }); - const input = document.getElementById('link'); - input.disabled = true; - const copyBtn = document.getElementById('copy-btn'); - copyBtn.disabled = true; - copyBtn.classList.add('success'); - copyBtn.replaceChild( - html``, - copyBtn.firstChild - ); - await delay(2000); - input.disabled = false; - if (!copyBtn.parentNode.classList.contains('wait-password')) { - copyBtn.disabled = false; - } - copyBtn.classList.remove('success'); - copyBtn.textContent = state.translate('copyUrlFormButton'); - } - } - - async function deleteFile() { - emit('delete', { file, location: 'success-screen' }); - await fadeOut('share-link'); - emit('pushState', '/'); - } - return div; -}; diff --git a/app/templates/unsupported.js b/app/templates/unsupported.js deleted file mode 100644 index f37c9bd5..00000000 --- a/app/templates/unsupported.js +++ /dev/null @@ -1,46 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - const msg = - state.params.reason === 'outdated' - ? html` -
-
${state.translate('notSupportedHeader')}
-
${state.translate( - 'notSupportedOutdatedDetail' - )}
- - -
${state.translate( - 'updateFirefox' - )}
-
-
${state.translate( - 'uploadPageExplainer' - )}
-
` - : html` -
-
${state.translate('notSupportedHeader')}
-
${state.translate('notSupportedDetail')}
- - - -
Firefox
- ${state.translate('downloadFirefoxButtonSub')} -
-
-
${state.translate( - 'uploadPageExplainer' - )}
-
`; - const div = html`
${msg}
`; - return div; -}; diff --git a/app/templates/upload.js b/app/templates/upload.js deleted file mode 100644 index a2d9edd2..00000000 --- a/app/templates/upload.js +++ /dev/null @@ -1,38 +0,0 @@ -const html = require('choo/html'); -const progress = require('./progress'); -const { bytes } = require('../utils'); - -module.exports = function(state, emit) { - const transfer = state.transfer; - - const div = html` -
-
${state.translate( - 'uploadingPageProgress', - { - filename: transfer.file.name, - size: bytes(transfer.file.size) - } - )}
-
- ${progress(transfer.progressRatio)} -
-
${state.translate( - transfer.msg, - transfer.sizes - )}
- -
-
- `; - - function cancel() { - const btn = document.getElementById('cancel-upload'); - btn.disabled = true; - btn.textContent = state.translate('uploadCancelNotification'); - emit('cancel'); - } - return div; -}; diff --git a/app/templates/uploadPassword.js b/app/templates/uploadPassword.js deleted file mode 100644 index e84ebbb7..00000000 --- a/app/templates/uploadPassword.js +++ /dev/null @@ -1,65 +0,0 @@ -const html = require('choo/html'); - -module.exports = function(state, emit) { - const file = state.storage.getFileById(state.params.id); - const div = html` -
-
- - -
- -
`; - - function inputChanged() { - const input = document.getElementById('unlock-input'); - const btn = document.getElementById('unlock-btn'); - if (input.value.length > 0) { - btn.classList.remove('btn-hidden'); - input.classList.remove('input-no-btn'); - } else { - btn.classList.add('btn-hidden'); - input.classList.add('input-no-btn'); - } - } - - function togglePasswordInput(e) { - const unlockInput = document.getElementById('unlock-input'); - const boxChecked = e.target.checked; - document - .querySelector('.setPassword') - .classList.toggle('hidden', !boxChecked); - if (boxChecked) { - unlockInput.focus(); - } else { - unlockInput.value = ''; - } - inputChanged(); - } - - function setPassword(event) { - event.preventDefault(); - const password = document.getElementById('unlock-input').value; - if (password.length > 0) { - document.getElementById('copy').classList.remove('wait-password'); - document.getElementById('copy-btn').disabled = false; - emit('password', { password, file }); - } - } - - return div; -}; diff --git a/app/templates/welcome.js b/app/templates/welcome.js deleted file mode 100644 index 0f004608..00000000 --- a/app/templates/welcome.js +++ /dev/null @@ -1,73 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); -const fileList = require('./fileList'); -const fxPromo = require('./fxPromo'); -const { fadeOut } = require('../utils'); - -module.exports = function(state, emit) { - const div = html` -
-
${state.translate('uploadPageHeader')}
-
-
${state.translate('uploadPageExplainer')}
- ${state.translate('uploadPageLearnMore')} -
-
-
- -
-
${state.translate('uploadPageDropMessage')}
- - ${state.translate('uploadPageSizeMessage')} - - - -
- ${state.promo === 'body' ? fxPromo(state, emit) : ''} - ${fileList(state, emit)} -
- `; - - function dragover(event) { - const div = document.querySelector('.upload-window'); - div.classList.add('ondrag'); - } - - function dragleave(event) { - const div = document.querySelector('.upload-window'); - div.classList.remove('ondrag'); - } - - function onfocus(event) { - event.target.classList.add('has-focus'); - } - - function onblur(event) { - event.target.classList.remove('has-focus'); - } - - async function upload(event) { - event.preventDefault(); - const target = event.target; - const file = target.files[0]; - if (file.size === 0) { - return; - } - await fadeOut('page-one'); - emit('upload', { file, type: 'click' }); - } - return div; -}; diff --git a/app/ui/account.js b/app/ui/account.js new file mode 100644 index 00000000..9845a3a1 --- /dev/null +++ b/app/ui/account.js @@ -0,0 +1,111 @@ +const html = require('choo/html'); +const Component = require('choo/component'); + +class Account extends Component { + constructor(name, state, emit) { + super(name); + this.state = state; + this.emit = emit; + this.enabled = state.capabilities.account; + this.local = state.components[name] = {}; + this.buttonClass = ''; + this.setLocal(); + } + + avatarClick(event) { + event.preventDefault(); + const menu = document.getElementById('accountMenu'); + menu.classList.toggle('invisible'); + menu.focus(); + } + + hideMenu(event) { + event.stopPropagation(); + const menu = document.getElementById('accountMenu'); + menu.classList.add('invisible'); + } + + login(event) { + event.preventDefault(); + this.emit('signup-cta', 'button'); + } + + logout(event) { + event.preventDefault(); + this.emit('logout'); + } + + changed() { + return this.local.loggedIn !== this.state.user.loggedIn; + } + + setLocal() { + const changed = this.changed(); + if (changed) { + this.local.loggedIn = this.state.user.loggedIn; + } + return changed; + } + + update() { + return this.setLocal(); + } + + createElement() { + if (!this.enabled) { + return html` + + `; + } + const user = this.state.user; + const translate = this.state.translate; + this.setLocal(); + if (user.loginRequired && !this.local.loggedIn) { + return html` + + `; + } + if (!this.local.loggedIn) { + return html` + + + + `; + } + return html` + + + + + `; + } +} + +module.exports = Account; diff --git a/app/ui/archiveTile.js b/app/ui/archiveTile.js new file mode 100644 index 00000000..84ecf1f6 --- /dev/null +++ b/app/ui/archiveTile.js @@ -0,0 +1,645 @@ +/* global Android */ + +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const assets = require('../../common/assets'); +const { + bytes, + copyToClipboard, + list, + percent, + platform, + timeLeft +} = require('../utils'); +const expiryOptions = require('./expiryOptions'); + +function expiryInfo(translate, archive) { + const l10n = timeLeft(archive.expiresAt - Date.now()); + return raw( + translate('archiveExpiryInfo', { + downloadCount: translate('downloadCount', { + num: archive.dlimit - archive.dtotal + }), + timespan: translate(l10n.id, l10n) + }) + ); +} + +function password(state) { + const MAX_LENGTH = 4096; + + return html` +
+ +
+ + +
+
+ + +
+ +
+ `; + + function onPasswordPreviewButtonclicked(event) { + event.preventDefault(); + const input = document.getElementById('password-input'); + const eyeIcon = event.currentTarget.querySelector('img'); + + if (input.type === 'password') { + input.type = 'text'; + eyeIcon.src = assets.get('eye-off.svg'); + } else { + input.type = 'password'; + eyeIcon.src = assets.get('eye.svg'); + } + + input.focus(); + } + + function togglePasswordInput(event) { + event.stopPropagation(); + const checked = event.target.checked; + const input = document.getElementById('password-input'); + const passwordPreviewButton = document.getElementById( + 'password-preview-button' + ); + if (checked) { + input.classList.remove('invisible'); + passwordPreviewButton.classList.remove('invisible'); + input.focus(); + } else { + input.classList.add('invisible'); + passwordPreviewButton.classList.add('invisible'); + input.value = ''; + document.getElementById('password-msg').textContent = ''; + state.archive.password = null; + } + } + + function inputChanged() { + const passwordInput = document.getElementById('password-input'); + const pwdmsg = document.getElementById('password-msg'); + const password = passwordInput.value; + const length = password.length; + + if (length === MAX_LENGTH) { + pwdmsg.textContent = state.translate('maxPasswordLength', { + length: MAX_LENGTH + }); + } else { + pwdmsg.textContent = ''; + } + state.archive.password = password; + } + + function focused(event) { + event.preventDefault(); + const el = document.getElementById('password-input'); + if (el.placeholder !== state.translate('unlockInputPlaceholder')) { + el.placeholder = ''; + } + } +} + +function fileInfo(file, action) { + return html` + + + + +

+

${file.name}

+
${bytes( + file.size + )}
+

+ ${action} +
`; +} + +function archiveInfo(archive, action) { + return html` +

+ + + +

+

${archive.name}

+
${bytes( + archive.size + )}
+

+ ${action} +

`; +} + +function archiveDetails(translate, archive) { + if (archive.manifest.files.length > 1) { + return html` +
+ + + + + ${translate('fileCount', { + num: archive.manifest.files.length + })} + + ${list(archive.manifest.files.map(f => fileInfo(f)))} +
+ `; + } + function toggled(event) { + event.stopPropagation(); + archive.open = event.target.open; + } +} + +module.exports = function(state, emit, archive) { + const copyOrShare = + state.capabilities.share || platform() === 'android' + ? html` + + ` + : html` + + `; + const dl = + platform() === 'web' + ? html` + + + + + ${state.translate('downloadButtonLabel')} + + ` + : html` +
+ `; + return html` + + ${archiveInfo( + archive, + html` + + ` + )} +
+ ${expiryInfo(state.translate, archive)} +
+ ${archiveDetails(state.translate, archive)} +
+
+ ${dl} ${copyOrShare} +
+
+ `; + + function copy(event) { + event.stopPropagation(); + copyToClipboard(archive.url); + const text = event.target.lastChild; + text.textContent = state.translate('copiedUrl'); + setTimeout( + () => (text.textContent = state.translate('copyLinkButton')), + 1000 + ); + } + + function del(event) { + event.stopPropagation(); + emit('delete', archive); + } + + async function share(event) { + event.stopPropagation(); + if (platform() === 'android') { + Android.shareUrl(archive.url); + } else { + try { + await navigator.share({ + title: state.translate('-send-brand'), + text: `Download "${archive.name}" with Send: simple, safe file sharing`, + //state.translate('shareMessage', { name }), + url: archive.url + }); + } catch (e) { + // ignore + } + } + } +}; + +module.exports.wip = function(state, emit) { + return html` + + ${list( + Array.from(state.archive.files) + .reverse() + .map(f => + fileInfo(f, remove(f, state.translate('deleteButtonHover'))) + ), + 'flex-shrink bg-grey-10 rounded-t overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen dark:bg-black', + 'bg-white px-2 my-2 shadow-light rounded-default dark:bg-grey-90 dark:border-default dark:border-grey-80' + )} +
+ +
+ +
+ ${state.translate('totalSize', { + size: bytes(state.archive.size) + })} +
+
+
+ ${expiryOptions(state, emit)} ${password(state, emit)} + +
+ `; + + function focus(event) { + event.target.nextElementSibling.firstElementChild.classList.add('outline'); + } + + function blur(event) { + event.target.nextElementSibling.firstElementChild.classList.remove( + 'outline' + ); + } + + function upload(event) { + window.scrollTo(0, 0); + event.preventDefault(); + event.target.disabled = true; + if (!state.uploading) { + emit('upload'); + } + } + + function add(event) { + event.preventDefault(); + const newFiles = Array.from(event.target.files); + + emit('addFiles', { files: newFiles }); + setTimeout(() => { + document + .querySelector('#wip > ul > li:first-child') + .scrollIntoView({ block: 'center' }); + }); + } + + function remove(file, desc) { + return html` + + `; + function del(event) { + event.stopPropagation(); + emit('removeUpload', file); + } + } +}; + +module.exports.uploading = function(state, emit) { + const progress = state.transfer.progressRatio; + const progressPercent = percent(progress); + const archive = state.archive; + return html` + + ${archiveInfo(archive)} +
+ ${expiryInfo(state.translate, { + dlimit: state.archive.dlimit, + dtotal: 0, + expiresAt: Date.now() + 500 + state.archive.timeLimit * 1000 + })} +
+ + ${progressPercent} + +
+ `; + + function cancel(event) { + event.stopPropagation(); + event.target.disabled = true; + emit('cancel'); + } +}; + +module.exports.empty = function(state, emit) { + const upsell = + state.user.loggedIn || !state.capabilities.account + ? '' + : html` + + `; + const uploadNotice = state.WEB_UI.UPLOAD_AREA_NOTICE_HTML + ? html` +

+ ${raw(state.WEB_UI.UPLOAD_AREA_NOTICE_HTML)} +

+ ` + : ''; + + return html` + + + + +
+ ${state.translate('dragAndDropFiles')} +
+
+ ${state.translate('orClickWithSize', { + size: bytes(state.user.maxSize) + })} +
+ + + ${upsell} ${uploadNotice} +
+ `; + + function focus(event) { + event.target.nextElementSibling.classList.add('bg-primary', 'outline'); + } + + function blur(event) { + event.target.nextElementSibling.classList.remove('bg-primary', 'outline'); + } + + function add(event) { + event.preventDefault(); + const newFiles = Array.from(event.target.files); + + emit('addFiles', { files: newFiles }); + } +}; + +module.exports.preview = function(state, emit) { + const archive = state.fileInfo; + if (archive.open === undefined) { + archive.open = true; + } + const single = archive.manifest.files.length === 1; + const details = single + ? '' + : html` +
+ ${archiveDetails(state.translate, archive)} +
+ `; + const notice = state.WEB_UI.DOWNLOAD_NOTICE_HTML + ? html` +

+ ${raw(state.WEB_UI.DOWNLOAD_NOTICE_HTML)} +

+ ` + : ''; + const sponsor = state.WEB_UI.SHOW_THUNDERBIRD_SPONSOR + ? html` + + + + + ${state.translate('sponsoredByThunderbird')} + + ` + : ''; + + return html` + +
+ ${archiveInfo(archive)} ${details} +
+ + ${notice} ${sponsor} +
+ `; + + function download(event) { + event.preventDefault(); + event.target.disabled = true; + emit('download'); + } +}; + +module.exports.downloading = function(state) { + const archive = state.fileInfo; + const progress = state.transfer.progressRatio; + const progressPercent = percent(progress); + return html` + + ${archiveInfo(archive)} + + ${progressPercent} + + `; +}; diff --git a/app/ui/blank.js b/app/ui/blank.js new file mode 100644 index 00000000..d34f94e3 --- /dev/null +++ b/app/ui/blank.js @@ -0,0 +1,14 @@ +const html = require('choo/html'); + +module.exports = function() { + return html` +
+
+
+
+
+
+ `; +}; diff --git a/app/ui/body.js b/app/ui/body.js new file mode 100644 index 00000000..b717a9b1 --- /dev/null +++ b/app/ui/body.js @@ -0,0 +1,21 @@ +const html = require('choo/html'); +const Header = require('./header'); +const Footer = require('./footer'); + +module.exports = function body(main) { + return function(state, emit) { + const b = html` + + ${state.cache(Header, 'header').render()} ${main(state, emit)} + ${state.cache(Footer, 'footer').render()} + + `; + if (state.layout) { + // server side only + return state.layout(state, b); + } + return b; + }; +}; diff --git a/app/ui/copyDialog.js b/app/ui/copyDialog.js new file mode 100644 index 00000000..5f1f779e --- /dev/null +++ b/app/ui/copyDialog.js @@ -0,0 +1,76 @@ +const html = require('choo/html'); +const { copyToClipboard } = require('../utils'); +const qr = require('./qr'); + +module.exports = function(name, url) { + const dialog = function(state, emit, close) { + return html` + +

+ ${state.translate('notifyUploadEncryptDone')} +

+

+ ${state.translate('copyLinkDescription')}
+ ${name} +

+
+ + +
+ + +
+ `; + + function toggleQR(event) { + event.stopPropagation(); + const shareUrl = document.getElementById('share-url'); + const qrBtn = document.getElementById('qr-btn'); + if (shareUrl.classList.contains('hidden')) { + shareUrl.classList.replace('hidden', 'block'); + qrBtn.classList.replace('w-48', 'w-16'); + } else { + shareUrl.classList.replace('block', 'hidden'); + qrBtn.classList.replace('w-16', 'w-48'); + } + } + + function copy(event) { + event.stopPropagation(); + copyToClipboard(url); + event.target.textContent = state.translate('copiedUrl'); + setTimeout(close, 1000); + } + }; + dialog.type = 'copy'; + return dialog; +}; diff --git a/app/ui/download.js b/app/ui/download.js new file mode 100644 index 00000000..b397fa8e --- /dev/null +++ b/app/ui/download.js @@ -0,0 +1,96 @@ +/* global downloadMetadata */ +const html = require('choo/html'); +const archiveTile = require('./archiveTile'); +const modal = require('./modal'); +const noStreams = require('./noStreams'); +const notFound = require('./notFound'); +const downloadPassword = require('./downloadPassword'); +const downloadCompleted = require('./downloadCompleted'); +const BIG_SIZE = 1024 * 1024 * 256; + +function createFileInfo(state) { + return { + id: state.params.id, + secretKey: state.params.key, + nonce: downloadMetadata.nonce, + requiresPassword: downloadMetadata.pwd + }; +} + +function downloading(state, emit) { + return html` +
+

+ ${state.translate('downloadingTitle')} +

+ ${archiveTile.downloading(state, emit)} +
+ `; +} + +function preview(state, emit) { + if (!state.capabilities.streamDownload && state.fileInfo.size > BIG_SIZE) { + return noStreams(state, emit); + } + return html` +
+

+ ${state.translate('downloadTitle')} +

+

+ ${state.translate('downloadDescription')} +

+ ${archiveTile.preview(state, emit)} +
+ `; +} + +module.exports = function(state, emit) { + let content = ''; + if (!state.fileInfo) { + state.fileInfo = createFileInfo(state); + if (downloadMetadata.status === 404) { + return notFound(state); + } + if (!state.fileInfo.nonce) { + // coming from something like the browser back button + return location.reload(); + } + } + + if (!state.transfer && !state.fileInfo.requiresPassword) { + emit('getMetadata'); + } + + if (state.transfer) { + switch (state.transfer.state) { + case 'downloading': + case 'decrypting': + content = downloading(state, emit); + break; + case 'complete': + content = downloadCompleted(state); + break; + default: + content = preview(state, emit); + } + } else if (state.fileInfo.requiresPassword && !state.fileInfo.password) { + content = downloadPassword(state, emit); + } + return html` +
+ ${state.modal && modal(state, emit)} +
+ ${content} +
+
+ `; +}; diff --git a/app/ui/downloadCompleted.js b/app/ui/downloadCompleted.js new file mode 100644 index 00000000..acdd3044 --- /dev/null +++ b/app/ui/downloadCompleted.js @@ -0,0 +1,32 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +module.exports = function(state) { + const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; + return html` +
+

+ ${state.translate('downloadFinish')} +

+ + + +

+ ${state.translate('trySendDescription')} +

+

+ ${state.translate(btnText)} +

+
+ `; +}; diff --git a/app/ui/downloadPassword.js b/app/ui/downloadPassword.js new file mode 100644 index 00000000..99bbf434 --- /dev/null +++ b/app/ui/downloadPassword.js @@ -0,0 +1,98 @@ +const html = require('choo/html'); + +module.exports = function(state, emit) { + const fileInfo = state.fileInfo; + const invalid = fileInfo.password === null; + + const div = html` +
+

+ ${state.translate('downloadTitle')} +

+

+ ${state.translate('downloadDescription')} +

+
+ + + +
+ +
+ `; + + if (!(div instanceof String)) { + setTimeout(() => document.getElementById('password-input').focus()); + } + + function inputChanged(event) { + event.stopPropagation(); + event.preventDefault(); + const label = document.getElementById('password-error'); + const input = document.getElementById('password-input'); + const btn = document.getElementById('password-btn'); + label.classList.add('invisible'); + input.classList.remove('border-red', 'dark:border-red-40'); + btn.classList.remove( + 'bg-red', + 'hover:bg-red', + 'focus:bg-red', + 'dark:bg-red-40' + ); + } + + function checkPassword(event) { + event.stopPropagation(); + event.preventDefault(); + const el = document.getElementById('password-input'); + const password = el.value; + if (password.length > 0) { + document.getElementById('password-btn').disabled = true; + // Strip any url parameters between fileId and secretKey + const fileInfoUrl = window.location.href.replace(/\?.+#/, '#'); + state.fileInfo.url = fileInfoUrl; + state.fileInfo.password = password; + emit('getMetadata'); + } + return false; + } + + return div; +}; diff --git a/app/ui/error.js b/app/ui/error.js new file mode 100644 index 00000000..241aac7f --- /dev/null +++ b/app/ui/error.js @@ -0,0 +1,35 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const modal = require('./modal'); + +module.exports = function(state, emit) { + const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; + return html` +
+ ${state.modal && modal(state, emit)} +
+

+ ${state.translate('errorPageHeader')} +

+ + + +

+ ${state.translate('trySendDescription')} +

+

+ ${state.translate(btnText)} +

+
+
+ `; +}; diff --git a/app/ui/expiryOptions.js b/app/ui/expiryOptions.js new file mode 100644 index 00000000..2ee489f7 --- /dev/null +++ b/app/ui/expiryOptions.js @@ -0,0 +1,73 @@ +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const { secondsToL10nId } = require('../utils'); +const selectbox = require('./selectbox'); + +module.exports = function(state, emit) { + const el = html` +
+ ${raw( + state.translate('archiveExpiryInfo', { + downloadCount: + '', + timespan: '' + }) + )} +
+ `; + if (el.__encoded) { + // we're rendering on the server + return el; + } + + const counts = state.DEFAULTS.DOWNLOAD_COUNTS.filter( + i => state.capabilities.account || i <= state.user.maxDownloads + ); + + const dlCountSelect = el.querySelector('#dlCount'); + el.replaceChild( + selectbox( + state.archive.dlimit, + counts, + num => state.translate('downloadCount', { num }), + value => { + const selected = parseInt(value); + state.archive.dlimit = selected; + emit('render'); + if (selected > parseInt(state.user.maxDownloads || '0')) { + console.log('Chosen max download count is larger than the allowed limit', selected) + } + }, + 'expire-after-dl-count-select' + ), + dlCountSelect + ); + + const expires = state.DEFAULTS.EXPIRE_TIMES_SECONDS.filter( + i => state.capabilities.account || i <= state.user.maxExpireSeconds + ); + + const timeSelect = el.querySelector('#timespan'); + el.replaceChild( + selectbox( + state.archive.timeLimit, + expires, + num => { + const l10n = secondsToL10nId(num); + return state.translate(l10n.id, l10n); + }, + value => { + const selected = parseInt(value); + state.archive.timeLimit = selected; + emit('render'); + if (selected > parseInt(state.user.maxExpireSeconds || '0')) { + console.log('Chosen download expiration is larger than the allowed limit', selected) + } + }, + 'expire-after-time-select' + ), + timeSelect + ); + + return el; +}; diff --git a/app/ui/faviconProgressbar.js b/app/ui/faviconProgressbar.js new file mode 100644 index 00000000..1faca4d9 --- /dev/null +++ b/app/ui/faviconProgressbar.js @@ -0,0 +1,46 @@ +/*global WEB_UI*/ + +const { platform } = require('../utils'); +const assets = require('../../common/assets'); + +const size = 32; +const loaderWidth = 5; +const loaderColor = WEB_UI.COLORS.PRIMARY; + +function drawCircle(canvas, context, color, lineWidth, outerWidth, percent) { + canvas.width = canvas.height = outerWidth; + context.translate(outerWidth * 0.5, outerWidth * 0.5); + context.rotate(-Math.PI * 0.5); + const radius = (outerWidth - lineWidth) * 0.5; + context.beginPath(); + context.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + context.strokeStyle = color; + context.lineCap = 'square'; + context.lineWidth = lineWidth; + context.stroke(); +} + +function drawNewFavicon(progressRatio) { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + drawCircle(canvas, context, '#efefef', loaderWidth, size, 1); + drawCircle(canvas, context, loaderColor, loaderWidth, size, progressRatio); + return canvas.toDataURL(); +} + +module.exports.updateFavicon = function(progressRatio) { + if (platform() === 'web') { + const link = document.querySelector("link[rel='icon'][sizes='32x32']"); + const progress = progressRatio * 100; + if (progress === 0 || progress === 100) { + link.type = 'image/png'; + link.href = + WEB_UI.CUSTOM_ASSETS.favicon_32px !== '' + ? WEB_UI.CUSTOM_ASSETS.favicon_32px + : assets.get('favicon-32x32.png'); + return; + } + + link.href = drawNewFavicon(progressRatio); + } +}; diff --git a/app/ui/footer.js b/app/ui/footer.js new file mode 100644 index 00000000..77a2b960 --- /dev/null +++ b/app/ui/footer.js @@ -0,0 +1,126 @@ +const html = require('choo/html'); +const Component = require('choo/component'); + +class Footer extends Component { + constructor(name, state) { + super(name); + this.state = state; + } + + update() { + return false; + } + + createElement() { + const translate = this.state.translate; + + // Add additional links from configuration if available + var links = []; + if (this.state != undefined && this.state.WEB_UI != undefined) { + const WEB_UI = this.state.WEB_UI; + + if (WEB_UI.FOOTER_DONATE_URL != '') { + links.push(html` +
  • + + ${translate('footerLinkDonate')} + +
  • + `); + } + if (WEB_UI.FOOTER_CLI_URL != '') { + links.push(html` +
  • + + ${translate('footerLinkCli')} + +
  • + `); + } + if (WEB_UI.FOOTER_DMCA_URL != '') { + links.push(html` +
  • + + ${translate('footerLinkDmca')} + +
  • + `); + } + if (WEB_UI.FOOTER_SOURCE_URL != '') { + links.push(html` +
  • + + ${translate('footerLinkSource')} + +
  • + `); + } + } else { + links.push(html` +
  • + + ${translate('footerLinkSource')} + +
  • + `); + } + + // Defining a custom footer + var footer = []; + if (this.state != undefined && this.state.WEB_UI != undefined) { + const WEB_UI = this.state.WEB_UI; + + if (WEB_UI.CUSTOM_FOOTER_URL != '' && WEB_UI.CUSTOM_FOOTER_TEXT != '') { + footer.push(html` +
  • + + ${WEB_UI.CUSTOM_FOOTER_TEXT} + +
  • + `); + } + else if (WEB_UI.CUSTOM_FOOTER_URL != '') { + footer.push(html` +
  • + + ${WEB_UI.CUSTOM_FOOTER_URL} + +
  • + `); + } + else if (WEB_UI.CUSTOM_FOOTER_TEXT != '') { + footer.push(html` +
  • + ${WEB_UI.CUSTOM_FOOTER_TEXT} +
  • + `) + } + else { + footer.push(html` +
  • + ${translate('footerText')} +
  • + `); + } + } + + return html` +
    +
      + ${footer} +
    +
      + ${links} +
    +
    + `; + } +} + +module.exports = Footer; diff --git a/app/ui/header.js b/app/ui/header.js new file mode 100644 index 00000000..679cb334 --- /dev/null +++ b/app/ui/header.js @@ -0,0 +1,65 @@ +const html = require('choo/html'); +const Component = require('choo/component'); +const Account = require('./account'); +const assets = require('../../common/assets'); +const { platform } = require('../utils'); + +class Header extends Component { + constructor(name, state, emit) { + super(name); + this.state = state; + this.emit = emit; + this.account = state.cache(Account, 'account'); + } + + update() { + this.account.render(); + return false; + } + + createElement() { + let assetMap = {}; + if (this.state.ui !== undefined) assetMap = this.state.ui.assets; + else + assetMap = { + icon: + this.state.WEB_UI.CUSTOM_ASSETS.icon !== '' + ? this.state.WEB_UI.CUSTOM_ASSETS.icon + : assets.get('icon.svg'), + wordmark: + this.state.WEB_UI.CUSTOM_ASSETS.wordmark !== '' + ? this.state.WEB_UI.CUSTOM_ASSETS.wordmark + : assets.get('wordmark.svg') + '#logo' + }; + const title = + platform() === 'android' + ? html` + + + + + + + ` + : html` + + ${this.state.translate('title')} + + + + + `; + return html` +
    + ${title} ${this.account.render()} +
    + `; + } +} + +module.exports = Header; diff --git a/app/ui/home.js b/app/ui/home.js new file mode 100644 index 00000000..86550ff4 --- /dev/null +++ b/app/ui/home.js @@ -0,0 +1,73 @@ +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const { list } = require('../utils'); +const archiveTile = require('./archiveTile'); +const modal = require('./modal'); +const intro = require('./intro'); +const assets = require('../../common/assets'); + +module.exports = function(state, emit) { + const archives = state.storage.files + .filter(archive => !archive.expired) + .map(archive => archiveTile(state, emit, archive)); + let left = ''; + if (state.uploading) { + left = archiveTile.uploading(state, emit); + } else if (state.archive.numFiles > 0) { + left = archiveTile.wip(state, emit); + } else { + left = archiveTile.empty(state, emit); + } + + if (archives.length > 0 && state.WEB_UI.UPLOADS_LIST_NOTICE_HTML) { + archives.push(html` +

    + ${raw(state.WEB_UI.UPLOADS_LIST_NOTICE_HTML)} +

    + `); + } + + archives.reverse(); + + if (archives.length > 0 && state.WEB_UI.SHOW_THUNDERBIRD_SPONSOR) { + archives.push(html` + + + + + Sponsored by Thunderbird + + `); + } + + const right = + archives.length === 0 + ? intro(state) + : list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full'); + + return html` +
    + ${state.modal && modal(state, emit)} +
    +
    ${left}
    +
    ${right}
    +
    +
    + `; +}; diff --git a/app/ui/intro.js b/app/ui/intro.js new file mode 100644 index 00000000..9a53c404 --- /dev/null +++ b/app/ui/intro.js @@ -0,0 +1,55 @@ +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const assets = require('../../common/assets'); + +module.exports = function intro(state) { + const notice = state.WEB_UI.MAIN_NOTICE_HTML + ? html` +

    + ${raw(state.WEB_UI.MAIN_NOTICE_HTML)} +

    + ` + : ''; + + const sponsor = state.WEB_UI.SHOW_THUNDERBIRD_SPONSOR + ? html` + + + + + Sponsored by Thunderbird + + ` + : ''; + + return html` + + ${notice} +
    +

    + ${state.translate('introTitle')} +

    +

    + ${state.translate('introDescription')} +

    +
    + ${sponsor} +
    + `; +}; diff --git a/app/ui/modal.js b/app/ui/modal.js new file mode 100644 index 00000000..3636af8a --- /dev/null +++ b/app/ui/modal.js @@ -0,0 +1,25 @@ +const html = require('choo/html'); + +module.exports = function(state, emit) { + return html` + +
    +
    + ${state.modal(state, emit, close)} +
    +
    +
    + `; + + function close(event) { + if (event) { + event.preventDefault(); + event.stopPropagation(); + } + emit('closeModal'); + } +}; diff --git a/app/ui/noStreams.js b/app/ui/noStreams.js new file mode 100644 index 00000000..c3bc8673 --- /dev/null +++ b/app/ui/noStreams.js @@ -0,0 +1,108 @@ +const html = require('choo/html'); +const { bytes } = require('../utils'); +const assets = require('../../common/assets'); + +module.exports = function(state, emit) { + const archive = state.fileInfo; + return html` +
    +

    ${state.translate( + 'downloadTitle' + )}

    +

    + ⚠️ ${state.translate('noStreamsWarning')} ⚠️ +

    +
    +
    +
    + + + +

    +

    ${ + archive.name + }

    +
    ${bytes( + archive.size + )}
    +

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +

    + ${state.translate('downloadConfirmDescription')} +

    +
    +
    + `; + + function optionChanged(event) { + event.stopPropagation(); + const choice = event.target.value; + const button = event.currentTarget.nextElementSibling; + let title = button.title; + console.error(choice, title); + switch (choice) { + case 'copy': + title = state.translate('copyLinkButton'); + break; + case 'firefox': + title = state.translate('downloadFirefox'); + break; + case 'download': + title = state.translate('downloadButtonLabel'); + break; + } + button.title = title; + button.value = title; + } + + function submit(event) { + const action = document.querySelector('input[type="radio"]:checked').value; + switch (action) { + case 'copy': + emit('copy', { url: window.location.href }); + document.querySelector('input[type="submit"]').value = state.translate( + 'copiedUrl' + ); + break; + case 'firefox': + window.open( + 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com' + ); + break; + case 'download': + emit('download'); + break; + } + return false; + } +}; diff --git a/app/ui/notFound.js b/app/ui/notFound.js new file mode 100644 index 00000000..5cf1ce64 --- /dev/null +++ b/app/ui/notFound.js @@ -0,0 +1,35 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const modal = require('./modal'); + +module.exports = function(state, emit) { + const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; + return html` +
    + ${state.modal && modal(state, emit)} +
    +

    + ${state.translate('expiredTitle')} +

    + + + +

    + ${state.translate('trySendDescription')} +

    +

    + ${state.translate(btnText)} +

    +
    +
    + `; +}; diff --git a/app/ui/okDialog.js b/app/ui/okDialog.js new file mode 100644 index 00000000..cb8c3c6a --- /dev/null +++ b/app/ui/okDialog.js @@ -0,0 +1,20 @@ +const html = require('choo/html'); + +module.exports = function(message) { + return function(state, emit, close) { + return html` + +

    + ${message} +

    + +
    + `; + }; +}; diff --git a/app/ui/qr.js b/app/ui/qr.js new file mode 100644 index 00000000..8f78865b --- /dev/null +++ b/app/ui/qr.js @@ -0,0 +1,10 @@ +const raw = require('choo/html/raw'); +const qrcode = require('../qrcode'); + +module.exports = function(url) { + const gen = qrcode(0, 'L'); + gen.addData(url); + gen.make(); + const qr = gen.createSvgTag({ scalable: true }); + return raw(qr); +}; diff --git a/app/ui/selectbox.js b/app/ui/selectbox.js new file mode 100644 index 00000000..836332b8 --- /dev/null +++ b/app/ui/selectbox.js @@ -0,0 +1,35 @@ +const html = require('choo/html'); + +module.exports = function(selected, options, translate, changed, htmlId) { + function choose(event) { + if (event.target.value != selected) { + console.log( + 'Selected new value from dropdown', + htmlId, + ':', + selected, + '->', + event.target.value + ); + changed(event.target.value); + } + } + + return html` + + `; +}; diff --git a/app/ui/shareDialog.js b/app/ui/shareDialog.js new file mode 100644 index 00000000..86b17bd7 --- /dev/null +++ b/app/ui/shareDialog.js @@ -0,0 +1,61 @@ +const html = require('choo/html'); + +module.exports = function(name, url) { + const dialog = function(state, emit, close) { + return html` + +

    + ${state.translate('notifyUploadEncryptDone')} +

    +

    + ${state.translate('shareLinkDescription')}
    + ${name} +

    + + + +
    + `; + + async function share(event) { + event.stopPropagation(); + try { + await navigator.share({ + title: state.translate('-send-brand'), + text: state.translate('shareMessage', { name }), + url + }); + } catch (e) { + if (e.code === e.ABORT_ERR) { + return; + } + console.error(e); + } + close(); + } + }; + dialog.type = 'share'; + return dialog; +}; diff --git a/app/ui/signupDialog.js b/app/ui/signupDialog.js new file mode 100644 index 00000000..596e446f --- /dev/null +++ b/app/ui/signupDialog.js @@ -0,0 +1,89 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const { bytes } = require('../utils'); + +module.exports = function() { + return function(state, emit, close) { + const DAYS = Math.floor(state.LIMITS.MAX_EXPIRE_SECONDS / 86400); + let submitting = false; + return html` + + +
    +

    + ${state.translate('accountBenefitTitle')} +

    +
      +
    • + ${state.translate('accountBenefitLargeFiles', { + size: bytes(state.LIMITS.MAX_FILE_SIZE) + })} +
    • +
    • ${state.translate('accountBenefitDownloadCount')}
    • +
    • + ${state.translate('accountBenefitTimeLimit', { count: DAYS })} +
    • +
    • ${state.translate('accountBenefitSync')}
    • +
    +
    +
    +
    + + +
    + ${state.user.loginRequired + ? '' + : html` + + `} +
    +
    + `; + + function emailish(str) { + if (!str) { + return false; + } + // just check if it's the right shape + const a = str.split('@'); + return a.length === 2 && a.every(s => s.length > 0); + } + + function cancel(event) { + close(event); + } + + function submitEmail(event) { + event.preventDefault(); + if (submitting) { + return; + } + submitting = true; + + const el = document.getElementById('email-input'); + const email = el.value; + emit('login', emailish(email) ? email : null); + } + }; +}; diff --git a/app/ui/surveyDialog.js b/app/ui/surveyDialog.js new file mode 100644 index 00000000..02c3236d --- /dev/null +++ b/app/ui/surveyDialog.js @@ -0,0 +1,42 @@ +const html = require('choo/html'); +const version = require('../../package.json').version; +const { browserName } = require('../utils'); + +module.exports = function() { + return function(state, emit, close) { + const surveyUrl = `${ + state.PREFS.surveyUrl + }?ver=${version}&browser=${browserName()}&anon=${ + state.user.loggedIn + }&active_count=${state.storage.files.length}`; + return html` + +

    + Tell us what you think. +

    +

    + Love Send? Take a quick survey to let us know how we can make it + better. +

    + + Give feedback + + +
    + `; + }; +}; diff --git a/app/ui/unsupported.js b/app/ui/unsupported.js new file mode 100644 index 00000000..97a1eb5a --- /dev/null +++ b/app/ui/unsupported.js @@ -0,0 +1,57 @@ +const html = require('choo/html'); +const modal = require('./modal'); + +module.exports = function(state, emit) { + let strings = {}; + let why = ''; + let url = ''; + + if (state.params.reason !== 'outdated') { + strings = unsupportedStrings(state); + why = html` + + ${state.translate('notSupportedLink')} + + `; + url = + 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com'; + } else { + strings = outdatedStrings(state); + url = 'https://support.mozilla.org/kb/update-firefox-latest-version'; + } + + return html` +
    + ${state.modal && modal(state, emit)} +
    +

    ${strings.header}

    +

    ${strings.description}

    + ${why} + + ${strings.button} + +
    +
    + `; +}; + +function outdatedStrings(state) { + return { + header: state.translate('notSupportedHeader'), + description: state.translate('notSupportedOutdatedDetail'), + button: state.translate('updateFirefox') + }; +} + +function unsupportedStrings(state) { + return { + header: state.translate('notSupportedHeader'), + description: state.translate('notSupportedDescription'), + button: state.translate('downloadFirefox') + }; +} diff --git a/app/user.js b/app/user.js new file mode 100644 index 00000000..be3aef2a --- /dev/null +++ b/app/user.js @@ -0,0 +1,293 @@ +import assets from '../common/assets'; +import { getFileList, setFileList } from './api'; +import { encryptStream, decryptStream } from './ece'; +import { arrayToB64, b64ToArray, streamToArrayBuffer } from './utils'; +import { blobStream } from './streams'; +import { getFileListKey, prepareScopedBundleKey, preparePkce } from './fxa'; +import storage from './storage'; + +const textEncoder = new TextEncoder(); +const textDecoder = new TextDecoder(); +const anonId = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); + +async function hashId(id) { + const d = new Date(); + const month = d.getUTCMonth(); + const year = d.getUTCFullYear(); + const encoded = textEncoder.encode(`${id}:${year}:${month}`); + const hash = await crypto.subtle.digest('SHA-256', encoded); + return arrayToB64(new Uint8Array(hash.slice(16))); +} + +export default class User { + constructor(storage, limits, authConfig) { + this.authConfig = authConfig; + this.limits = limits; + this.storage = storage; + this.data = storage.user || {}; + } + + get info() { + return this.data || this.storage.user || {}; + } + + set info(data) { + this.data = data; + this.storage.user = data; + } + + get firstAction() { + return this.storage.get('firstAction'); + } + + set firstAction(action) { + this.storage.set('firstAction', action); + } + + get surveyed() { + return this.storage.get('surveyed'); + } + + set surveyed(yes) { + this.storage.set('surveyed', yes); + } + + get avatar() { + const defaultAvatar = assets.get('user.svg'); + if (this.info.avatarDefault) { + return defaultAvatar; + } + return this.info.avatar || defaultAvatar; + } + + get name() { + return this.info.displayName; + } + + get email() { + return this.info.email; + } + + get loggedIn() { + return !!this.info.access_token; + } + + get bearerToken() { + return this.info.access_token; + } + + get refreshToken() { + return this.info.refresh_token; + } + + get maxSize() { + return this.limits.MAX_FILE_SIZE; + } + + get maxExpireSeconds() { + return this.limits.MAX_EXPIRE_SECONDS; + } + + get maxDownloads() { + return this.limits.MAX_DOWNLOADS; + } + + async metricId() { + return this.loggedIn ? hashId(this.info.uid) : undefined; + } + + async deviceId() { + return this.loggedIn ? hashId(this.storage.id) : hashId(anonId); + } + + async startAuthFlow(trigger, utms = {}) { + this.utms = utms; + this.trigger = trigger; + this.flowId = null; + this.flowBeginTime = null; + } + + async login(email) { + const state = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); + storage.set('oauthState', state); + const keys_jwk = await prepareScopedBundleKey(this.storage); + const code_challenge = await preparePkce(this.storage); + const options = { + action: 'email', + access_type: 'offline', + client_id: this.authConfig.client_id, + code_challenge, + code_challenge_method: 'S256', + response_type: 'code', + scope: `profile ${this.authConfig.key_scope}`, + state, + keys_jwk + }; + if (email) { + options.email = email; + } + if (this.flowId && this.flowBeginTime) { + options.flow_id = this.flowId; + options.flow_begin_time = this.flowBeginTime; + } + if (this.trigger) { + options.entrypoint = `send-${this.trigger}`; + } + if (this.utms) { + options.utm_campaign = this.utms.campaign || 'none'; + options.utm_content = this.utms.content || 'none'; + options.utm_medium = this.utms.medium || 'none'; + options.utm_source = this.utms.source || 'send'; + options.utm_term = this.utms.term || 'none'; + } + const params = new URLSearchParams(options); + location.assign( + `${this.authConfig.authorization_endpoint}?${params.toString()}` + ); + } + + async finishLogin(code, state) { + const localState = storage.get('oauthState'); + storage.remove('oauthState'); + if (state !== localState) { + throw new Error('state mismatch'); + } + const tokenResponse = await fetch(this.authConfig.token_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + code, + client_id: this.authConfig.client_id, + code_verifier: this.storage.get('pkceVerifier') + }) + }); + const auth = await tokenResponse.json(); + const infoResponse = await fetch(this.authConfig.userinfo_endpoint, { + method: 'GET', + headers: { + Authorization: `Bearer ${auth.access_token}` + } + }); + const userInfo = await infoResponse.json(); + userInfo.access_token = auth.access_token; + userInfo.refresh_token = auth.refresh_token; + userInfo.fileListKey = await getFileListKey(this.storage, auth.keys_jwe); + this.info = userInfo; + this.storage.remove('pkceVerifier'); + } + + async refresh() { + if (!this.refreshToken) { + return false; + } + try { + const tokenResponse = await fetch(this.authConfig.token_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + client_id: this.authConfig.client_id, + grant_type: 'refresh_token', + refresh_token: this.refreshToken + }) + }); + if (tokenResponse.ok) { + const auth = await tokenResponse.json(); + const info = { ...this.info, access_token: auth.access_token }; + this.info = info; + return true; + } + } catch (e) { + console.error(e); + } + await this.logout(); + return false; + } + + async logout() { + try { + if (this.refreshToken) { + await fetch(this.authConfig.revocation_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + refresh_token: this.refreshToken + }) + }); + } + if (this.bearerToken) { + await fetch(this.authConfig.revocation_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + token: this.bearerToken + }) + }); + } + } catch (e) { + console.error(e); + // oh well, we tried + } + this.storage.clearLocalFiles(); + this.info = {}; + } + + async syncFileList() { + let changes = { incoming: false, outgoing: false, downloadCount: false }; + if (!this.loggedIn) { + return this.storage.merge(); + } + let list = []; + const key = b64ToArray(this.info.fileListKey); + const sha = await crypto.subtle.digest('SHA-256', key); + const kid = arrayToB64(new Uint8Array(sha)).substring(0, 16); + const retry = async () => { + const refreshed = await this.refresh(); + if (refreshed) { + return await this.syncFileList(); + } else { + return { incoming: true }; + } + }; + try { + const encrypted = await getFileList(this.bearerToken, kid); + const decrypted = await streamToArrayBuffer( + decryptStream(blobStream(encrypted), key) + ); + list = JSON.parse(textDecoder.decode(decrypted)); + } catch (e) { + if (e.message === '401') { + return retry(e); + } + } + changes = await this.storage.merge(list); + if (!changes.outgoing) { + return changes; + } + try { + const blob = new Blob([ + textEncoder.encode(JSON.stringify(this.storage.files)) + ]); + const encrypted = await streamToArrayBuffer( + encryptStream(blobStream(blob), key) + ); + await setFileList(this.bearerToken, kid, encrypted); + } catch (e) { + if (e.message === '401') { + return retry(e); + } + } + return changes; + } + + toJSON() { + return this.info; + } +} diff --git a/app/utils.js b/app/utils.js index 06f480f9..80ed462a 100644 --- a/app/utils.js +++ b/app/utils.js @@ -1,3 +1,10 @@ +/* global Android */ +let html; +try { + html = require('choo/html'); +} catch (e) { + // running in the service worker +} const b64 = require('base64-js'); function arrayToB64(array) { @@ -9,25 +16,11 @@ function arrayToB64(array) { } function b64ToArray(str) { - str = (str + '==='.slice((str.length + 3) % 4)) - .replace(/-/g, '+') - .replace(/_/g, '/'); - return b64.toByteArray(str); + return b64.toByteArray(str + '==='.slice((str.length + 3) % 4)); } -function notify(str) { - return str; - /* TODO: enable once we have an opt-in ui element - if (!('Notification' in window)) { - return; - } else if (Notification.permission === 'granted') { - new Notification(str); - } else if (Notification.permission !== 'denied') { - Notification.requestPermission(function(permission) { - if (permission === 'granted') new Notification(str); - }); - } - */ +function locale() { + return document.querySelector('html').lang; } function loadShim(polyfill) { @@ -40,34 +33,8 @@ function loadShim(polyfill) { }); } -async function canHasSend(polyfill) { - try { - const key = await window.crypto.subtle.generateKey( - { - name: 'AES-GCM', - length: 128 - }, - true, - ['encrypt', 'decrypt'] - ); - - await window.crypto.subtle.encrypt( - { - name: 'AES-GCM', - iv: window.crypto.getRandomValues(new Uint8Array(12)), - tagLength: 128 - }, - key, - new ArrayBuffer(8) - ); - return true; - } catch (err) { - return loadShim(polyfill); - } -} - function isFile(id) { - return /^[0-9a-fA-F]{10}$/.test(id); + return /^[0-9a-fA-F]{10,16}$/.test(id); } function copyToClipboard(str) { @@ -79,7 +46,7 @@ function copyToClipboard(str) { if (navigator.userAgent.match(/iphone|ipad|ipod/i)) { const range = document.createRange(); range.selectNodeContents(aux); - const sel = window.getSelection(); + const sel = getSelection(); sel.removeAllRanges(); sel.addRange(range); aux.setSelectionRange(0, str.length); @@ -98,33 +65,35 @@ const LOCALIZE_NUMBERS = !!( typeof navigator === 'object' ); -const UNITS = ['B', 'kB', 'MB', 'GB']; +const UNITS = ['bytes', 'kb', 'mb', 'gb']; function bytes(num) { if (num < 1) { return '0B'; } const exponent = Math.min(Math.floor(Math.log10(num) / 3), UNITS.length - 1); - const n = Number(num / Math.pow(1000, exponent)); - let nStr = n.toFixed(1); + const n = Number(num / Math.pow(1024, exponent)); + const decimalDigits = Math.floor(n) === n ? 0 : 1; + let nStr = n.toFixed(decimalDigits); if (LOCALIZE_NUMBERS) { try { - const locale = document.querySelector('html').lang; - nStr = n.toLocaleString(locale, { - minimumFractionDigits: 1, - maximumFractionDigits: 1 + nStr = n.toLocaleString(locale(), { + minimumFractionDigits: decimalDigits, + maximumFractionDigits: decimalDigits }); } catch (e) { // fall through } } - return `${nStr}${UNITS[exponent]}`; + return translate('fileSize', { + num: nStr, + units: translate(UNITS[exponent]) + }); } function percent(ratio) { if (LOCALIZE_NUMBERS) { try { - const locale = document.querySelector('html').lang; - return ratio.toLocaleString(locale, { style: 'percent' }); + return ratio.toLocaleString(locale(), { style: 'percent' }); } catch (e) { // fall through } @@ -132,6 +101,13 @@ function percent(ratio) { return `${Math.floor(ratio * 100)}%`; } +function number(n) { + if (LOCALIZE_NUMBERS) { + return n.toLocaleString(locale()); + } + return n.toString(); +} + function allowedCopy() { const support = !!document.queryCommandSupported; return support ? document.queryCommandSupported('copy') : false; @@ -141,26 +117,185 @@ function delay(delay = 100) { return new Promise(resolve => setTimeout(resolve, delay)); } -function fadeOut(id) { - const classes = document.getElementById(id).classList; - classes.remove('fadeIn'); - classes.add('fadeOut'); +function fadeOut(selector) { + const classes = document.querySelector(selector).classList; + classes.remove('effect--fadeIn'); + classes.add('effect--fadeOut'); return delay(300); } -const ONE_DAY_IN_MS = 86400000; +function openLinksInNewTab(links, should = true) { + links = links || Array.from(document.querySelectorAll('a:not([target])')); + if (should) { + links.forEach(l => { + l.setAttribute('target', '_blank'); + l.setAttribute('rel', 'noopener noreferrer'); + }); + } else { + links.forEach(l => { + l.removeAttribute('target'); + l.removeAttribute('rel'); + }); + } + return links; +} + +function browserName() { + try { + // order of these matters + if (/firefox/i.test(navigator.userAgent)) { + return 'firefox'; + } + if (/edge/i.test(navigator.userAgent)) { + return 'edge'; + } + if (/edg/i.test(navigator.userAgent)) { + return 'edgium'; + } + if (/trident/i.test(navigator.userAgent)) { + return 'ie'; + } + if (/chrome/i.test(navigator.userAgent)) { + return 'chrome'; + } + if (/safari/i.test(navigator.userAgent)) { + return 'safari'; + } + if (/send android/i.test(navigator.userAgent)) { + return 'android-app'; + } + return 'other'; + } catch (e) { + return 'unknown'; + } +} + +async function streamToArrayBuffer(stream, size) { + const reader = stream.getReader(); + let state = await reader.read(); + + if (size) { + const result = new Uint8Array(size); + let offset = 0; + while (!state.done) { + result.set(state.value, offset); + offset += state.value.length; + state = await reader.read(); + } + return result.buffer; + } + + const parts = []; + let len = 0; + while (!state.done) { + parts.push(state.value); + len += state.value.length; + state = await reader.read(); + } + let offset = 0; + const result = new Uint8Array(len); + for (const part of parts) { + result.set(part, offset); + offset += part.length; + } + return result.buffer; +} + +function list(items, ulStyle = '', liStyle = '') { + const lis = items.map( + i => + html` +
  • ${i}
  • + ` + ); + return html` +
      + ${lis} +
    + `; +} + +function secondsToL10nId(seconds) { + if (seconds < 3600) { + return { id: 'timespanMinutes', num: Math.floor(seconds / 60) }; + } else if (seconds < 86400) { + return { id: 'timespanHours', num: Math.floor(seconds / 3600) }; + } else { + return { id: 'timespanDays', num: Math.floor(seconds / 86400) }; + } +} + +function timeLeft(milliseconds) { + if (milliseconds < 1) { + return { id: 'linkExpiredAlt' }; + } + const minutes = Math.floor(milliseconds / 1000 / 60); + const hours = Math.floor(minutes / 60); + const days = Math.floor(hours / 24); + if (days >= 1) { + return { + id: 'expiresDaysHoursMinutes', + days, + hours: hours % 24, + minutes: minutes % 60 + }; + } + if (hours >= 1) { + return { + id: 'expiresHoursMinutes', + hours, + minutes: minutes % 60 + }; + } else if (hours === 0) { + if (minutes === 0) { + return { id: 'expiresMinutes', minutes: '< 1' }; + } + return { id: 'expiresMinutes', minutes }; + } + return null; +} + +function platform() { + if (typeof Android === 'object') { + return 'android'; + } + return 'web'; +} + +const ECE_RECORD_SIZE = 1024 * 64; +const TAG_LENGTH = 16; +function encryptedSize(size, rs = ECE_RECORD_SIZE, tagLength = TAG_LENGTH) { + const chunk_meta = tagLength + 1; // Chunk metadata, tag and delimiter + return 21 + size + chunk_meta * Math.ceil(size / (rs - chunk_meta)); +} + +let translate = function() { + throw new Error('uninitialized translate function. call setTranslate first'); +}; +function setTranslate(t) { + translate = t; +} module.exports = { + locale, fadeOut, delay, allowedCopy, bytes, percent, + number, copyToClipboard, arrayToB64, b64ToArray, - notify, - canHasSend, + loadShim, isFile, - ONE_DAY_IN_MS + openLinksInNewTab, + browserName, + streamToArrayBuffer, + list, + secondsToL10nId, + timeLeft, + platform, + encryptedSize, + setTranslate }; diff --git a/app/zip.js b/app/zip.js new file mode 100644 index 00000000..57d751cb --- /dev/null +++ b/app/zip.js @@ -0,0 +1,186 @@ +import crc32 from 'crc/crc32'; + +const encoder = new TextEncoder(); + +function dosDateTime(dateTime = new Date()) { + const year = (dateTime.getFullYear() - 1980) << 9; + const month = (dateTime.getMonth() + 1) << 5; + const day = dateTime.getDate(); + const date = year | month | day; + const hour = dateTime.getHours() << 11; + const minute = dateTime.getMinutes() << 5; + const second = Math.floor(dateTime.getSeconds() / 2); + const time = hour | minute | second; + + return { date, time }; +} + +class File { + constructor(info) { + this.name = encoder.encode(info.name); + this.size = info.size; + this.bytesRead = 0; + this.crc = null; + this.dateTime = dosDateTime(); + } + + get header() { + const h = new ArrayBuffer(30 + this.name.byteLength); + const v = new DataView(h); + v.setUint32(0, 0x04034b50, true); // sig + v.setUint16(4, 20, true); // version + v.setUint16(6, 0x808, true); // bit flags (use data descriptor(8) + utf8-encoded(8 << 8)) + v.setUint16(8, 0, true); // compression + v.setUint16(10, this.dateTime.time, true); // modified time + v.setUint16(12, this.dateTime.date, true); // modified date + v.setUint32(14, 0, true); // crc32 (in descriptor) + v.setUint32(18, 0, true); // compressed size (in descriptor) + v.setUint32(22, 0, true); // uncompressed size (in descriptor) + v.setUint16(26, this.name.byteLength, true); // name length + v.setUint16(28, 0, true); // extra field length + for (let i = 0; i < this.name.byteLength; i++) { + v.setUint8(30 + i, this.name[i]); + } + return new Uint8Array(h); + } + + get dataDescriptor() { + const dd = new ArrayBuffer(16); + const v = new DataView(dd); + v.setUint32(0, 0x08074b50, true); // sig + v.setUint32(4, this.crc, true); // crc32 + v.setUint32(8, this.size, true); // compressed size + v.setUint32(12, this.size, true); // uncompressed size + return new Uint8Array(dd); + } + + directoryRecord(offset) { + const dr = new ArrayBuffer(46 + this.name.byteLength); + const v = new DataView(dr); + v.setUint32(0, 0x02014b50, true); // sig + v.setUint16(4, 20, true); // version made + v.setUint16(6, 20, true); // version required + v.setUint16(8, 0x808, true); // bit flags (use data descriptor(8) + utf8-encoded(8 << 8)) + v.setUint16(10, 0, true); // compression + v.setUint16(12, this.dateTime.time, true); // modified time + v.setUint16(14, this.dateTime.date, true); // modified date + v.setUint32(16, this.crc, true); // crc + v.setUint32(20, this.size, true); // compressed size + v.setUint32(24, this.size, true); // uncompressed size + v.setUint16(28, this.name.byteLength, true); // name length + v.setUint16(30, 0, true); // extra length + v.setUint16(32, 0, true); // comment length + v.setUint16(34, 0, true); // disk number + v.setUint16(36, 0, true); // internal file attrs + v.setUint32(38, 0, true); // external file attrs + v.setUint32(42, offset, true); // file offset + for (let i = 0; i < this.name.byteLength; i++) { + v.setUint8(46 + i, this.name[i]); + } + return new Uint8Array(dr); + } + + get byteLength() { + return this.size + this.name.byteLength + 30 + 16; + } + + append(data, controller) { + this.bytesRead += data.byteLength; + const endIndex = data.byteLength - Math.max(this.bytesRead - this.size, 0); + const buf = data.slice(0, endIndex); + this.crc = crc32(buf, this.crc); + controller.enqueue(buf); + if (endIndex < data.byteLength) { + return data.slice(endIndex, data.byteLength); + } + } +} + +function centralDirectory(files, controller) { + let directoryOffset = 0; + let directorySize = 0; + for (let i = 0; i < files.length; i++) { + const file = files[i]; + const record = file.directoryRecord(directoryOffset); + directoryOffset += file.byteLength; + controller.enqueue(record); + directorySize += record.byteLength; + } + controller.enqueue(eod(files.length, directorySize, directoryOffset)); +} + +function eod(fileCount, directorySize, directoryOffset) { + const e = new ArrayBuffer(22); + const v = new DataView(e); + v.setUint32(0, 0x06054b50, true); // sig + v.setUint16(4, 0, true); // disk number + v.setUint16(6, 0, true); // directory disk + v.setUint16(8, fileCount, true); // number of records + v.setUint16(10, fileCount, true); // total records + v.setUint32(12, directorySize, true); // size of directory + v.setUint32(16, directoryOffset, true); // offset of directory + v.setUint16(20, 0, true); // comment length + return new Uint8Array(e); +} + +class ZipStreamController { + constructor(files, source) { + this.files = files; + this.fileIndex = 0; + this.file = null; + this.reader = source.getReader(); + this.nextFile(); + this.extra = null; + } + + nextFile() { + this.file = this.files[this.fileIndex++]; + } + + async pull(controller) { + if (!this.file) { + // end of archive + centralDirectory(this.files, controller); + return controller.close(); + } + if (this.file.bytesRead === 0) { + // beginning of file + controller.enqueue(this.file.header); + if (this.extra) { + this.extra = this.file.append(this.extra, controller); + } + } + if (this.file.bytesRead >= this.file.size) { + // end of file + controller.enqueue(this.file.dataDescriptor); + this.nextFile(); + return this.pull(controller); + } + const data = await this.reader.read(); + if (data.done) { + this.nextFile(); + return this.pull(controller); + } + this.extra = this.file.append(data.value, controller); + } +} + +export default class Zip { + constructor(manifest, source) { + this.files = manifest.files.map(info => new File(info)); + this.source = source; + } + + get stream() { + return new ReadableStream(new ZipStreamController(this.files, this.source)); + } + + get size() { + const entries = this.files.reduce( + (total, file) => total + file.byteLength * 2 - file.size, + 0 + ); + const eod = 22; + return entries + eod; + } +} diff --git a/assets/add.svg b/assets/add.svg new file mode 100644 index 00000000..84db8c30 --- /dev/null +++ b/assets/add.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/addfiles.svg b/assets/addfiles.svg new file mode 100644 index 00000000..3d6749d9 --- /dev/null +++ b/assets/addfiles.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/android-chrome-192x192.png b/assets/android-chrome-192x192.png new file mode 100644 index 00000000..044cba97 Binary files /dev/null and b/assets/android-chrome-192x192.png differ diff --git a/assets/android-chrome-512x512.png b/assets/android-chrome-512x512.png new file mode 100644 index 00000000..553bda11 Binary files /dev/null and b/assets/android-chrome-512x512.png differ diff --git a/assets/apple-touch-icon.png b/assets/apple-touch-icon.png new file mode 100644 index 00000000..ddb56ec1 Binary files /dev/null and b/assets/apple-touch-icon.png differ diff --git a/assets/bg.svg b/assets/bg.svg new file mode 100644 index 00000000..02457110 --- /dev/null +++ b/assets/bg.svg @@ -0,0 +1,31 @@ + + + + 71CDA8D6-6870-4A28-B45F-707A97F95302 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/blue_file.svg b/assets/blue_file.svg new file mode 100644 index 00000000..2945487f --- /dev/null +++ b/assets/blue_file.svg @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/assets/check-16-blue.svg b/assets/check-16-blue.svg deleted file mode 100644 index a2633292..00000000 --- a/assets/check-16-blue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/check-16.svg b/assets/check-16.svg deleted file mode 100644 index 4243e0dc..00000000 --- a/assets/check-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/close-16.svg b/assets/close-16.svg index 21207a15..9a9da6d3 100644 --- a/assets/close-16.svg +++ b/assets/close-16.svg @@ -1 +1 @@ - + diff --git a/assets/completed.svg b/assets/completed.svg new file mode 100644 index 00000000..4c693d3d --- /dev/null +++ b/assets/completed.svg @@ -0,0 +1,260 @@ + + + + + + image/svg+xml + + CC310D7B-7EC7-4AEF-90E5-10044C2FA0F1 + + + + + CC310D7B-7EC7-4AEF-90E5-10044C2FA0F1 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/copy-16.svg b/assets/copy-16.svg index c5cee826..56bed4a8 100644 --- a/assets/copy-16.svg +++ b/assets/copy-16.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/assets/cryptofill.js b/assets/cryptofill.js deleted file mode 100644 index db29a332..00000000 --- a/assets/cryptofill.js +++ /dev/null @@ -1,22 +0,0 @@ -var liner=function(e){function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}var t={};return r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=16)}([function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),function(e){function n(e){for(var r=[],t=1;t=0;s--){var c=i[s],u=c.arg.substring(1),h=c.index+1;a=a.substring(0,h)+arguments[+u]+a.substring(h+1+u.length)}return a=a.replace("%%","%")}function a(e){var r;r="string"==typeof e?{name:e}:e,h.checkAlgorithm(r);var t=e;return t.hash&&(t.hash=a(t.hash)),r}function o(e,r){if(!e)throw new s("Parameter '"+r+"' is required and cant be empty");if("undefined"!=typeof Buffer&&Buffer.isBuffer(e))return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer);if(e instanceof ArrayBuffer)return new Uint8Array(e);throw new s("Incoming parameter '"+r+"' has wrong data type. Must be ArrayBufferView or ArrayBuffer")}t.d(r,"WebCryptoError",function(){return s}),t.d(r,"AlgorithmError",function(){return c}),t.d(r,"CryptoKeyError",function(){return u}),t.d(r,"PrepareAlgorithm",function(){return a}),t.d(r,"PrepareData",function(){return o}),t.d(r,"BaseCrypto",function(){return h}),t.d(r,"AlgorithmNames",function(){return p}),t.d(r,"Base64Url",function(){return l}),t.d(r,"SubtleCrypto",function(){return W}),t.d(r,"Aes",function(){return m}),t.d(r,"AesAlgorithmError",function(){return A}),t.d(r,"AesWrapKey",function(){return w}),t.d(r,"AesEncrypt",function(){return v}),t.d(r,"AesECB",function(){return g}),t.d(r,"AesCBC",function(){return C}),t.d(r,"AesCTR",function(){return d}),t.d(r,"AesGCM",function(){return E}),t.d(r,"AesKW",function(){return P}),t.d(r,"RsaKeyGenParamsError",function(){return N}),t.d(r,"RsaHashedImportParamsError",function(){return G}),t.d(r,"Rsa",function(){return M}),t.d(r,"RsaSSA",function(){return B}),t.d(r,"RsaPSSParamsError",function(){return T}),t.d(r,"RsaPSS",function(){return D}),t.d(r,"RsaOAEPParamsError",function(){return x}),t.d(r,"RsaOAEP",function(){return H}),t.d(r,"EcKeyGenParamsError",function(){return S}),t.d(r,"Ec",function(){return _}),t.d(r,"EcAlgorithmError",function(){return U}),t.d(r,"EcDSA",function(){return L}),t.d(r,"EcDH",function(){return R}),t.d(r,"ShaAlgorithms",function(){return k}),t.d(r,"Sha",function(){return b});var i=t(6),s=function(e){function r(r){for(var t=[],a=1;a0&&e.length<=128))throw new A(A.PARAM_WRONG_VALUE,"length","number [1-128]")},r}(v);d.ALG_NAME=p.AesCTR;var E=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithmParams=function(e){if(this.checkAlgorithm(e),e.additionalData&&!(ArrayBuffer.isView(e.additionalData)||e.additionalData instanceof ArrayBuffer))throw new A(A.PARAM_WRONG_TYPE,"additionalData","ArrayBufferView or ArrayBuffer");if(!e.iv)throw new A(A.PARAM_REQUIRED,"iv");if(!(ArrayBuffer.isView(e.iv)||e.iv instanceof ArrayBuffer))throw new A(A.PARAM_WRONG_TYPE,"iv","ArrayBufferView or ArrayBuffer");if(e.tagLength){if(![32,64,96,104,112,120,128].some(function(r){return r===e.tagLength}))throw new A(A.PARAM_WRONG_VALUE,"tagLength","32, 64, 96, 104, 112, 120 or 128")}},r}(v);E.ALG_NAME=p.AesGCM;var P=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithmParams=function(e){this.checkAlgorithm(e)},r}(w);P.ALG_NAME=p.AesKW,P.KEY_USAGES=["wrapKey","unwrapKey"];var k=[p.Sha1,p.Sha256,p.Sha384,p.Sha512].join(" | "),b=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithm=function(r){var t;switch(t="string"==typeof r?{name:r}:r,e.checkAlgorithm.call(this,t),t.name.toUpperCase()){case p.Sha1:case p.Sha256:case p.Sha384:case p.Sha512:break;default:throw new c(c.WRONG_ALG_NAME,t.name,k)}},r.digest=function(e,r){var t=this;return new Promise(function(r,n){t.checkAlgorithm(e),r(void 0)})},r}(h),S=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r.code=9,r}return t.i(i.a)(r,e),r}(c),_=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithm=function(e){if(e.name.toUpperCase()!==this.ALG_NAME.toUpperCase())throw new c(c.WRONG_ALG_NAME,e.name,this.ALG_NAME)},r.checkKeyGenParams=function(e){if(!e.namedCurve)throw new S(S.PARAM_REQUIRED,"namedCurve");if("string"!=typeof e.namedCurve)throw new S(S.PARAM_WRONG_TYPE,"namedCurve","string");switch(e.namedCurve.toUpperCase()){case"P-256":case"P-384":case"P-521":break;default:throw new S(S.PARAM_WRONG_VALUE,"namedCurve","P-256, P-384 or P-521")}},r.checkKeyGenUsages=function(e){var r=this;e.forEach(function(e){var t=0;for(t;t0&&e.length<=512))throw new c(c.PARAM_WRONG_VALUE,"length","more 0 and less than 512")},r.checkKeyGenUsages=function(e){var r=this;this.checkKeyUsages(e),e.forEach(function(e){var t=0;for(t;t=256&&r<=16384)||r%8)throw new N(N.PARAM_WRONG_VALUE,"modulusLength"," a multiple of 8 bits and >= 256 and <= 16384");var t=e.publicExponent;if(!t)throw new N(N.PARAM_REQUIRED,"publicExponent");if(!ArrayBuffer.isView(t))throw new N(N.PARAM_WRONG_TYPE,"publicExponent","ArrayBufferView");if(3!==t[0]&&(1!==t[0]||0!==t[1]||1!==t[2]))throw new N(N.PARAM_WRONG_VALUE,"publicExponent","Uint8Array([3]) | Uint8Array([1, 0, 1])");if(!e.hash)throw new N(N.PARAM_REQUIRED,"hash",k);b.checkAlgorithm(e.hash)},r.checkKeyGenUsages=function(e){var r=this;this.checkKeyUsages(e),e.forEach(function(e){var t=0;for(t;t>>16&65535,n=65535&e,a=r>>>16&65535,o=65535&r;return n*o+(t*o+n*a<<16>>>0)|0})},function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){}return e}();r.CryptoKey=n},function(e,r,t){"use strict";function n(e,r){function t(){this.constructor=e}a(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}r.a=n;/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -var a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])};Object.assign},function(e,r,t){"use strict";function n(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}Object.defineProperty(r,"__esModule",{value:!0}),n(t(4)),n(t(2))},function(e,r,t){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])};return function(r,t){function n(){this.constructor=r}e(r,t),r.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var a=t(0),o=t(1),i=t(5),s=t(3),c=t(4),u=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.generateKey=function(e,r,t){var n=this;return Promise.resolve().then(function(){n.checkModule();var a=c.nativeCrypto.getRandomValues(new Uint8Array(e.length/8)),o=new i.CryptoKey;return o.key=a,o.algorithm=e,o.extractable=r,o.type="secret",o.usages=t,o})},r.encrypt=function(e,r,t){return Promise.resolve().then(function(){var n;switch(e.name.toUpperCase()){case a.AlgorithmNames.AesECB:;n=asmCrypto.AES_ECB.encrypt(t,r.key,!0);break;case a.AlgorithmNames.AesCBC:var i=e;n=asmCrypto.AES_CBC.encrypt(t,r.key,void 0,a.PrepareData(i.iv,"iv"));break;case a.AlgorithmNames.AesGCM:var s=e;s.tagLength=s.tagLength||128;var c=void 0;s.additionalData&&(c=a.PrepareData(s.additionalData,"additionalData")),n=asmCrypto.AES_GCM.encrypt(t,r.key,s.iv,c,s.tagLength/8);break;default:throw new o.LinerError(a.AlgorithmError.UNSUPPORTED_ALGORITHM,e.name)}return n.buffer})},r.decrypt=function(e,r,t){return Promise.resolve().then(function(){var n;switch(e.name.toUpperCase()){case a.AlgorithmNames.AesECB:;n=asmCrypto.AES_ECB.decrypt(t,r.key,!0);break;case a.AlgorithmNames.AesCBC:var i=e;n=asmCrypto.AES_CBC.decrypt(t,r.key,void 0,a.PrepareData(i.iv,"iv"));break;case a.AlgorithmNames.AesGCM:var s=e;s.tagLength=s.tagLength||128;var c=void 0;s.additionalData&&(c=a.PrepareData(s.additionalData,"additionalData")),n=asmCrypto.AES_GCM.decrypt(t,r.key,s.iv,c,s.tagLength/8);break;default:throw new o.LinerError(a.AlgorithmError.UNSUPPORTED_ALGORITHM,e.name)}return n.buffer})},r.wrapKey=function(e,r,t,n){var a;return Promise.resolve().then(function(){return a=new h.Crypto,a.subtle.exportKey(e,r)}).then(function(e){var r;return r=e instanceof ArrayBuffer?new Uint8Array(e):s.string2buffer(JSON.stringify(e)),a.subtle.encrypt(n,t,r)})},r.unwrapKey=function(e,r,t,n,a,o,i){var c;return Promise.resolve().then(function(){return c=new h.Crypto,c.subtle.decrypt(n,t,r)}).then(function(r){var t;return t="jwk"===e.toLowerCase()?JSON.parse(s.buffer2string(new Uint8Array(r))):new Uint8Array(r),c.subtle.importKey(e,t,a,o,i)})},r.alg2jwk=function(e){return"A"+e.length+/-(\w+)/i.exec(e.name.toUpperCase())[1]},r.jwk2alg=function(e){throw new Error("Not implemented")},r.exportKey=function(e,r){var t=this;return Promise.resolve().then(function(){var n=r.key;if("jwk"===e.toLowerCase()){return{alg:t.alg2jwk(r.algorithm),ext:r.extractable,k:a.Base64Url.encode(n),key_ops:r.usages,kty:"oct"}}return n.buffer})},r.importKey=function(e,r,t,n,o){return Promise.resolve().then(function(){var n;if("jwk"===e.toLowerCase()){var s=r;n=a.Base64Url.decode(s.k)}else n=new Uint8Array(r);var c=new i.CryptoKey;return c.algorithm=t,c.type="secret",c.usages=o,c.key=n,c})},r.checkModule=function(){if("undefined"==typeof asmCrypto)throw new o.LinerError(o.LinerError.MODULE_NOT_FOUND,"asmCrypto","https://github.com/vibornoff/asmcrypto.js")},r}(a.BaseCrypto);r.AesCrypto=u;var h=t(2)},function(e,r,t){"use strict";function n(e){for(var r=new Uint8Array(e),t=[],n=0;n32?o>48?66:48:32,t.length32?o>48?66:48:32,t.length/232?o>48?66:48:32,a.length-1&&("public"===e.type||"secret"===e.type)&&e.usages.push(t)}),["sign","decrypt","unwrapKey","deriveKey","deriveBits"].forEach(function(t){r.indexOf(t)>-1&&("private"===e.type||"secret"===e.type)&&e.usages.push(t)})))})}function s(e,r,t){if(r&&A.BrowserInfo().name===A.Browser.IE){"extractable"in e&&(e.ext=e.extractable,delete e.extractable);var n=null;switch(r.name.toUpperCase()){case h.AlgorithmNames.RsaOAEP.toUpperCase():case h.AlgorithmNames.RsaPSS.toUpperCase():case h.AlgorithmNames.RsaSSA.toUpperCase():n=g.RsaCrypto;break;case h.AlgorithmNames.AesECB.toUpperCase():case h.AlgorithmNames.AesCBC.toUpperCase():case h.AlgorithmNames.AesGCM.toUpperCase():n=w.AesCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,r.name.toUpperCase())}n&&!e.alg&&(e.alg=n.alg2jwk(r)),"key_ops"in e||(e.key_ops=t)}}function c(e){A.BrowserInfo().name===A.Browser.IE&&("ext"in e&&(e.extractable=e.ext,delete e.ext),delete e.key_ops,delete e.alg)}var u=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])};return function(r,t){function n(){this.constructor=r}e(r,t),r.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var h=t(0),p=t(0),f=t(0),l=t(4),y=t(2),m=t(1),A=t(3),w=t(8),v=t(11),g=t(10),C=t(9),d=[],E=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return u(r,e),r.prototype.generateKey=function(r,t,n){var o,s=arguments;return e.prototype.generateKey.apply(this,s).then(function(e){if(o=f.PrepareAlgorithm(r),(A.BrowserInfo().name!==A.Browser.Edge||o.name.toUpperCase()!==h.AlgorithmNames.AesGCM)&&l.nativeSubtle)try{return l.nativeSubtle.generateKey.apply(l.nativeSubtle,s).catch(function(e){console.warn("WebCrypto: native generateKey for "+o.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native generateKey for "+o.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return i(e,n),a(o,e),e;var r;switch(o.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():r=w.AesCrypto;break;case h.AlgorithmNames.EcDSA.toLowerCase():case h.AlgorithmNames.EcDH.toLowerCase():r=C.EcCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():case h.AlgorithmNames.RsaSSA.toLowerCase():r=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,o.name.toLowerCase())}return r.generateKey(o,t,n)})},r.prototype.digest=function(r,t){var n,a,o=arguments;return e.prototype.digest.apply(this,o).then(function(e){if(n=f.PrepareAlgorithm(r),a=f.PrepareData(t,"data"),l.nativeSubtle)try{return l.nativeSubtle.digest.apply(l.nativeSubtle,o).catch(function(e){console.warn("WebCrypto: native digest for "+n.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native digest for "+n.name+" doesn't work.",e.message||"")}}).then(function(e){return e||v.ShaCrypto.digest(n,a)})},r.prototype.sign=function(r,t,a){var i,s,c=arguments;return e.prototype.sign.apply(this,c).then(function(e){i=f.PrepareAlgorithm(r),s=f.PrepareData(a,"data");var n=o(t);if(n&&(c[0]=A.assign(i,n)),l.nativeSubtle)try{return l.nativeSubtle.sign.apply(l.nativeSubtle,c).catch(function(e){console.warn("WebCrypto: native sign for "+i.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native sign for "+i.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return e;var r;switch(i.name.toLowerCase()){case h.AlgorithmNames.EcDSA.toLowerCase():r=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():r=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,i.name.toLowerCase())}return n(t,r).then(function(e){return r.sign(i,e,s)})})},r.prototype.verify=function(r,t,a,i){var s,c,u,p=arguments;return e.prototype.verify.apply(this,p).then(function(e){s=f.PrepareAlgorithm(r),c=f.PrepareData(a,"data"),u=f.PrepareData(i,"data");var n=o(t);if(n&&(p[0]=A.assign(s,n)),l.nativeSubtle)try{return l.nativeSubtle.verify.apply(l.nativeSubtle,p).catch(function(e){console.warn("WebCrypto: native verify for "+s.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native verify for "+s.name+" doesn't work.",e.message||"")}}).then(function(e){if("boolean"==typeof e)return e;var r;switch(s.name.toLowerCase()){case h.AlgorithmNames.EcDSA.toLowerCase():r=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():r=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,s.name.toLowerCase())}return n(t,r).then(function(e){return r.verify(s,e,c,u)})})},r.prototype.deriveBits=function(r,t,n){var a,o=arguments;return e.prototype.deriveBits.apply(this,o).then(function(e){if(a=f.PrepareAlgorithm(r),l.nativeSubtle)try{return l.nativeSubtle.deriveBits.apply(l.nativeSubtle,o).catch(function(e){console.warn("WebCrypto: native deriveBits for "+a.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native deriveBits for "+a.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return e;var r;switch(a.name.toLowerCase()){case h.AlgorithmNames.EcDH.toLowerCase():r=C.EcCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"deriveBits")}return r.deriveBits(a,t,n)})},r.prototype.deriveKey=function(r,t,n,a,o){var s,c,u=arguments;return e.prototype.deriveKey.apply(this,u).then(function(e){if(s=f.PrepareAlgorithm(r),c=f.PrepareAlgorithm(n),l.nativeSubtle)try{return l.nativeSubtle.deriveKey.apply(l.nativeSubtle,u).catch(function(e){console.warn("WebCrypto: native deriveKey for "+s.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native deriveKey for "+s.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return i(e,o),e;var r;switch(s.name.toLowerCase()){case h.AlgorithmNames.EcDH.toLowerCase():r=C.EcCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"deriveBits")}return r.deriveKey(s,t,c,a,o)})},r.prototype.encrypt=function(r,t,a){var o,i,s=arguments;return e.prototype.encrypt.apply(this,s).then(function(e){if(o=f.PrepareAlgorithm(r),i=f.PrepareData(a,"data"),l.nativeSubtle)try{return l.nativeSubtle.encrypt.apply(l.nativeSubtle,s).catch(function(e){console.warn("WebCrypto: native 'encrypt' for "+o.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'encrypt' for "+o.name+" doesn't work.",e.message||"")}}).then(function(e){if(e){if(A.BrowserInfo().name===A.Browser.IE&&o.name.toUpperCase()===h.AlgorithmNames.AesGCM&&e.ciphertext){var r=new Uint8Array(e.ciphertext.byteLength+e.tag.byteLength),a=0;new Uint8Array(e.ciphertext).forEach(function(e){return r[a++]=e}),new Uint8Array(e.tag).forEach(function(e){return r[a++]=e}),e=r.buffer}return Promise.resolve(e)}var s;switch(o.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():s=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():s=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"encrypt")}return n(t,s).then(function(e){return s.encrypt(o,e,i)})})},r.prototype.decrypt=function(r,t,n){var a,o,i=arguments;return e.prototype.decrypt.apply(this,i).then(function(e){a=f.PrepareAlgorithm(r),o=f.PrepareData(n,"data");var i=o;if(A.BrowserInfo().name===A.Browser.IE&&a.name.toUpperCase()===h.AlgorithmNames.AesGCM){var s=o.byteLength-a.tagLength/8;i={ciphertext:o.buffer.slice(0,s),tag:o.buffer.slice(s,o.byteLength)}}if(t.key){var c=void 0;switch(a.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():c=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():c=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"decrypt")}return c.decrypt(a,t,o)}return l.nativeSubtle.decrypt.call(l.nativeSubtle,a,t,i)})},r.prototype.wrapKey=function(r,t,n,a){var o,i=arguments;return e.prototype.wrapKey.apply(this,i).then(function(e){if(o=f.PrepareAlgorithm(a),l.nativeSubtle)try{return l.nativeSubtle.wrapKey.apply(l.nativeSubtle,i).catch(function(e){console.warn("WebCrypto: native 'wrapKey' for "+o.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'wrapKey' for "+o.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return e;var a;switch(o.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():a=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():a=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"wrapKey")}return a.wrapKey(r,t,n,o)})},r.prototype.unwrapKey=function(r,t,n,a,o,s,c){var u,p,y,v=this,C=arguments;return e.prototype.unwrapKey.apply(this,C).then(function(e){if(u=f.PrepareAlgorithm(a),p=f.PrepareAlgorithm(o),y=f.PrepareData(t,"wrappedKey"),n.key){var d=void 0;switch(u.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():d=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():d=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"unwrapKey")}return d.unwrapKey(r,y,n,u,p,s,c)}return l.nativeSubtle.unwrapKey.apply(l.nativeSubtle,C).catch(function(e){return v.decrypt(u,n,t).then(function(e){var t;return t="jwk"===r?JSON.parse(A.buffer2string(new Uint8Array(e))):e,v.importKey(r,t,p,s,c)})}).then(function(e){if(e)return i(e,c),e}).catch(function(e){throw console.error(e),new Error("Cannot unwrap key from incoming data")})})},r.prototype.exportKey=function(r,t){var n=arguments;return e.prototype.exportKey.apply(this,n).then(function(){if(l.nativeSubtle)try{return l.nativeSubtle.exportKey.apply(l.nativeSubtle,n).catch(function(e){console.warn("WebCrypto: native 'exportKey' for "+t.algorithm.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'exportKey' for "+t.algorithm.name+" doesn't work.",e.message||"")}}).then(function(e){if(e){"jwk"===r&&e instanceof ArrayBuffer&&(e=A.buffer2string(new Uint8Array(e)),e=JSON.parse(e));var n=o(t);return n||(n=A.assign({},t.algorithm)),s(e,n,t.usages),Promise.resolve(e)}if(!t.key)throw new m.LinerError("Cannot export native CryptoKey from JS implementation");var a;switch(t.algorithm.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():a=w.AesCrypto;break;case h.AlgorithmNames.EcDH.toLowerCase():case h.AlgorithmNames.EcDSA.toLowerCase():a=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():case h.AlgorithmNames.RsaOAEP.toLowerCase():a=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,t.algorithm.name.toLowerCase())}return a.exportKey(r,t)})},r.prototype.importKey=function(r,t,n,o,s){var u,p,y=arguments;return e.prototype.importKey.apply(this,y).then(function(e){if(u=f.PrepareAlgorithm(n),p=t,A.BrowserInfo().name!==A.Browser.Safari&&A.BrowserInfo().name!==A.Browser.IE||(A.BrowserInfo().name===A.Browser.IE&&(t=A.assign({},t),c(t)),y[1]=A.string2buffer(JSON.stringify(t)).buffer),ArrayBuffer.isView(t)&&(p=f.PrepareData(t,"keyData")),l.nativeSubtle)try{return l.nativeSubtle.importKey.apply(l.nativeSubtle,y).catch(function(e){console.warn("WebCrypto: native 'importKey' for "+u.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'importKey' for "+u.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return a(u,e),i(e,s),Promise.resolve(e);var t;switch(u.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():t=w.AesCrypto;break;case h.AlgorithmNames.EcDH.toLowerCase():case h.AlgorithmNames.EcDSA.toLowerCase():t=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():case h.AlgorithmNames.RsaOAEP.toLowerCase():t=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,u.name.toLowerCase())}return t.importKey(r,p,u,o,s)})},r}(p.SubtleCrypto);r.SubtleCrypto=E,Uint8Array.prototype.forEach||(Uint8Array.prototype.forEach=function(e){for(var r=0;re;e++){var g=a.charCodeAt(e);if(b&&g>=55296&&56319>=g){if(++e>=c)throw new Error("Malformed string, low surrogate expected at position "+e);g=(55296^g)<<10|65536|56320^a.charCodeAt(e)}else if(!b&&g>>>8)throw new Error("Wide characters are not allowed.");!b||127>=g?d[f++]=g:2047>=g?(d[f++]=192|g>>6,d[f++]=128|63&g):65535>=g?(d[f++]=224|g>>12,d[f++]=128|g>>6&63,d[f++]=128|63&g):(d[f++]=240|g>>18,d[f++]=128|g>>12&63,d[f++]=128|g>>6&63,d[f++]=128|63&g)}return d.subarray(0,f)}function g(a){var b=a.length;1&b&&(a="0"+a,b++);for(var c=new Uint8Array(b>>1),d=0;b>d;d+=2)c[d>>1]=parseInt(a.substr(d,2),16);return c}function h(a){return f(atob(a))}function i(a,b){b=!!b;for(var c=a.length,d=new Array(c),e=0,f=0;c>e;e++){var g=a[e];if(!b||128>g)d[f++]=g;else if(g>=192&&224>g&&c>e+1)d[f++]=(31&g)<<6|63&a[++e];else if(g>=224&&240>g&&c>e+2)d[f++]=(15&g)<<12|(63&a[++e])<<6|63&a[++e];else{if(!(g>=240&&248>g&&c>e+3))throw new Error("Malformed UTF8 character at byte offset "+e);var h=(7&g)<<18|(63&a[++e])<<12|(63&a[++e])<<6|63&a[++e];65535>=h?d[f++]=h:(h^=65536,d[f++]=55296|h>>10,d[f++]=56320|1023&h)}}for(var i="",j=16384,e=0;f>e;e+=j)i+=String.fromCharCode.apply(String,d.slice(e,f>=e+j?e+j:f));return i}function j(a){for(var b="",c=0;c>>1,a|=a>>>2,a|=a>>>4,a|=a>>>8,a|=a>>>16,a+=1}function m(a){return"number"==typeof a}function n(a){return"string"==typeof a}function o(a){return a instanceof ArrayBuffer}function p(a){return a instanceof Uint8Array}function q(a){return a instanceof Int8Array||a instanceof Uint8Array||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array}function r(a,b){var c=b.heap,d=c?c.byteLength:b.heapSize||65536;if(4095&d||0>=d)throw new Error("heap size must be a positive integer and a multiple of 4096");return c=c||new a(new ArrayBuffer(d))}function s(a,b,c,d,e){var f=a.length-b,g=e>f?f:e;return a.set(c.subarray(d,d+g),b),g}function t(a){a=a||{},this.heap=r(Uint8Array,a).subarray(Xa.HEAP_DATA),this.asm=a.asm||Xa(b,null,this.heap.buffer),this.mode=null,this.key=null,this.reset(a)}function u(a){if(void 0!==a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("unexpected key type");a=f(a)}var b=a.length;if(16!==b&&24!==b&&32!==b)throw new d("illegal key size");var c=new DataView(a.buffer,a.byteOffset,a.byteLength);this.asm.set_key(b>>2,c.getUint32(0),c.getUint32(4),c.getUint32(8),c.getUint32(12),b>16?c.getUint32(16):0,b>16?c.getUint32(20):0,b>24?c.getUint32(24):0,b>24?c.getUint32(28):0),this.key=a}else if(!this.key)throw new Error("key is required")}function v(a){if(void 0!==a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("unexpected iv type");a=f(a)}if(16!==a.length)throw new d("illegal iv size");var b=new DataView(a.buffer,a.byteOffset,a.byteLength);this.iv=a,this.asm.set_iv(b.getUint32(0),b.getUint32(4),b.getUint32(8),b.getUint32(12))}else this.iv=null,this.asm.set_iv(0,0,0,0)}function w(a){void 0!==a?this.padding=!!a:this.padding=!0}function x(a){return a=a||{},this.result=null,this.pos=0,this.len=0,u.call(this,a.key),this.hasOwnProperty("iv")&&v.call(this,a.iv),this.hasOwnProperty("padding")&&w.call(this,a.padding),this}function y(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,c=this.heap,d=Xa.ENC[this.mode],e=Xa.HEAP_DATA,g=this.pos,h=this.len,i=0,j=a.length||0,k=0,l=h+j&-16,m=0,q=new Uint8Array(l);j>0;)m=s(c,g+h,a,i,j),h+=m,i+=m,j-=m,m=b.cipher(d,e+g,h),m&&q.set(c.subarray(g,g+m),k),k+=m,h>m?(g+=m,h-=m):(g=0,h=0);return this.result=q,this.pos=g,this.len=h,this}function z(a){var b=null,c=0;void 0!==a&&(b=y.call(this,a).result,c=b.length);var e=this.asm,f=this.heap,g=Xa.ENC[this.mode],h=Xa.HEAP_DATA,i=this.pos,j=this.len,k=16-j%16,l=j;if(this.hasOwnProperty("padding")){if(this.padding){for(var m=0;k>m;++m)f[i+j+m]=k;j+=k,l=j}else if(j%16)throw new d("data length must be a multiple of the block size")}else j+=k;var n=new Uint8Array(c+l);return c&&n.set(b),j&&e.cipher(g,h+i,j),l&&n.set(f.subarray(i,i+l),c),this.result=n,this.pos=0,this.len=0,this}function A(a){this.nonce=null,this.counter=0,this.counterSize=0,t.call(this,a),this.mode="CTR"}function B(a){A.call(this,a)}function C(a,b,c){if(void 0!==c){if(8>c||c>48)throw new d("illegal counter size");this.counterSize=c;var e=Math.pow(2,c)-1;this.asm.set_mask(0,0,e/4294967296|0,0|e)}else this.counterSize=c=48,this.asm.set_mask(0,0,65535,4294967295);if(void 0===a)throw new Error("nonce is required");if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("unexpected nonce type");a=f(a)}var g=a.length;if(!g||g>16)throw new d("illegal nonce size");this.nonce=a;var h=new DataView(new ArrayBuffer(16));if(new Uint8Array(h.buffer).set(a),this.asm.set_nonce(h.getUint32(0),h.getUint32(4),h.getUint32(8),h.getUint32(12)),void 0!==b){if(!m(b))throw new TypeError("unexpected counter type");if(0>b||b>=Math.pow(2,c))throw new d("illegal counter value");this.counter=b,this.asm.set_counter(0,0,b/4294967296|0,0|b)}else this.counter=b=0}function D(a){return a=a||{},x.call(this,a),C.call(this,a.nonce,a.counter,a.counterSize),this}function E(a){for(var b=this.heap,c=this.asm,d=0,e=a.length||0,f=0;e>0;){for(f=s(b,0,a,d,e),d+=f,e-=f;15&f;)b[f++]=0;c.mac(Xa.MAC.GCM,Xa.HEAP_DATA,f)}}function F(a){this.nonce=null,this.adata=null,this.iv=null,this.counter=1,this.tagSize=16,t.call(this,a),this.mode="GCM"}function G(a){F.call(this,a)}function H(a){F.call(this,a)}function I(a){a=a||{},x.call(this,a);var b=this.asm,c=this.heap;b.gcm_init();var e=a.tagSize;if(void 0!==e){if(!m(e))throw new TypeError("tagSize must be a number");if(4>e||e>16)throw new d("illegal tagSize value");this.tagSize=e}else this.tagSize=16;var g=a.nonce;if(void 0===g)throw new Error("nonce is required");if(p(g)||o(g))g=new Uint8Array(g);else{if(!n(g))throw new TypeError("unexpected nonce type");g=f(g)}this.nonce=g;var h=g.length||0,i=new Uint8Array(16);12!==h?(E.call(this,g),c[0]=c[1]=c[2]=c[3]=c[4]=c[5]=c[6]=c[7]=c[8]=c[9]=c[10]=0,c[11]=h>>>29,c[12]=h>>>21&255,c[13]=h>>>13&255,c[14]=h>>>5&255,c[15]=h<<3&255,b.mac(Xa.MAC.GCM,Xa.HEAP_DATA,16),b.get_iv(Xa.HEAP_DATA),b.set_iv(),i.set(c.subarray(0,16))):(i.set(g),i[15]=1);var j=new DataView(i.buffer);this.gamma0=j.getUint32(12),b.set_nonce(j.getUint32(0),j.getUint32(4),j.getUint32(8),0),b.set_mask(0,0,0,4294967295);var k=a.adata;if(void 0!==k&&null!==k){if(p(k)||o(k))k=new Uint8Array(k);else{if(!n(k))throw new TypeError("unexpected adata type");k=f(k)}if(k.length>$a)throw new d("illegal adata length");k.length?(this.adata=k,E.call(this,k)):this.adata=null}else this.adata=null;var l=a.counter;if(void 0!==l){if(!m(l))throw new TypeError("counter must be a number");if(1>l||l>4294967295)throw new RangeError("counter must be a positive 32-bit integer");this.counter=l,b.set_counter(0,0,0,this.gamma0+l|0)}else this.counter=1,b.set_counter(0,0,0,this.gamma0+1|0);var q=a.iv;if(void 0!==q){if(!m(l))throw new TypeError("counter must be a number");this.iv=q,v.call(this,q)}return this}function J(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");var b=0,c=a.length||0,d=this.asm,e=this.heap,g=this.counter,h=this.pos,i=this.len,j=0,k=i+c&-16,l=0;if((g-1<<4)+i+c>$a)throw new RangeError("counter overflow");for(var m=new Uint8Array(k);c>0;)l=s(e,h+i,a,b,c),i+=l,b+=l,c-=l,l=d.cipher(Xa.ENC.CTR,Xa.HEAP_DATA+h,i),l=d.mac(Xa.MAC.GCM,Xa.HEAP_DATA+h,l),l&&m.set(e.subarray(h,h+l),j),g+=l>>>4,j+=l,i>l?(h+=l,i-=l):(h=0,i=0);return this.result=m,this.counter=g,this.pos=h,this.len=i,this}function K(){var a=this.asm,b=this.heap,c=this.counter,d=this.tagSize,e=this.adata,f=this.pos,g=this.len,h=new Uint8Array(g+d);a.cipher(Xa.ENC.CTR,Xa.HEAP_DATA+f,g+15&-16),g&&h.set(b.subarray(f,f+g));for(var i=g;15&i;i++)b[f+i]=0;a.mac(Xa.MAC.GCM,Xa.HEAP_DATA+f,i);var j=null!==e?e.length:0,k=(c-1<<4)+g;return b[0]=b[1]=b[2]=0,b[3]=j>>>29,b[4]=j>>>21,b[5]=j>>>13&255,b[6]=j>>>5&255,b[7]=j<<3&255,b[8]=b[9]=b[10]=0,b[11]=k>>>29,b[12]=k>>>21&255,b[13]=k>>>13&255,b[14]=k>>>5&255,b[15]=k<<3&255,a.mac(Xa.MAC.GCM,Xa.HEAP_DATA,16),a.get_iv(Xa.HEAP_DATA),a.set_counter(0,0,0,this.gamma0),a.cipher(Xa.ENC.CTR,Xa.HEAP_DATA,16),h.set(b.subarray(0,d),g),this.result=h,this.counter=1,this.pos=0,this.len=0,this}function L(a){var b=J.call(this,a).result,c=K.call(this).result,d=new Uint8Array(b.length+c.length);return b.length&&d.set(b),c.length&&d.set(c,b.length),this.result=d,this}function M(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");var b=0,c=a.length||0,d=this.asm,e=this.heap,g=this.counter,h=this.tagSize,i=this.pos,j=this.len,k=0,l=j+c>h?j+c-h&-16:0,m=j+c-l,q=0;if((g-1<<4)+j+c>$a)throw new RangeError("counter overflow");for(var r=new Uint8Array(l);c>m;)q=s(e,i+j,a,b,c-m),j+=q,b+=q,c-=q,q=d.mac(Xa.MAC.GCM,Xa.HEAP_DATA+i,q),q=d.cipher(Xa.DEC.CTR,Xa.HEAP_DATA+i,q),q&&r.set(e.subarray(i,i+q),k),g+=q>>>4,k+=q,i=0,j=0;return c>0&&(j+=s(e,0,a,b,c)),this.result=r,this.counter=g,this.pos=i,this.len=j,this}function N(){var a=this.asm,b=this.heap,d=this.tagSize,f=this.adata,g=this.counter,h=this.pos,i=this.len,j=i-d,k=0;if(d>i)throw new c("authentication tag not found");for(var l=new Uint8Array(j),m=new Uint8Array(b.subarray(h+j,h+i)),n=j;15&n;n++)b[h+n]=0;k=a.mac(Xa.MAC.GCM,Xa.HEAP_DATA+h,n),k=a.cipher(Xa.DEC.CTR,Xa.HEAP_DATA+h,n),j&&l.set(b.subarray(h,h+j));var o=null!==f?f.length:0,p=(g-1<<4)+i-d;b[0]=b[1]=b[2]=0,b[3]=o>>>29,b[4]=o>>>21,b[5]=o>>>13&255,b[6]=o>>>5&255,b[7]=o<<3&255,b[8]=b[9]=b[10]=0,b[11]=p>>>29,b[12]=p>>>21&255,b[13]=p>>>13&255,b[14]=p>>>5&255,b[15]=p<<3&255,a.mac(Xa.MAC.GCM,Xa.HEAP_DATA,16),a.get_iv(Xa.HEAP_DATA),a.set_counter(0,0,0,this.gamma0),a.cipher(Xa.ENC.CTR,Xa.HEAP_DATA,16);for(var q=0,n=0;d>n;++n)q|=m[n]^b[n];if(q)throw new e("data integrity check failed");return this.result=l,this.counter=1,this.pos=0,this.len=0,this}function O(a){var b=M.call(this,a).result,c=N.call(this).result,d=new Uint8Array(b.length+c.length);return b.length&&d.set(b),c.length&&d.set(c,b.length),this.result=d,this}function P(a,b,c,d,e){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");if(void 0===c)throw new SyntaxError("nonce required");return new F({heap:cb,asm:db,key:b,nonce:c,adata:d,tagSize:e}).encrypt(a).result}function Q(a,b,c,d,e){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");if(void 0===c)throw new SyntaxError("nonce required");return new F({heap:cb,asm:db,key:b,nonce:c,adata:d,tagSize:e}).decrypt(a).result}function R(){return this.result=null,this.pos=0,this.len=0,this.asm.reset(),this}function S(a){if(null!==this.result)throw new c("state must be reset before processing new data");if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,d=this.heap,e=this.pos,g=this.len,h=0,i=a.length,j=0;i>0;)j=s(d,e+g,a,h,i),g+=j,h+=j,i-=j,j=b.process(e,g),e+=j,g-=j,g||(e=0);return this.pos=e,this.len=g,this}function T(){if(null!==this.result)throw new c("state must be reset before processing new data");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this}function U(a,b,c){"use asm";var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;var D=new a.Uint8Array(c);function E(Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;da=da|0;var ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;ea=d;fa=e;ga=f;ha=g;ia=h;ja=i;ka=j;la=k;ma=Q+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1116352408|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=R+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1899447441|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=S+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3049323471|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=T+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3921009573|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=U+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+961987163|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=V+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1508970993|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=W+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2453635748|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=X+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2870763221|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=Y+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3624381080|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=Z+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+310598401|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=$+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+607225278|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=_+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1426881987|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=aa+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1925078388|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=ba+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2162078206|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=ca+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2614888103|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=da+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3248222580|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Q=ma=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3835390401|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;R=ma=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(da>>>17^da>>>19^da>>>10^da<<15^da<<13)+R+$|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+4022224774|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;S=ma=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+264347078|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;T=ma=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+604807628|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;U=ma=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+770255983|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;V=ma=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1249150122|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;W=ma=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+da|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1555081692|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;X=ma=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1996064986|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Y=ma=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2554220882|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Z=ma=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2821834349|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;$=ma=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2952996808|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;_=ma=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3210313671|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;aa=ma=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3336571891|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ba=ma=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3584528711|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ca=ma=(da>>>7^da>>>18^da>>>3^da<<25^da<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+113926993|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;da=ma=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+da+Y|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+338241895|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Q=ma=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+666307205|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;R=ma=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(da>>>17^da>>>19^da>>>10^da<<15^da<<13)+R+$|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+773529912|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;S=ma=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1294757372|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;T=ma=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1396182291|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;U=ma=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1695183700|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;V=ma=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1986661051|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;W=ma=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+da|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2177026350|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;X=ma=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2456956037|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Y=ma=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2730485921|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Z=ma=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2820302411|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;$=ma=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3259730800|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;_=ma=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3345764771|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;aa=ma=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3516065817|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ba=ma=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3600352804|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ca=ma=(da>>>7^da>>>18^da>>>3^da<<25^da<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+4094571909|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;da=ma=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+da+Y|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+275423344|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Q=ma=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+430227734|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;R=ma=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(da>>>17^da>>>19^da>>>10^da<<15^da<<13)+R+$|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+506948616|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;S=ma=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+659060556|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;T=ma=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+883997877|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;U=ma=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+958139571|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;V=ma=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1322822218|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;W=ma=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+da|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1537002063|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;X=ma=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1747873779|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Y=ma=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1955562222|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Z=ma=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2024104815|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;$=ma=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2227730452|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;_=ma=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2361852424|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;aa=ma=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2428436474|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ba=ma=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2756734187|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ca=ma=(da>>>7^da>>>18^da>>>3^da<<25^da<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3204031479|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;da=ma=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+da+Y|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3329325298|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;d=d+ea|0;e=e+fa|0;f=f+ga|0;g=g+ha|0;h=h+ia|0;i=i+ja|0;j=j+ka|0;k=k+la|0}function F(Q){Q=Q|0;E(D[Q|0]<<24|D[Q|1]<<16|D[Q|2]<<8|D[Q|3],D[Q|4]<<24|D[Q|5]<<16|D[Q|6]<<8|D[Q|7],D[Q|8]<<24|D[Q|9]<<16|D[Q|10]<<8|D[Q|11],D[Q|12]<<24|D[Q|13]<<16|D[Q|14]<<8|D[Q|15],D[Q|16]<<24|D[Q|17]<<16|D[Q|18]<<8|D[Q|19],D[Q|20]<<24|D[Q|21]<<16|D[Q|22]<<8|D[Q|23],D[Q|24]<<24|D[Q|25]<<16|D[Q|26]<<8|D[Q|27],D[Q|28]<<24|D[Q|29]<<16|D[Q|30]<<8|D[Q|31],D[Q|32]<<24|D[Q|33]<<16|D[Q|34]<<8|D[Q|35],D[Q|36]<<24|D[Q|37]<<16|D[Q|38]<<8|D[Q|39],D[Q|40]<<24|D[Q|41]<<16|D[Q|42]<<8|D[Q|43],D[Q|44]<<24|D[Q|45]<<16|D[Q|46]<<8|D[Q|47],D[Q|48]<<24|D[Q|49]<<16|D[Q|50]<<8|D[Q|51],D[Q|52]<<24|D[Q|53]<<16|D[Q|54]<<8|D[Q|55],D[Q|56]<<24|D[Q|57]<<16|D[Q|58]<<8|D[Q|59],D[Q|60]<<24|D[Q|61]<<16|D[Q|62]<<8|D[Q|63])}function G(Q){Q=Q|0;D[Q|0]=d>>>24;D[Q|1]=d>>>16&255;D[Q|2]=d>>>8&255;D[Q|3]=d&255;D[Q|4]=e>>>24;D[Q|5]=e>>>16&255;D[Q|6]=e>>>8&255;D[Q|7]=e&255;D[Q|8]=f>>>24;D[Q|9]=f>>>16&255;D[Q|10]=f>>>8&255;D[Q|11]=f&255;D[Q|12]=g>>>24;D[Q|13]=g>>>16&255;D[Q|14]=g>>>8&255;D[Q|15]=g&255;D[Q|16]=h>>>24;D[Q|17]=h>>>16&255;D[Q|18]=h>>>8&255;D[Q|19]=h&255;D[Q|20]=i>>>24;D[Q|21]=i>>>16&255;D[Q|22]=i>>>8&255;D[Q|23]=i&255;D[Q|24]=j>>>24;D[Q|25]=j>>>16&255;D[Q|26]=j>>>8&255;D[Q|27]=j&255;D[Q|28]=k>>>24;D[Q|29]=k>>>16&255;D[Q|30]=k>>>8&255;D[Q|31]=k&255}function H(){d=1779033703;e=3144134277;f=1013904242;g=2773480762;h=1359893119;i=2600822924;j=528734635;k=1541459225;l=m=0}function I(Q,R,S,T,U,V,W,X,Y,Z){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;d=Q;e=R;f=S;g=T;h=U;i=V;j=W;k=X;l=Y;m=Z}function J(Q,R){Q=Q|0;R=R|0;var S=0;if(Q&63)return-1;while((R|0)>=64){F(Q);Q=Q+64|0;R=R-64|0;S=S+64|0}l=l+S|0;if(l>>>0>>0)m=m+1|0;return S|0}function K(Q,R,S){Q=Q|0;R=R|0;S=S|0;var T=0,U=0;if(Q&63)return-1;if(~S)if(S&31)return-1;if((R|0)>=64){T=J(Q,R)|0;if((T|0)==-1)return-1;Q=Q+T|0;R=R-T|0}T=T+R|0;l=l+R|0;if(l>>>0>>0)m=m+1|0;D[Q|R]=128;if((R|0)>=56){for(U=R+1|0;(U|0)<64;U=U+1|0)D[Q|U]=0;F(Q);R=0;D[Q|0]=0}for(U=R+1|0;(U|0)<59;U=U+1|0)D[Q|U]=0;D[Q|56]=m>>>21&255;D[Q|57]=m>>>13&255;D[Q|58]=m>>>5&255;D[Q|59]=m<<3&255|l>>>29;D[Q|60]=l>>>21&255;D[Q|61]=l>>>13&255;D[Q|62]=l>>>5&255;D[Q|63]=l<<3&255;F(Q);if(~S)G(S);return T|0}function L(){d=n;e=o;f=p;g=q;h=r;i=s;j=t;k=u;l=64;m=0}function M(){d=v;e=w;f=x;g=y;h=z;i=A;j=B;k=C;l=64;m=0}function N(Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;da=da|0;H();E(Q^1549556828,R^1549556828,S^1549556828,T^1549556828,U^1549556828,V^1549556828,W^1549556828,X^1549556828,Y^1549556828,Z^1549556828,$^1549556828,_^1549556828,aa^1549556828,ba^1549556828,ca^1549556828,da^1549556828);v=d;w=e;x=f;y=g;z=h;A=i;B=j;C=k;H();E(Q^909522486,R^909522486,S^909522486,T^909522486,U^909522486,V^909522486,W^909522486,X^909522486,Y^909522486,Z^909522486,$^909522486,_^909522486,aa^909522486,ba^909522486,ca^909522486,da^909522486); - -n=d;o=e;p=f;q=g;r=h;s=i;t=j;u=k;l=64;m=0}function O(Q,R,S){Q=Q|0;R=R|0;S=S|0;var T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0;if(Q&63)return-1;if(~S)if(S&31)return-1;_=K(Q,R,-1)|0;T=d,U=e,V=f,W=g,X=h,Y=i,Z=j,$=k;M();E(T,U,V,W,X,Y,Z,$,2147483648,0,0,0,0,0,0,768);if(~S)G(S);return _|0}function P(Q,R,S,T,U){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;var V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;if(Q&63)return-1;if(~U)if(U&31)return-1;D[Q+R|0]=S>>>24;D[Q+R+1|0]=S>>>16&255;D[Q+R+2|0]=S>>>8&255;D[Q+R+3|0]=S&255;O(Q,R+4|0,-1)|0;V=ba=d,W=ca=e,X=da=f,Y=ea=g,Z=fa=h,$=ga=i,_=ha=j,aa=ia=k;T=T-1|0;while((T|0)>0){L();E(ba,ca,da,ea,fa,ga,ha,ia,2147483648,0,0,0,0,0,0,768);ba=d,ca=e,da=f,ea=g,fa=h,ga=i,ha=j,ia=k;M();E(ba,ca,da,ea,fa,ga,ha,ia,2147483648,0,0,0,0,0,0,768);ba=d,ca=e,da=f,ea=g,fa=h,ga=i,ha=j,ia=k;V=V^d;W=W^e;X=X^f;Y=Y^g;Z=Z^h;$=$^i;_=_^j;aa=aa^k;T=T-1|0}d=V;e=W;f=X;g=Y;h=Z;i=$;j=_;k=aa;if(~U)G(U);return 0}return{reset:H,init:I,process:J,finish:K,hmac_reset:L,hmac_init:N,hmac_finish:O,pbkdf2_generate_block:P}}function V(a){a=a||{},this.heap=r(Uint8Array,a),this.asm=a.asm||U({Uint8Array:Uint8Array},null,this.heap.buffer),this.BLOCK_SIZE=eb,this.HASH_SIZE=fb,this.reset()}function W(){return null===hb&&(hb=new V({heapSize:1048576})),hb}function X(a){if(void 0===a)throw new SyntaxError("data required");return W().reset().process(a).finish().result}function Y(a){var b=X(a);return j(b)}function Z(a){var b=X(a);return k(b)}function $(a){if(a=a||{},!a.hash)throw new SyntaxError("option 'hash' is required");if(!a.hash.HASH_SIZE)throw new SyntaxError("option 'hash' supplied doesn't seem to be a valid hash function");return this.hash=a.hash,this.BLOCK_SIZE=this.hash.BLOCK_SIZE,this.HMAC_SIZE=this.hash.HASH_SIZE,this.key=null,this.verify=null,this.result=null,(void 0!==a.password||void 0!==a.verify)&&this.reset(a),this}function _(a,b){if(o(b)&&(b=new Uint8Array(b)),n(b)&&(b=f(b)),!p(b))throw new TypeError("password isn't of expected type");var c=new Uint8Array(a.BLOCK_SIZE);return c.set(b.length>a.BLOCK_SIZE?a.reset().process(b).finish().result:b),c}function aa(a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("verify tag isn't of expected type");a=f(a)}if(a.length!==this.HMAC_SIZE)throw new d("illegal verification tag size");this.verify=a}function ba(a){a=a||{};var b=a.password;if(null===this.key&&!n(b)&&!b)throw new c("no key is associated with the instance");this.result=null,this.hash.reset(),(b||n(b))&&(this.key=_(this.hash,b));for(var d=new Uint8Array(this.key),e=0;e=g;++g){var h=(g-1)*this.hmac.HMAC_SIZE,i=(f>g?0:e%this.hmac.HMAC_SIZE)||this.hmac.HMAC_SIZE,j=new Uint8Array(this.hmac.reset().process(a).process(new Uint8Array([g>>>24&255,g>>>16&255,g>>>8&255,255&g])).finish().result);this.result.set(j.subarray(0,i),h);for(var k=1;b>k;++k){j=new Uint8Array(this.hmac.reset().process(j).finish().result);for(var l=0;i>l;++l)this.result[h+l]^=j[l]}}return this}function oa(a){return a=a||{},a.hmac instanceof ea||(a.hmac=ha()),la.call(this,a),this}function pa(a,b,e){if(null!==this.result)throw new c("state must be reset before processing new data");if(!a&&!n(a))throw new d("bad 'salt' value");b=b||this.count,e=e||this.length,this.result=new Uint8Array(e);for(var f=Math.ceil(e/this.hmac.HMAC_SIZE),g=1;f>=g;++g){var h=(g-1)*this.hmac.HMAC_SIZE,i=(f>g?0:e%this.hmac.HMAC_SIZE)||this.hmac.HMAC_SIZE;this.hmac.reset().process(a),this.hmac.hash.asm.pbkdf2_generate_block(this.hmac.hash.pos,this.hmac.hash.len,g,b,0),this.result.set(this.hmac.hash.heap.subarray(0,i),h)}return this}function qa(){return null===ob&&(ob=new oa),ob}function ra(){if(void 0!==ub)d=new Uint8Array(32),nb.call(ub,d),xb(d);else{var a,c,d=new Wa(3);d[0]=sb(),d[1]=rb(),d[2]=vb(),d=new Uint8Array(d.buffer);var e="";void 0!==b.location?e+=b.location.href:void 0!==b.process&&(e+=b.process.pid+b.process.title);var f=qa();for(a=0;100>a;a++)d=f.reset({password:d}).generate(e,1e3,32).result,c=vb(),d[0]^=c>>>24,d[1]^=c>>>16,d[2]^=c>>>8,d[3]^=c;xb(d)}yb=0,zb=!0}function sa(a){if(!o(a)&&!q(a))throw new TypeError("bad seed type");var b=a.byteOffset||0,c=a.byteLength||a.length,d=new Uint8Array(a.buffer||a,b,c);xb(d),yb=0;for(var e=0,f=0;f=Cb}function ta(a){if(zb||ra(),!Ab&&void 0===ub){if(!Db)throw new e("No strong PRNGs available. Use asmCrypto.random.seed().");void 0!==qb&&qb.error("No strong PRNGs available; your security is greatly lowered. Use asmCrypto.random.seed().")}if(!Eb&&!Ab&&void 0!==ub&&void 0!==qb){var b=(new Error).stack;Fb[b]|=0,Fb[b]++||qb.warn("asmCrypto PRNG not seeded; your security relies on your system PRNG. If this is not acceptable, use asmCrypto.random.seed().")}if(!o(a)&&!q(a))throw new TypeError("unexpected buffer type");var c,d,f=a.byteOffset||0,g=a.byteLength||a.length,h=new Uint8Array(a.buffer||a,f,g);for(void 0!==ub&&nb.call(ub,h),c=0;g>c;c++)0===(3&c)&&(yb>=1099511627776&&ra(),d=wb(),yb++),h[c]^=d,d>>>=8;return a}function ua(){(!zb||yb>=1099511627776)&&ra();var a=(1048576*wb()+(wb()>>>12))/4503599627370496;return yb+=2,a}function va(a,b,c){"use asm";var d=0;var e=new a.Uint32Array(c);var f=a.Math.imul;function g(u){u=u|0;d=u=u+31&-32;return u|0}function h(u){u=u|0;var v=0;v=d;d=v+(u+31&-32)|0;return v|0}function i(u){u=u|0;d=d-(u+31&-32)|0}function j(u,v,w){u=u|0;v=v|0;w=w|0;var x=0;if((v|0)>(w|0)){for(;(x|0)<(u|0);x=x+4|0){e[w+x>>2]=e[v+x>>2]}}else{for(x=u-4|0;(x|0)>=0;x=x-4|0){e[w+x>>2]=e[v+x>>2]}}}function k(u,v,w){u=u|0;v=v|0;w=w|0;var x=0;for(;(x|0)<(u|0);x=x+4|0){e[w+x>>2]=v}}function l(u,v,w,x){u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0,B=0,C=0;if((x|0)<=0)x=v;if((x|0)<(v|0))v=x;z=1;for(;(C|0)<(v|0);C=C+4|0){y=~e[u+C>>2];A=(y&65535)+z|0;B=(y>>>16)+(A>>>16)|0;e[w+C>>2]=B<<16|A&65535;z=B>>>16}for(;(C|0)<(x|0);C=C+4|0){e[w+C>>2]=z-1|0}return z|0}function m(u,v,w,x){u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0;if((v|0)>(x|0)){for(A=v-4|0;(A|0)>=(x|0);A=A-4|0){if(e[u+A>>2]|0)return 1}}else{for(A=x-4|0;(A|0)>=(v|0);A=A-4|0){if(e[w+A>>2]|0)return-1}}for(;(A|0)>=0;A=A-4|0){y=e[u+A>>2]|0,z=e[w+A>>2]|0;if(y>>>0>>0)return-1;if(y>>>0>z>>>0)return 1}return 0}function n(u,v){u=u|0;v=v|0;var w=0;for(w=v-4|0;(w|0)>=0;w=w-4|0){if(e[u+w>>2]|0)return w+4|0}return 0}function o(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0;if((v|0)<(x|0)){D=u,u=w,w=D;D=v,v=x,x=D}if((z|0)<=0)z=v+4|0;if((z|0)<(x|0))v=x=z;for(;(F|0)<(x|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)+(B&65535)|0)+C|0;E=((A>>>16)+(B>>>16)|0)+(D>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>>16}for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;D=(A&65535)+C|0;E=(A>>>16)+(D>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>>16}for(;(F|0)<(z|0);F=F+4|0){e[y+F>>2]=C|0;C=0}return C|0}function p(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0;if((z|0)<=0)z=(v|0)>(x|0)?v+4|0:x+4|0;if((z|0)<(v|0))v=z;if((z|0)<(x|0))x=z;if((v|0)<(x|0)){for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)-(B&65535)|0)+C|0;E=((A>>>16)-(B>>>16)|0)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}for(;(F|0)<(x|0);F=F+4|0){B=e[w+F>>2]|0;D=C-(B&65535)|0;E=(D>>16)-(B>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}}else{for(;(F|0)<(x|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)-(B&65535)|0)+C|0;E=((A>>>16)-(B>>>16)|0)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;D=(A&65535)+C|0;E=(A>>>16)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}}for(;(F|0)<(z|0);F=F+4|0){e[y+F>>2]=C|0}return C|0}function q(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;if((v|0)>(x|0)){ua=u,va=v;u=w,v=x;w=ua,x=va}xa=v+x|0;if((z|0)>(xa|0)|(z|0)<=0)z=xa;if((z|0)<(v|0))v=z;if((z|0)<(x|0))x=z;for(;(ya|0)<(v|0);ya=ya+32|0){za=u+ya|0;I=e[(za|0)>>2]|0,J=e[(za|4)>>2]|0,K=e[(za|8)>>2]|0,L=e[(za|12)>>2]|0,M=e[(za|16)>>2]|0,N=e[(za|20)>>2]|0,O=e[(za|24)>>2]|0,P=e[(za|28)>>2]|0,A=I&65535,B=J&65535,C=K&65535,D=L&65535,E=M&65535,F=N&65535,G=O&65535,H=P&65535,I=I>>>16,J=J>>>16,K=K>>>16,L=L>>>16,M=M>>>16,N=N>>>16,O=O>>>16,P=P>>>16;ma=na=oa=pa=qa=ra=sa=ta=0;for(Aa=0;(Aa|0)<(x|0);Aa=Aa+32|0){Ba=w+Aa|0;Ca=y+(ya+Aa|0)|0;Y=e[(Ba|0)>>2]|0,Z=e[(Ba|4)>>2]|0,$=e[(Ba|8)>>2]|0,_=e[(Ba|12)>>2]|0,aa=e[(Ba|16)>>2]|0,ba=e[(Ba|20)>>2]|0,ca=e[(Ba|24)>>2]|0,da=e[(Ba|28)>>2]|0,Q=Y&65535,R=Z&65535,S=$&65535,T=_&65535,U=aa&65535,V=ba&65535,W=ca&65535,X=da&65535,Y=Y>>>16,Z=Z>>>16,$=$>>>16,_=_>>>16,aa=aa>>>16,ba=ba>>>16,ca=ca>>>16,da=da>>>16;ea=e[(Ca|0)>>2]|0,fa=e[(Ca|4)>>2]|0,ga=e[(Ca|8)>>2]|0,ha=e[(Ca|12)>>2]|0,ia=e[(Ca|16)>>2]|0,ja=e[(Ca|20)>>2]|0,ka=e[(Ca|24)>>2]|0,la=e[(Ca|28)>>2]|0;ua=((f(A,Q)|0)+(ma&65535)|0)+(ea&65535)|0;va=((f(I,Q)|0)+(ma>>>16)|0)+(ea>>>16)|0;wa=((f(A,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ea=wa<<16|ua&65535;ua=((f(A,R)|0)+(xa&65535)|0)+(fa&65535)|0;va=((f(I,R)|0)+(xa>>>16)|0)+(fa>>>16)|0;wa=((f(A,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;fa=wa<<16|ua&65535;ua=((f(A,S)|0)+(xa&65535)|0)+(ga&65535)|0;va=((f(I,S)|0)+(xa>>>16)|0)+(ga>>>16)|0;wa=((f(A,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(A,T)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(I,T)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(A,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(A,U)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(I,U)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(A,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(A,V)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(I,V)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(A,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(A,W)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(I,W)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(A,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(A,X)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(I,X)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(A,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,da)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ma=xa;ua=((f(B,Q)|0)+(na&65535)|0)+(fa&65535)|0;va=((f(J,Q)|0)+(na>>>16)|0)+(fa>>>16)|0;wa=((f(B,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;fa=wa<<16|ua&65535;ua=((f(B,R)|0)+(xa&65535)|0)+(ga&65535)|0;va=((f(J,R)|0)+(xa>>>16)|0)+(ga>>>16)|0;wa=((f(B,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(B,S)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(J,S)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(B,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(B,T)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(J,T)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(B,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(B,U)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(J,U)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(B,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(B,V)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(J,V)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(B,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(B,W)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(J,W)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(B,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(B,X)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(J,X)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(B,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,da)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;na=xa;ua=((f(C,Q)|0)+(oa&65535)|0)+(ga&65535)|0;va=((f(K,Q)|0)+(oa>>>16)|0)+(ga>>>16)|0;wa=((f(C,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(C,R)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(K,R)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(C,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(C,S)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(K,S)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(C,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(C,T)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(K,T)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(C,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(C,U)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(K,U)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(C,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(C,V)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(K,V)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(C,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(C,W)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(K,W)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(C,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(C,X)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(K,X)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(C,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,da)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;oa=xa;ua=((f(D,Q)|0)+(pa&65535)|0)+(ha&65535)|0;va=((f(L,Q)|0)+(pa>>>16)|0)+(ha>>>16)|0;wa=((f(D,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(D,R)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(L,R)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(D,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(D,S)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(L,S)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(D,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(D,T)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(L,T)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(D,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(D,U)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(L,U)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(D,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(D,V)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(L,V)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(D,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(D,W)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(L,W)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(D,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(D,X)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(L,X)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(D,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,da)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;pa=xa;ua=((f(E,Q)|0)+(qa&65535)|0)+(ia&65535)|0;va=((f(M,Q)|0)+(qa>>>16)|0)+(ia>>>16)|0;wa=((f(E,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(E,R)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(M,R)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(E,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(E,S)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(M,S)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(E,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(E,T)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(M,T)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(E,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,_)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(E,U)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(M,U)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(E,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(E,V)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(M,V)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(E,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(E,W)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(M,W)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(E,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(E,X)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(M,X)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(E,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,da)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;qa=xa;ua=((f(F,Q)|0)+(ra&65535)|0)+(ja&65535)|0;va=((f(N,Q)|0)+(ra>>>16)|0)+(ja>>>16)|0;wa=((f(F,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(F,R)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(N,R)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(F,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(F,S)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(N,S)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(F,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,$)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(F,T)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(N,T)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(F,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(F,U)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(N,U)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(F,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(F,V)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(N,V)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(F,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(F,W)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(N,W)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(F,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(F,X)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(N,X)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(F,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,da)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ra=xa;ua=((f(G,Q)|0)+(sa&65535)|0)+(ka&65535)|0;va=((f(O,Q)|0)+(sa>>>16)|0)+(ka>>>16)|0;wa=((f(G,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(G,R)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(O,R)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(G,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(G,S)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(O,S)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(G,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(G,T)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(O,T)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(G,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,_)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(G,U)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(O,U)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(G,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(G,V)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(O,V)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(G,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(G,W)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(O,W)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(G,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ua=((f(G,X)|0)+(xa&65535)|0)+(ra&65535)|0;va=((f(O,X)|0)+(xa>>>16)|0)+(ra>>>16)|0;wa=((f(G,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,da)|0)+(va>>>16)|0)+(wa>>>16)|0;ra=wa<<16|ua&65535;sa=xa;ua=((f(H,Q)|0)+(ta&65535)|0)+(la&65535)|0;va=((f(P,Q)|0)+(ta>>>16)|0)+(la>>>16)|0;wa=((f(H,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(H,R)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(P,R)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(H,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(H,S)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(P,S)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(H,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,$)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(H,T)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(P,T)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(H,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,_)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(H,U)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(P,U)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(H,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(H,V)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(P,V)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(H,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ua=((f(H,W)|0)+(xa&65535)|0)+(ra&65535)|0;va=((f(P,W)|0)+(xa>>>16)|0)+(ra>>>16)|0;wa=((f(H,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ra=wa<<16|ua&65535;ua=((f(H,X)|0)+(xa&65535)|0)+(sa&65535)|0;va=((f(P,X)|0)+(xa>>>16)|0)+(sa>>>16)|0;wa=((f(H,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,da)|0)+(va>>>16)|0)+(wa>>>16)|0;sa=wa<<16|ua&65535;ta=xa;e[(Ca|0)>>2]=ea,e[(Ca|4)>>2]=fa,e[(Ca|8)>>2]=ga,e[(Ca|12)>>2]=ha,e[(Ca|16)>>2]=ia,e[(Ca|20)>>2]=ja,e[(Ca|24)>>2]=ka,e[(Ca|28)>>2]=la}Ca=y+(ya+Aa|0)|0;e[(Ca|0)>>2]=ma,e[(Ca|4)>>2]=na,e[(Ca|8)>>2]=oa,e[(Ca|12)>>2]=pa,e[(Ca|16)>>2]=qa,e[(Ca|20)>>2]=ra,e[(Ca|24)>>2]=sa,e[(Ca|28)>>2]=ta}}function r(u,v,w){u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0;for(;(Ba|0)<(v|0);Ba=Ba+4|0){Ga=w+(Ba<<1)|0;F=e[u+Ba>>2]|0,x=F&65535,F=F>>>16;ra=f(x,x)|0;sa=(f(x,F)|0)+(ra>>>17)|0;ta=(f(F,F)|0)+(sa>>>15)|0;e[Ga>>2]=sa<<17|ra&131071;e[(Ga|4)>>2]=ta}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+8|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16;V=e[(Ea|4)>>2]|0,N=V&65535,V=V>>>16;ra=f(x,N)|0;sa=(f(x,V)|0)+(ra>>>16)|0;ta=(f(F,N)|0)+(sa&65535)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;xa=e[(Ga|4)>>2]|0;ra=(xa&65535)+((ra&65535)<<1)|0;ta=((xa>>>16)+((ta&65535)<<1)|0)+(ra>>>16)|0;e[(Ga|4)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|8)>>2]|0;ra=((xa&65535)+((wa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(wa>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|8)>>2]=ta<<16|ra&65535;ua=ta>>>16;if(ua){xa=e[(Ga|12)>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[(Ga|12)>>2]=ta<<16|ra&65535}}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+16|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16;V=e[(Ea|8)>>2]|0,N=V&65535,V=V>>>16,W=e[(Ea|12)>>2]|0,O=W&65535,W=W>>>16;ra=f(x,N)|0;sa=f(F,N)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=(f(x,O)|0)+(wa&65535)|0;sa=(f(F,O)|0)+(wa>>>16)|0;ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;da=wa;ra=(f(y,N)|0)+(ca&65535)|0;sa=(f(G,N)|0)+(ca>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ea=wa;xa=e[(Ga|8)>>2]|0;ra=(xa&65535)+((ba&65535)<<1)|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|8)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|12)>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|12)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|16)>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|16)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|20)>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|20)>>2]=ta<<16|ra&65535;ua=ta>>>16;for(Da=24;!!ua&(Da|0)<32;Da=Da+4|0){xa=e[(Ga|Da)>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[(Ga|Da)>>2]=ta<<16|ra&65535;ua=ta>>>16}}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+32|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16,H=e[(Ea|8)>>2]|0,z=H&65535,H=H>>>16,I=e[(Ea|12)>>2]|0,A=I&65535,I=I>>>16;V=e[(Ea|16)>>2]|0,N=V&65535,V=V>>>16,W=e[(Ea|20)>>2]|0,O=W&65535,W=W>>>16,X=e[(Ea|24)>>2]|0,P=X&65535,X=X>>>16,Y=e[(Ea|28)>>2]|0,Q=Y&65535,Y=Y>>>16;ra=f(x,N)|0;sa=f(F,N)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=(f(x,O)|0)+(wa&65535)|0;sa=(f(F,O)|0)+(wa>>>16)|0;ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=(f(x,P)|0)+(wa&65535)|0;sa=(f(F,P)|0)+(wa>>>16)|0;ta=((f(x,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=(f(x,Q)|0)+(wa&65535)|0;sa=(f(F,Q)|0)+(wa>>>16)|0;ta=((f(x,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;fa=wa;ra=(f(y,N)|0)+(ca&65535)|0;sa=(f(G,N)|0)+(ca>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(y,P)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(G,P)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(y,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(y,Q)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(G,Q)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(y,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ga=wa;ra=(f(z,N)|0)+(da&65535)|0;sa=(f(H,N)|0)+(da>>>16)|0;ta=((f(z,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(z,O)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(H,O)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(z,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(z,P)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(H,P)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(z,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(z,Q)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(H,Q)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(z,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ha=wa;ra=(f(A,N)|0)+(ea&65535)|0;sa=(f(I,N)|0)+(ea>>>16)|0;ta=((f(A,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(A,O)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(I,O)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(A,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(A,P)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(I,P)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(A,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(A,Q)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(I,Q)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(A,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ia=wa;xa=e[(Ga|16)>>2]|0;ra=(xa&65535)+((ba&65535)<<1)|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|16)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|20)>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|20)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|24)>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|24)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|28)>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|28)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+32>>2]|0;ra=((xa&65535)+((fa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(fa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+32>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+36>>2]|0;ra=((xa&65535)+((ga&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ga>>>16<<1)|0)+(ra>>>16)|0;e[Ga+36>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+40>>2]|0;ra=((xa&65535)+((ha&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ha>>>16<<1)|0)+(ra>>>16)|0;e[Ga+40>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+44>>2]|0;ra=((xa&65535)+((ia&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ia>>>16<<1)|0)+(ra>>>16)|0;e[Ga+44>>2]=ta<<16|ra&65535;ua=ta>>>16;for(Da=48;!!ua&(Da|0)<64;Da=Da+4|0){xa=e[Ga+Da>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16}}for(ya=32;(ya|0)<(v|0);ya=ya<<1){za=ya<<1;for(Aa=0;(Aa|0)<(v|0);Aa=Aa+za|0){Ga=w+(Aa<<1)|0;va=0;for(Ba=0;(Ba|0)<(ya|0);Ba=Ba+32|0){Ea=(u+Aa|0)+Ba|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16,H=e[(Ea|8)>>2]|0,z=H&65535,H=H>>>16,I=e[(Ea|12)>>2]|0,A=I&65535,I=I>>>16,J=e[(Ea|16)>>2]|0,B=J&65535,J=J>>>16,K=e[(Ea|20)>>2]|0,C=K&65535,K=K>>>16,L=e[(Ea|24)>>2]|0,D=L&65535,L=L>>>16,M=e[(Ea|28)>>2]|0,E=M&65535,M=M>>>16;ja=ka=la=ma=na=oa=pa=qa=ua=0;for(Ca=0;(Ca|0)<(ya|0);Ca=Ca+32|0){Fa=((u+Aa|0)+ya|0)+Ca|0;V=e[Fa>>2]|0,N=V&65535,V=V>>>16,W=e[(Fa|4)>>2]|0,O=W&65535,W=W>>>16,X=e[(Fa|8)>>2]|0,P=X&65535,X=X>>>16,Y=e[(Fa|12)>>2]|0,Q=Y&65535,Y=Y>>>16,Z=e[(Fa|16)>>2]|0,R=Z&65535,Z=Z>>>16,$=e[(Fa|20)>>2]|0,S=$&65535,$=$>>>16,_=e[(Fa|24)>>2]|0,T=_&65535,_=_>>>16,aa=e[(Fa|28)>>2]|0,U=aa&65535,aa=aa>>>16;ba=ca=da=ea=fa=ga=ha=ia=0;ra=((f(x,N)|0)+(ba&65535)|0)+(ja&65535)|0;sa=((f(F,N)|0)+(ba>>>16)|0)+(ja>>>16)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=((f(x,O)|0)+(ca&65535)|0)+(wa&65535)|0;sa=((f(F,O)|0)+(ca>>>16)|0)+(wa>>>16)|0; - -ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(x,P)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(F,P)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(x,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(x,Q)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(F,Q)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(x,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(x,R)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(F,R)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(x,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(x,S)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(F,S)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(x,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(x,T)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(F,T)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(x,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(x,U)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(F,U)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(x,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ja=wa;ra=((f(y,N)|0)+(ca&65535)|0)+(ka&65535)|0;sa=((f(G,N)|0)+(ca>>>16)|0)+(ka>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(y,P)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(G,P)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(y,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(y,Q)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(G,Q)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(y,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(y,R)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(G,R)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(y,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(y,S)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(G,S)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(y,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(y,T)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(G,T)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(y,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(y,U)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(G,U)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(y,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ka=wa;ra=((f(z,N)|0)+(da&65535)|0)+(la&65535)|0;sa=((f(H,N)|0)+(da>>>16)|0)+(la>>>16)|0;ta=((f(z,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(z,O)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(H,O)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(z,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(z,P)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(H,P)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(z,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(z,Q)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(H,Q)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(z,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(z,R)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(H,R)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(z,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(z,S)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(H,S)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(z,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(z,T)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(H,T)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(z,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(z,U)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(H,U)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(z,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;la=wa;ra=((f(A,N)|0)+(ea&65535)|0)+(ma&65535)|0;sa=((f(I,N)|0)+(ea>>>16)|0)+(ma>>>16)|0;ta=((f(A,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(A,O)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(I,O)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(A,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(A,P)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(I,P)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(A,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(A,Q)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(I,Q)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(A,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(A,R)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(I,R)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(A,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(A,S)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(I,S)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(A,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(A,T)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(I,T)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(A,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(A,U)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(I,U)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(A,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ma=wa;ra=((f(B,N)|0)+(fa&65535)|0)+(na&65535)|0;sa=((f(J,N)|0)+(fa>>>16)|0)+(na>>>16)|0;ta=((f(B,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(B,O)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(J,O)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(B,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(B,P)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(J,P)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(B,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(B,Q)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(J,Q)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(B,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(B,R)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(J,R)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(B,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(B,S)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(J,S)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(B,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(B,T)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(J,T)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(B,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(B,U)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(J,U)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(B,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;na=wa;ra=((f(C,N)|0)+(ga&65535)|0)+(oa&65535)|0;sa=((f(K,N)|0)+(ga>>>16)|0)+(oa>>>16)|0;ta=((f(C,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(C,O)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(K,O)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(C,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(C,P)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(K,P)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(C,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(C,Q)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(K,Q)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(C,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(C,R)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(K,R)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(C,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(C,S)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(K,S)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(C,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(C,T)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(K,T)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(C,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(C,U)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(K,U)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(C,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;oa=wa;ra=((f(D,N)|0)+(ha&65535)|0)+(pa&65535)|0;sa=((f(L,N)|0)+(ha>>>16)|0)+(pa>>>16)|0;ta=((f(D,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(D,O)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(L,O)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(D,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(D,P)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(L,P)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(D,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(D,Q)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(L,Q)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(D,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(D,R)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(L,R)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(D,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(D,S)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(L,S)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(D,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(D,T)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(L,T)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(D,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;ra=((f(D,U)|0)+(oa&65535)|0)+(wa&65535)|0;sa=((f(L,U)|0)+(oa>>>16)|0)+(wa>>>16)|0;ta=((f(D,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;oa=ta<<16|ra&65535;pa=wa;ra=((f(E,N)|0)+(ia&65535)|0)+(qa&65535)|0;sa=((f(M,N)|0)+(ia>>>16)|0)+(qa>>>16)|0;ta=((f(E,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(E,O)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(M,O)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(E,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(E,P)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(M,P)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(E,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(E,Q)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(M,Q)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(E,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(E,R)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(M,R)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(E,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(E,S)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(M,S)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(E,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;ra=((f(E,T)|0)+(oa&65535)|0)+(wa&65535)|0;sa=((f(M,T)|0)+(oa>>>16)|0)+(wa>>>16)|0;ta=((f(E,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;oa=ta<<16|ra&65535;ra=((f(E,U)|0)+(pa&65535)|0)+(wa&65535)|0;sa=((f(M,U)|0)+(pa>>>16)|0)+(wa>>>16)|0;ta=((f(E,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;pa=ta<<16|ra&65535;qa=wa;Da=ya+(Ba+Ca|0)|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ba&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((fa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(fa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ga&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ga>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ha&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ha>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ia&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ia>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16}Da=ya+(Ba+Ca|0)|0;xa=e[Ga+Da>>2]|0;ra=(((xa&65535)+((ja&65535)<<1)|0)+ua|0)+va|0;ta=((xa>>>16)+(ja>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ka&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ka>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((la&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(la>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ma&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ma>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((na&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(na>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((oa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(oa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((pa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(pa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((qa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(qa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;va=ta>>>16}for(Da=Da+4|0;!!va&(Da|0)>2]|0;ra=(xa&65535)+va|0;ta=(xa>>>16)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;va=ta>>>16}}}}function s(u,v,w,x,y){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;var z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;for(P=v-1&-4;(P|0)>=0;P=P-4|0){z=e[u+P>>2]|0;if(z){v=P;break}}for(P=x-1&-4;(P|0)>=0;P=P-4|0){A=e[w+P>>2]|0;if(A){x=P;break}}while((A&2147483648)==0){A=A<<1;B=B+1|0}D=e[u+v>>2]|0;if(B){C=D>>>(32-B|0);for(P=v-4|0;(P|0)>=0;P=P-4|0){z=e[u+P>>2]|0;e[u+P+4>>2]=D<>>(32-B|0):0);D=z}e[u>>2]=D<>2]|0;for(P=x-4|0;(P|0)>=0;P=P-4|0){A=e[w+P>>2]|0;e[w+P+4>>2]=E<>>(32-B|0);E=A}e[w>>2]=E<>2]|0;F=E>>>16,G=E&65535;for(P=v;(P|0)>=(x|0);P=P-4|0){Q=P-x|0;D=e[u+P>>2]|0;H=(C>>>0)/(F>>>0)|0,J=(C>>>0)%(F>>>0)|0,L=f(H,G)|0;while((H|0)==65536|L>>>0>(J<<16|D>>>16)>>>0){H=H-1|0,J=J+F|0,L=L-G|0;if((J|0)>=65536)break}N=0,O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;L=(f(H,A&65535)|0)+(N>>>16)|0;M=(f(H,A>>>16)|0)+(L>>>16)|0;A=N&65535|L<<16;N=M;z=e[u+Q+R>>2]|0;L=((z&65535)-(A&65535)|0)+O|0;M=((z>>>16)-(A>>>16)|0)+(L>>16)|0;e[u+Q+R>>2]=M<<16|L&65535;O=M>>16}L=((C&65535)-(N&65535)|0)+O|0;M=((C>>>16)-(N>>>16)|0)+(L>>16)|0;C=M<<16|L&65535;O=M>>16;if(O){H=H-1|0;O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;z=e[u+Q+R>>2]|0;L=(z&65535)+O|0;M=(z>>>16)+A+(L>>>16)|0;e[u+Q+R>>2]=M<<16|L&65535;O=M>>>16}C=C+O|0}D=e[u+P>>2]|0;z=C<<16|D>>>16;I=(z>>>0)/(F>>>0)|0,K=(z>>>0)%(F>>>0)|0,L=f(I,G)|0;while((I|0)==65536|L>>>0>(K<<16|D&65535)>>>0){I=I-1|0,K=K+F|0,L=L-G|0;if((K|0)>=65536)break}N=0,O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;L=(f(I,A&65535)|0)+(N&65535)|0;M=((f(I,A>>>16)|0)+(L>>>16)|0)+(N>>>16)|0;A=L&65535|M<<16;N=M>>>16;z=e[u+Q+R>>2]|0;L=((z&65535)-(A&65535)|0)+O|0;M=((z>>>16)-(A>>>16)|0)+(L>>16)|0;O=M>>16;e[u+Q+R>>2]=M<<16|L&65535}L=((C&65535)-(N&65535)|0)+O|0;M=((C>>>16)-(N>>>16)|0)+(L>>16)|0;O=M>>16;if(O){I=I-1|0;O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;z=e[u+Q+R>>2]|0;L=((z&65535)+(A&65535)|0)+O|0;M=((z>>>16)+(A>>>16)|0)+(L>>>16)|0;O=M>>>16;e[u+Q+R>>2]=L&65535|M<<16}}e[y+Q>>2]=H<<16|I;C=e[u+P>>2]|0}if(B){D=e[u>>2]|0;for(P=4;(P|0)<=(x|0);P=P+4|0){z=e[u+P>>2]|0;e[u+P-4>>2]=z<<(32-B|0)|D>>>B;D=z}e[u+x>>2]=D>>>B}}function t(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;A=h(x<<1)|0;k(x<<1,0,A);j(v,u,A);for(L=0;(L|0)<(x|0);L=L+4|0){C=e[A+L>>2]|0,D=C&65535,C=C>>>16;F=y>>>16,E=y&65535;G=f(D,E)|0,H=((f(D,F)|0)+(f(C,E)|0)|0)+(G>>>16)|0;D=G&65535,C=H&65535;K=0;for(M=0;(M|0)<(x|0);M=M+4|0){N=L+M|0;F=e[w+M>>2]|0,E=F&65535,F=F>>>16;J=e[A+N>>2]|0;G=((f(D,E)|0)+(K&65535)|0)+(J&65535)|0;H=((f(D,F)|0)+(K>>>16)|0)+(J>>>16)|0;I=((f(C,E)|0)+(H&65535)|0)+(G>>>16)|0;K=((f(C,F)|0)+(I>>>16)|0)+(H>>>16)|0;J=I<<16|G&65535;e[A+N>>2]=J}N=L+M|0;J=e[A+N>>2]|0;G=((J&65535)+(K&65535)|0)+B|0;H=((J>>>16)+(K>>>16)|0)+(G>>>16)|0;e[A+N>>2]=H<<16|G&65535;B=H>>>16}j(x,A+x|0,z);i(x<<1);if(B|(m(w,x,z,x)|0)<=0){p(z,x,w,x,z,x)|0}}return{sreset:g,salloc:h,sfree:i,z:k,tst:n,neg:l,cmp:m,add:o,sub:p,mul:q,sqr:r,div:s,mredc:t}}function wa(a){return a instanceof ya}function xa(a,b){return a*b|0}function ya(a){var b=Kb,c=0,d=0;if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),void 0===a);else if(m(a)){var e=Math.abs(a);e>4294967295?(b=new Uint32Array(2),b[0]=0|e,b[1]=e/4294967296|0,c=52):e>0?(b=new Uint32Array(1),b[0]=e,c=32):(b=Kb,c=0),d=0>a?-1:1}else if(p(a)){for(var g=0;!a[g];g++);if(c=8*(a.length-g),!c)return Mb;b=new Uint32Array(c+31>>5);for(var h=a.length-4;h>=g;h-=4)b[a.length-4-h>>2]=a[h]<<24|a[h+1]<<16|a[h+2]<<8|a[h+3];g-h===3?b[b.length-1]=a[g]:g-h===2?b[b.length-1]=a[g]<<8|a[g+1]:g-h===1&&(b[b.length-1]=a[g]<<16|a[g+1]<<8|a[g+2]),d=1}else{if("object"!=typeof a||null===a)throw new TypeError("number is of unexpected type");b=new Uint32Array(a.limbs),c=a.bitLength,d=a.sign}this.limbs=b,this.bitLength=c,this.sign=d}function za(a){a=a||16;var b=this.limbs,c=this.bitLength,e="";if(16!==a)throw new d("bad radix");for(var f=(c+31>>5)-1;f>=0;f--){var g=b[f].toString(16);e+="00000000".substr(g.length),e+=g}return e=e.replace(/^0+/,""),e.length||(e="0"),this.sign<0&&(e="-"+e),e}function Aa(){var a=this.bitLength,b=this.limbs;if(0===a)return new Uint8Array(0);for(var c=a+7>>3,d=new Uint8Array(c),e=0;c>e;e++){var f=c-e-1;d[e]=b[f>>2]>>((3&f)<<3)}return d}function Ba(){var a=this.limbs,b=this.bitLength,c=this.sign;if(!c)return 0;if(32>=b)return c*(a[0]>>>0);if(52>=b)return c*(4294967296*(a[1]>>>0)+(a[0]>>>0));var d,e,f=0;for(d=a.length-1;d>=0;d--)if(0!==(e=a[d])){for(;0===(e<>>0):c*(1048576*((a[d]<>>32-f:0))>>>0)+((a[d-1]<1?a[d-2]>>>32-f:0))>>>12))*Math.pow(2,32*d-f-52)}function Ca(a){var b=this.limbs,c=this.bitLength;if(a>=c)return this;var d=new ya,e=a+31>>5,f=a%32;return d.limbs=new Uint32Array(b.subarray(0,e)),d.bitLength=a,d.sign=this.sign,f&&(d.limbs[e-1]&=-1>>>32-f),d}function Da(a,b){if(!m(a))throw new TypeError("TODO");if(void 0!==b&&!m(b))throw new TypeError("TODO");var c=this.limbs,d=this.bitLength;if(0>a)throw new RangeError("TODO");if(a>=d)return Mb;(void 0===b||b>d-a)&&(b=d-a);var e,f=new ya,g=a>>5,h=a+b+31>>5,i=b+31>>5,j=a%32,k=b%32;if(e=new Uint32Array(i),j){for(var l=0;h-g-1>l;l++)e[l]=c[g+l]>>>j|c[g+l+1]<<32-j;e[l]=c[g+l]>>>j}else e.set(c.subarray(g,h));return k&&(e[i-1]&=-1>>>32-k),f.limbs=e,f.bitLength=b,f.sign=this.sign,f}function Ea(){var a=new ya;return a.limbs=this.limbs,a.bitLength=this.bitLength,a.sign=-1*this.sign,a}function Fa(a){wa(a)||(a=new ya(a));var b=this.limbs,c=b.length,d=a.limbs,e=d.length,f=0;return this.signa.sign?1:(Jb.set(b,0),Jb.set(d,c),f=Hb.cmp(0,c<<2,c<<2,e<<2),f*this.sign)}function Ga(a){if(wa(a)||(a=new ya(a)),!this.sign)return a;if(!a.sign)return this;var b,c,d,e,f=this.bitLength,g=this.limbs,h=g.length,i=this.sign,j=a.bitLength,k=a.limbs,l=k.length,m=a.sign,n=new ya;b=(f>j?f:j)+(i*m>0?1:0),c=b+31>>5,Hb.sreset();var o=Hb.salloc(h<<2),p=Hb.salloc(l<<2),q=Hb.salloc(c<<2);return Hb.z(q-o+(c<<2),0,o),Jb.set(g,o>>2),Jb.set(k,p>>2),i*m>0?(Hb.add(o,h<<2,p,l<<2,q,c<<2),d=i):i>m?(e=Hb.sub(o,h<<2,p,l<<2,q,c<<2),d=e?m:i):(e=Hb.sub(p,l<<2,o,h<<2,q,c<<2),d=e?i:m),e&&Hb.neg(q,c<<2,q,c<<2),0===Hb.tst(q,c<<2)?Mb:(n.limbs=new Uint32Array(Jb.subarray(q>>2,(q>>2)+c)),n.bitLength=b,n.sign=d,n)}function Ha(a){return wa(a)||(a=new ya(a)),this.add(a.negate())}function Ia(a){if(wa(a)||(a=new ya(a)),!this.sign||!a.sign)return Mb;var b,c,d=this.bitLength,e=this.limbs,f=e.length,g=a.bitLength,h=a.limbs,i=h.length,j=new ya;b=d+g,c=b+31>>5,Hb.sreset();var k=Hb.salloc(f<<2),l=Hb.salloc(i<<2),m=Hb.salloc(c<<2);return Hb.z(m-k+(c<<2),0,k),Jb.set(e,k>>2),Jb.set(h,l>>2),Hb.mul(k,f<<2,l,i<<2,m,c<<2),j.limbs=new Uint32Array(Jb.subarray(m>>2,(m>>2)+c)),j.sign=this.sign*a.sign,j.bitLength=b,j}function Ja(){if(!this.sign)return Mb;var a,b,c=this.bitLength,d=this.limbs,e=d.length,f=new ya;a=c<<1,b=a+31>>5,Hb.sreset();var g=Hb.salloc(e<<2),h=Hb.salloc(b<<2);return Hb.z(h-g+(b<<2),0,g),Jb.set(d,g>>2),Hb.sqr(g,e<<2,h),f.limbs=new Uint32Array(Jb.subarray(h>>2,(h>>2)+b)),f.bitLength=a,f.sign=1,f}function Ka(a){wa(a)||(a=new ya(a));var b,c,d=this.bitLength,e=this.limbs,f=e.length,g=a.bitLength,h=a.limbs,i=h.length,j=Mb,k=Mb;Hb.sreset();var l=Hb.salloc(f<<2),m=Hb.salloc(i<<2),n=Hb.salloc(f<<2);return Hb.z(n-l+(f<<2),0,l),Jb.set(e,l>>2),Jb.set(h,m>>2),Hb.div(l,f<<2,m,i<<2,n),b=Hb.tst(n,f<<2)>>2,b&&(j=new ya,j.limbs=new Uint32Array(Jb.subarray(n>>2,(n>>2)+b)),j.bitLength=b<<5>d?d:b<<5,j.sign=this.sign*a.sign),c=Hb.tst(l,i<<2)>>2,c&&(k=new ya,k.limbs=new Uint32Array(Jb.subarray(l>>2,(l>>2)+c)),k.bitLength=c<<5>g?g:c<<5,k.sign=this.sign),{quotient:j,remainder:k}}function La(a,b){var c,d,e,f,g=0>a?-1:1,h=0>b?-1:1,i=1,j=0,k=0,l=1;for(a*=g,b*=h,f=b>a,f&&(e=a,a=b,b=e,e=g,g=h,h=e),d=Math.floor(a/b),c=a-d*b;c;)e=i-d*j,i=j,j=e,e=k-d*l,k=l,l=e,a=b,b=c,d=Math.floor(a/b),c=a-d*b;return j*=g,l*=h,f&&(e=j,j=l,l=e),{gcd:b,x:j,y:l}}function Ma(a,b){wa(a)||(a=new ya(a)),wa(b)||(b=new ya(b));var c=a.sign,d=b.sign;0>c&&(a=a.negate()),0>d&&(b=b.negate());var e=a.compare(b);if(0>e){var f=a;a=b,b=f,f=c,c=d,d=f}var g,h,i,j=Nb,k=Mb,l=b.bitLength,m=Mb,n=Nb,o=a.bitLength;for(g=a.divide(b);(h=g.remainder)!==Mb;)i=g.quotient,g=j.subtract(i.multiply(k).clamp(l)).clamp(l),j=k,k=g,g=m.subtract(i.multiply(n).clamp(o)).clamp(o),m=n,n=g,a=b,b=h,g=a.divide(b);if(0>c&&(k=k.negate()),0>d&&(n=n.negate()),0>e){var f=k;k=n,n=f}return{gcd:b,x:k,y:n}}function Na(){if(ya.apply(this,arguments),this.valueOf()<1)throw new RangeError;if(!(this.bitLength<=32)){var a;if(1&this.limbs[0]){var b=(this.bitLength+31&-32)+1,c=new Uint32Array(b+31>>5);c[c.length-1]=1,a=new ya,a.sign=1,a.bitLength=b,a.limbs=c;var d=La(4294967296,this.limbs[0]).y;this.coefficient=0>d?-d:4294967296-d,this.comodulus=a,this.comodulusRemainder=a.divide(this).remainder,this.comodulusRemainderSquare=a.square().divide(this).remainder}}}function Oa(a){return wa(a)||(a=new ya(a)),a.bitLength<=32&&this.bitLength<=32?new ya(a.valueOf()%this.valueOf()):a.compare(this)<0?a:a.divide(this).remainder}function Pa(a){a=this.reduce(a);var b=Ma(this,a);return 1!==b.gcd.valueOf()?null:(b=b.y,b.sign<0&&(b=b.add(this).clamp(this.bitLength)),b)}function Qa(a,b){wa(a)||(a=new ya(a)),wa(b)||(b=new ya(b));for(var c=0,d=0;d>>=1;var f=8;b.bitLength<=4536&&(f=7),b.bitLength<=1736&&(f=6),b.bitLength<=630&&(f=5),b.bitLength<=210&&(f=4),b.bitLength<=60&&(f=3),b.bitLength<=12&&(f=2),1<=c&&(f=1),a=Ra(this.reduce(a).multiply(this.comodulusRemainderSquare),this);var g=Ra(a.square(),this),h=new Array(1<d;d++)h[d]=Ra(h[d-1].multiply(g),this);for(var i=this.comodulusRemainder,j=i,d=b.limbs.length-1;d>=0;d--)for(var e=b.limbs[d],k=32;k>0;)if(2147483648&e){for(var l=e>>>32-f,m=f;0===(1&l);)l>>>=1,m--;for(var n=h[l>>>1];l;)l>>>=1,j!==i&&(j=Ra(j.square(),this));j=j!==i?Ra(j.multiply(n),this):n,e<<=m,k-=m}else j!==i&&(j=Ra(j.square(),this)),e<<=1,k--;return j=Ra(j,this)}function Ra(a,b){var c=a.limbs,d=c.length,e=b.limbs,f=e.length,g=b.coefficient;Hb.sreset();var h=Hb.salloc(d<<2),i=Hb.salloc(f<<2),j=Hb.salloc(f<<2);Hb.z(j-h+(f<<2),0,h),Jb.set(c,h>>2),Jb.set(e,i>>2),Hb.mredc(h,d<<2,i,f<<2,g,j);var k=new ya;return k.limbs=new Uint32Array(Jb.subarray(j>>2,(j>>2)+f)),k.bitLength=b.bitLength,k.sign=1,k}function Sa(a){var b=new ya(this),c=0;for(b.limbs[0]-=1;0===b.limbs[c>>5];)c+=32;for(;0===(b.limbs[c>>5]>>(31&c)&1);)c++;b=b.slice(c);for(var d=new Na(this),e=this.subtract(Nb),f=new ya(this),g=this.limbs.length-1;0===f.limbs[g];)g--;for(;--a>=0;){for(ta(f.limbs),f.limbs[0]<2&&(f.limbs[0]+=2);f.compare(e)>=0;)f.limbs[g]>>>=1;var h=d.power(f,b);if(0!==h.compare(Nb)&&0!==h.compare(e)){for(var i=c;--i>0;){if(h=h.square().divide(d).remainder,0===h.compare(Nb))return!1;if(0===h.compare(e))break}if(0===i)return!1}}return!0}function Ta(a){a=a||80;var b=this.limbs,c=0;if(0===(1&b[0]))return!1;if(1>=a)return!0;var d=0,e=0,f=0;for(c=0;c>>=2;for(var h=b[c];h;)e+=3&h,h>>>=2,e-=3&h,h>>>=2;for(var i=b[c];i;)f+=15&i,i>>>=4,f-=15&i,i>>>=4}return d%3&&e%5&&f%17?2>=a?!0:Sa.call(this,a>>>1):!1}function Ua(a){if(Pb.length>=a)return Pb.slice(0,a);for(var b=Pb[Pb.length-1]+2;Pb.length=d*d&&b%d!=0;d=Pb[++c]);d*d>b&&Pb.push(b)}return Pb}function Va(a,c){var d=a+31>>5,e=new ya({sign:1,bitLength:a,limbs:d}),f=e.limbs,g=1e4;512>=a&&(g=2200),256>=a&&(g=600);var h=Ua(g),i=new Uint32Array(g),j=a*b.Math.LN2|0,k=27;for(a>=250&&(k=12),a>=450&&(k=6),a>=850&&(k=3),a>=1300&&(k=2);;){ta(f),f[0]|=1,f[d-1]|=1<<(a-1&31),31&a&&(f[d-1]&=l(a+1&31)-1),i[0]=1;for(var m=1;g>m;m++)i[m]=e.divide(h[m]).remainder.valueOf();a:for(var n=0;j>n;n+=2,f[0]+=2){for(var m=1;g>m;m++)if((i[m]+n)%h[m]===0)continue a;if(("function"!=typeof c||c(e))&&Sa.call(e,k))return e}}}c.prototype=Object.create(Error.prototype,{name:{value:"IllegalStateError"}}),d.prototype=Object.create(Error.prototype,{name:{value:"IllegalArgumentError"}}),e.prototype=Object.create(Error.prototype,{name:{value:"SecurityError"}});var Wa=b.Float64Array||b.Float32Array;a.string_to_bytes=f,a.hex_to_bytes=g,a.base64_to_bytes=h,a.bytes_to_string=i,a.bytes_to_hex=j,a.bytes_to_base64=k,b.IllegalStateError=c,b.IllegalArgumentError=d,b.SecurityError=e;var Xa=function(){"use strict";function a(){e=[],f=[];var a,b,c=1;for(a=0;255>a;a++)e[a]=c,b=128&c,c<<=1,c&=255,128===b&&(c^=27),c^=e[a],f[e[a]]=a;e[255]=e[0],f[0]=0,k=!0}function b(a,b){var c=e[(f[a]+f[b])%255];return(0===a||0===b)&&(c=0),c}function c(a){var b=e[255-f[a]];return 0===a&&(b=0),b}function d(){function d(a){var b,d,e;for(d=e=c(a),b=0;4>b;b++)d=255&(d<<1|d>>>7),e^=d;return e^=99}k||a(),g=[],h=[],i=[[],[],[],[]],j=[[],[],[],[]];for(var e=0;256>e;e++){var f=d(e);g[e]=f,h[f]=e,i[0][e]=b(2,f)<<24|f<<16|f<<8|b(3,f),j[0][f]=b(14,e)<<24|b(9,e)<<16|b(13,e)<<8|b(11,e);for(var l=1;4>l;l++)i[l][e]=i[l-1][e]>>>8|i[l-1][e]<<24,j[l][f]=j[l-1][f]>>>8|j[l-1][f]<<24}}var e,f,g,h,i,j,k=!1,l=!1,m=function(a,b,c){function e(a,b,c,d,e,h,i,k,l){var m=f.subarray(0,60),o=f.subarray(256,316);m.set([b,c,d,e,h,i,k,l]);for(var p=a,q=1;4*a+28>p;p++){var r=m[p-1];(p%a===0||8===a&&p%a===4)&&(r=g[r>>>24]<<24^g[r>>>16&255]<<16^g[r>>>8&255]<<8^g[255&r]),p%a===0&&(r=r<<8^r>>>24^q<<24,q=q<<1^(128&q?27:0)),m[p]=m[p-a]^r}for(var s=0;p>s;s+=4)for(var t=0;4>t;t++){var r=m[p-(4+s)+(4-t)%4];4>s||s>=p-4?o[s+t]=r:o[s+t]=j[0][g[r>>>24]]^j[1][g[r>>>16&255]]^j[2][g[r>>>8&255]]^j[3][g[255&r]]}n.set_rounds(a+5)}l||d();var f=new Uint32Array(c);f.set(g,512),f.set(h,768);for(var k=0;4>k;k++)f.set(i[k],4096+1024*k>>2),f.set(j[k],8192+1024*k>>2);var m={Uint8Array:Uint8Array,Uint32Array:Uint32Array},n=function(a,b,c){"use asm";var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;var y=new a.Uint32Array(c),z=new a.Uint8Array(c);function A(X,Y,Z,$,_,aa,ba,ca){X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;var da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0;da=Z|1024,ea=Z|2048,fa=Z|3072;_=_^y[(X|0)>>2],aa=aa^y[(X|4)>>2],ba=ba^y[(X|8)>>2],ca=ca^y[(X|12)>>2];for(ka=16;(ka|0)<=$<<4;ka=ka+16|0){ga=y[(Z|_>>22&1020)>>2]^y[(da|aa>>14&1020)>>2]^y[(ea|ba>>6&1020)>>2]^y[(fa|ca<<2&1020)>>2]^y[(X|ka|0)>>2],ha=y[(Z|aa>>22&1020)>>2]^y[(da|ba>>14&1020)>>2]^y[(ea|ca>>6&1020)>>2]^y[(fa|_<<2&1020)>>2]^y[(X|ka|4)>>2],ia=y[(Z|ba>>22&1020)>>2]^y[(da|ca>>14&1020)>>2]^y[(ea|_>>6&1020)>>2]^y[(fa|aa<<2&1020)>>2]^y[(X|ka|8)>>2],ja=y[(Z|ca>>22&1020)>>2]^y[(da|_>>14&1020)>>2]^y[(ea|aa>>6&1020)>>2]^y[(fa|ba<<2&1020)>>2]^y[(X|ka|12)>>2];_=ga,aa=ha,ba=ia,ca=ja}d=y[(Y|_>>22&1020)>>2]<<24^y[(Y|aa>>14&1020)>>2]<<16^y[(Y|ba>>6&1020)>>2]<<8^y[(Y|ca<<2&1020)>>2]^y[(X|ka|0)>>2],e=y[(Y|aa>>22&1020)>>2]<<24^y[(Y|ba>>14&1020)>>2]<<16^y[(Y|ca>>6&1020)>>2]<<8^y[(Y|_<<2&1020)>>2]^y[(X|ka|4)>>2],f=y[(Y|ba>>22&1020)>>2]<<24^y[(Y|ca>>14&1020)>>2]<<16^y[(Y|_>>6&1020)>>2]<<8^y[(Y|aa<<2&1020)>>2]^y[(X|ka|8)>>2],g=y[(Y|ca>>22&1020)>>2]<<24^y[(Y|_>>14&1020)>>2]<<16^y[(Y|aa>>6&1020)>>2]<<8^y[(Y|ba<<2&1020)>>2]^y[(X|ka|12)>>2]}function B(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,X,Y,Z,$)}function C(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0;A(1024,3072,8192,x,X,$,Z,Y);_=e,e=g,g=_}function D(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h^X,i^Y,j^Z,k^$);h=d,i=e,j=f,k=g}function E(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0;A(1024,3072,8192,x,X,$,Z,Y);_=e,e=g,g=_;d=d^h,e=e^i,f=f^j,g=g^k;h=X,i=Y,j=Z,k=$}function F(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);h=d=d^X,i=e=e^Y,j=f=f^Z,k=g=g^$}function G(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);d=d^X,e=e^Y,f=f^Z,g=g^$;h=X,i=Y,j=Z,k=$}function H(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);h=d,i=e,j=f,k=g;d=d^X,e=e^Y,f=f^Z,g=g^$}function I(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,l,m,n,o);o=~s&o|s&o+1,n=~r&n|r&n+((o|0)==0),m=~q&m|q&m+((n|0)==0),l=~p&l|p&l+((m|0)==0);d=d^X,e=e^Y,f=f^Z,g=g^$}function J(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;X=X^h,Y=Y^i,Z=Z^j,$=$^k;_=t|0,aa=u|0,ba=v|0,ca=w|0;for(;(ha|0)<128;ha=ha+1|0){if(_>>>31){da=da^X,ea=ea^Y,fa=fa^Z,ga=ga^$}_=_<<1|aa>>>31,aa=aa<<1|ba>>>31,ba=ba<<1|ca>>>31,ca=ca<<1;ia=$&1;$=$>>>1|Z<<31,Z=Z>>>1|Y<<31,Y=Y>>>1|X<<31,X=X>>>1;if(ia)X=X^3774873600}h=da,i=ea,j=fa,k=ga}function K(X){X=X|0;x=X}function L(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;d=X,e=Y,f=Z,g=$}function M(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;h=X,i=Y,j=Z,k=$}function N(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;l=X,m=Y,n=Z,o=$}function O(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;p=X,q=Y,r=Z,s=$}function P(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;o=~s&o|s&$,n=~r&n|r&Z,m=~q&m|q&Y,l=~p&l|p&X}function Q(X){X=X|0;if(X&15)return-1;z[X|0]=d>>>24,z[X|1]=d>>>16&255,z[X|2]=d>>>8&255,z[X|3]=d&255,z[X|4]=e>>>24,z[X|5]=e>>>16&255,z[X|6]=e>>>8&255,z[X|7]=e&255,z[X|8]=f>>>24,z[X|9]=f>>>16&255,z[X|10]=f>>>8&255,z[X|11]=f&255,z[X|12]=g>>>24,z[X|13]=g>>>16&255,z[X|14]=g>>>8&255,z[X|15]=g&255;return 16}function R(X){X=X|0;if(X&15)return-1;z[X|0]=h>>>24,z[X|1]=h>>>16&255,z[X|2]=h>>>8&255,z[X|3]=h&255,z[X|4]=i>>>24,z[X|5]=i>>>16&255,z[X|6]=i>>>8&255,z[X|7]=i&255,z[X|8]=j>>>24,z[X|9]=j>>>16&255,z[X|10]=j>>>8&255,z[X|11]=j&255,z[X|12]=k>>>24,z[X|13]=k>>>16&255,z[X|14]=k>>>8&255,z[X|15]=k&255;return 16}function S(){B(0,0,0,0);t=d,u=e,v=f,w=g}function T(X,Y,Z){X=X|0;Y=Y|0;Z=Z|0;var $=0;if(Y&15)return-1;while((Z|0)>=16){V[X&7](z[Y|0]<<24|z[Y|1]<<16|z[Y|2]<<8|z[Y|3],z[Y|4]<<24|z[Y|5]<<16|z[Y|6]<<8|z[Y|7],z[Y|8]<<24|z[Y|9]<<16|z[Y|10]<<8|z[Y|11],z[Y|12]<<24|z[Y|13]<<16|z[Y|14]<<8|z[Y|15]);z[Y|0]=d>>>24,z[Y|1]=d>>>16&255,z[Y|2]=d>>>8&255,z[Y|3]=d&255,z[Y|4]=e>>>24,z[Y|5]=e>>>16&255,z[Y|6]=e>>>8&255,z[Y|7]=e&255,z[Y|8]=f>>>24,z[Y|9]=f>>>16&255,z[Y|10]=f>>>8&255,z[Y|11]=f&255,z[Y|12]=g>>>24,z[Y|13]=g>>>16&255,z[Y|14]=g>>>8&255,z[Y|15]=g&255;$=$+16|0,Y=Y+16|0,Z=Z-16|0}return $|0}function U(X,Y,Z){X=X|0;Y=Y|0;Z=Z|0;var $=0;if(Y&15)return-1;while((Z|0)>=16){W[X&1](z[Y|0]<<24|z[Y|1]<<16|z[Y|2]<<8|z[Y|3],z[Y|4]<<24|z[Y|5]<<16|z[Y|6]<<8|z[Y|7],z[Y|8]<<24|z[Y|9]<<16|z[Y|10]<<8|z[Y|11],z[Y|12]<<24|z[Y|13]<<16|z[Y|14]<<8|z[Y|15]);$=$+16|0,Y=Y+16|0,Z=Z-16|0}return $|0}var V=[B,C,D,E,F,G,H,I];var W=[D,J];return{set_rounds:K,set_state:L, -set_iv:M,set_nonce:N,set_mask:O,set_counter:P,get_state:Q,get_iv:R,gcm_init:S,cipher:T,mac:U}}(m,b,c);return n.set_key=e,n};return m.ENC={ECB:0,CBC:2,CFB:4,OFB:6,CTR:7},m.DEC={ECB:1,CBC:3,CFB:5,OFB:6,CTR:7},m.MAC={CBC:0,GCM:1},m.HEAP_DATA=16384,m}(),Ya=A.prototype;Ya.BLOCK_SIZE=16,Ya.reset=D,Ya.encrypt=z,Ya.decrypt=z;var Za=B.prototype;Za.BLOCK_SIZE=16,Za.reset=D,Za.process=y,Za.finish=z;var $a=68719476704,_a=F.prototype;_a.BLOCK_SIZE=16,_a.reset=I,_a.encrypt=L,_a.decrypt=O;var ab=G.prototype;ab.BLOCK_SIZE=16,ab.reset=I,ab.process=J,ab.finish=K;var bb=H.prototype;bb.BLOCK_SIZE=16,bb.reset=I,bb.process=M,bb.finish=N;var cb=new Uint8Array(1048576),db=Xa(b,null,cb.buffer);a.AES_GCM=F,a.AES_GCM.encrypt=P,a.AES_GCM.decrypt=Q,a.AES_GCM.Encrypt=G,a.AES_GCM.Decrypt=H;var eb=64,fb=32;V.BLOCK_SIZE=eb,V.HASH_SIZE=fb;var gb=V.prototype;gb.reset=R,gb.process=S,gb.finish=T;var hb=null;V.bytes=X,V.hex=Y,V.base64=Z,a.SHA256=V;var ib=$.prototype;ib.reset=ba,ib.process=ca,ib.finish=da,ea.BLOCK_SIZE=V.BLOCK_SIZE,ea.HMAC_SIZE=V.HASH_SIZE;var jb=ea.prototype;jb.reset=fa,jb.process=ca,jb.finish=ga;var kb=null;ea.bytes=ia,ea.hex=ja,ea.base64=ka,a.HMAC_SHA256=ea;var lb=la.prototype;lb.reset=ma,lb.generate=na;var mb=oa.prototype;mb.reset=ma,mb.generate=pa;var nb,ob=null,pb=function(){function a(){function a(){b^=d<<11,l=l+b|0,d=d+f|0,d^=f>>>2,m=m+d|0,f=f+l|0,f^=l<<8,n=n+f|0,l=l+m|0,l^=m>>>16,o=o+l|0,m=m+n|0,m^=n<<10,p=p+m|0,n=n+o|0,n^=o>>>4,b=b+n|0,o=o+p|0,o^=p<<8,d=d+o|0,p=p+b|0,p^=b>>>9,f=f+p|0,b=b+d|0}var b,d,f,l,m,n,o,p;h=i=j=0,b=d=f=l=m=n=o=p=2654435769;for(var q=0;4>q;q++)a();for(var q=0;256>q;q+=8)b=b+g[0|q]|0,d=d+g[1|q]|0,f=f+g[2|q]|0,l=l+g[3|q]|0,m=m+g[4|q]|0,n=n+g[5|q]|0,o=o+g[6|q]|0,p=p+g[7|q]|0,a(),e.set([b,d,f,l,m,n,o,p],q);for(var q=0;256>q;q+=8)b=b+e[0|q]|0,d=d+e[1|q]|0,f=f+e[2|q]|0,l=l+e[3|q]|0,m=m+e[4|q]|0,n=n+e[5|q]|0,o=o+e[6|q]|0,p=p+e[7|q]|0,a(),e.set([b,d,f,l,m,n,o,p],q);c(1),k=256}function b(b){var c,d,e,h,i;if(q(b))b=new Uint8Array(b.buffer);else if(m(b))h=new Wa(1),h[0]=b,b=new Uint8Array(h.buffer);else if(n(b))b=f(b);else{if(!o(b))throw new TypeError("bad seed type");b=new Uint8Array(b)}for(i=b.length,d=0;i>d;d+=1024){for(e=d,c=0;1024>c&&i>e;e=d|++c)g[c>>2]^=b[e]<<((3&c)<<3);a()}}function c(a){a=a||1;for(var b,c,d;a--;)for(j=j+1|0,i=i+j|0,b=0;256>b;b+=4)h^=h<<13,h=e[b+128&255]+h|0,c=e[0|b],e[0|b]=d=e[c>>>2&255]+(h+i|0)|0,g[0|b]=i=e[d>>>10&255]+c|0,h^=h>>>6,h=e[b+129&255]+h|0,c=e[1|b],e[1|b]=d=e[c>>>2&255]+(h+i|0)|0,g[1|b]=i=e[d>>>10&255]+c|0,h^=h<<2,h=e[b+130&255]+h|0,c=e[2|b],e[2|b]=d=e[c>>>2&255]+(h+i|0)|0,g[2|b]=i=e[d>>>10&255]+c|0,h^=h>>>16,h=e[b+131&255]+h|0,c=e[3|b],e[3|b]=d=e[c>>>2&255]+(h+i|0)|0,g[3|b]=i=e[d>>>10&255]+c|0}function d(){return k--||(c(1),k=255),g[k]}var e=new Uint32Array(256),g=new Uint32Array(256),h=0,i=0,j=0,k=0;return{seed:b,prng:c,rand:d}}(),qb=b.console,rb=b.Date.now,sb=b.Math.random,tb=b.performance,ub=b.crypto||b.msCrypto;void 0!==ub&&(nb=ub.getRandomValues);var vb,wb=pb.rand,xb=pb.seed,yb=0,zb=!1,Ab=!1,Bb=0,Cb=256,Db=!1,Eb=!1,Fb={};if(void 0!==tb)vb=function(){return 1e3*tb.now()|0};else{var Gb=1e3*rb()|0;vb=function(){return 1e3*rb()-Gb|0}}a.random=ua,a.random.seed=sa,Object.defineProperty(ua,"allowWeak",{get:function(){return Db},set:function(a){Db=a}}),Object.defineProperty(ua,"skipSystemRNGWarning",{get:function(){return Eb},set:function(a){Eb=a}}),a.getRandomValues=ta,a.getRandomValues.seed=sa,Object.defineProperty(ta,"allowWeak",{get:function(){return Db},set:function(a){Db=a}}),Object.defineProperty(ta,"skipSystemRNGWarning",{get:function(){return Eb},set:function(a){Eb=a}}),b.Math.random=ua,void 0===b.crypto&&(b.crypto={}),b.crypto.getRandomValues=ta;var Hb,Ib={Uint32Array:Uint32Array,Math:b.Math},Jb=new Uint32Array(1048576);void 0===Ib.Math.imul?(Ib.Math.imul=xa,Hb=va(Ib,null,Jb.buffer),delete Ib.Math.imul):Hb=va(Ib,null,Jb.buffer);var Kb=new Uint32Array(0),Lb=ya.prototype=new Number;Lb.toString=za,Lb.toBytes=Aa,Lb.valueOf=Ba,Lb.clamp=Ca,Lb.slice=Da,Lb.negate=Ea,Lb.compare=Fa,Lb.add=Ga,Lb.subtract=Ha,Lb.multiply=Ia,Lb.square=Ja,Lb.divide=Ka;var Mb=new ya(0),Nb=new ya(1);Object.freeze(Mb),Object.freeze(Nb);var Ob=Na.prototype=new ya;Ob.reduce=Oa,Ob.inverse=Pa,Ob.power=Qa;var Pb=[2,3];return Lb.isProbablePrime=Ta,ya.randomProbablePrime=Va,ya.ZERO=Mb,ya.ONE=Nb,ya.extGCD=Ma,a.BigNumber=ya,a.Modulus=Na,"function"==typeof define&&define.amd?define([],function(){return a}):"object"==typeof module&&module.exports?module.exports=a:b.asmCrypto=a,a}({},this); diff --git a/assets/dl.svg b/assets/dl.svg new file mode 100644 index 00000000..fc57a36a --- /dev/null +++ b/assets/dl.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/error.svg b/assets/error.svg new file mode 100644 index 00000000..0d478816 --- /dev/null +++ b/assets/error.svg @@ -0,0 +1,258 @@ + + + + + + image/svg+xml + + 5A8EEB55-E89B-49C5-8493-6FC78CEDF580 + + + + + 5A8EEB55-E89B-49C5-8493-6FC78CEDF580 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/eye-off.svg b/assets/eye-off.svg new file mode 100644 index 00000000..6edb1745 --- /dev/null +++ b/assets/eye-off.svg @@ -0,0 +1 @@ + diff --git a/assets/eye.svg b/assets/eye.svg new file mode 100644 index 00000000..059dd2e9 --- /dev/null +++ b/assets/eye.svg @@ -0,0 +1 @@ + diff --git a/assets/favicon-120.png b/assets/favicon-120.png deleted file mode 100644 index 1fa60cd8..00000000 Binary files a/assets/favicon-120.png and /dev/null differ diff --git a/assets/favicon-128.png b/assets/favicon-128.png deleted file mode 100644 index 45f37fce..00000000 Binary files a/assets/favicon-128.png and /dev/null differ diff --git a/assets/favicon-144.png b/assets/favicon-144.png deleted file mode 100644 index 5f822567..00000000 Binary files a/assets/favicon-144.png and /dev/null differ diff --git a/assets/favicon-152.png b/assets/favicon-152.png deleted file mode 100644 index afa2e978..00000000 Binary files a/assets/favicon-152.png and /dev/null differ diff --git a/assets/favicon-167.png b/assets/favicon-167.png deleted file mode 100644 index d39f8a0c..00000000 Binary files a/assets/favicon-167.png and /dev/null differ diff --git a/assets/favicon-16x16.png b/assets/favicon-16x16.png new file mode 100644 index 00000000..1926e1bf Binary files /dev/null and b/assets/favicon-16x16.png differ diff --git a/assets/favicon-180.png b/assets/favicon-180.png deleted file mode 100644 index 67a23392..00000000 Binary files a/assets/favicon-180.png and /dev/null differ diff --git a/assets/favicon-195.png b/assets/favicon-195.png deleted file mode 100644 index bb763ea5..00000000 Binary files a/assets/favicon-195.png and /dev/null differ diff --git a/assets/favicon-196.png b/assets/favicon-196.png deleted file mode 100644 index 8ca0f0b9..00000000 Binary files a/assets/favicon-196.png and /dev/null differ diff --git a/assets/favicon-228.png b/assets/favicon-228.png deleted file mode 100644 index 3df9e05c..00000000 Binary files a/assets/favicon-228.png and /dev/null differ diff --git a/assets/favicon-32.png b/assets/favicon-32.png deleted file mode 100644 index 045edd37..00000000 Binary files a/assets/favicon-32.png and /dev/null differ diff --git a/assets/favicon-32x32.png b/assets/favicon-32x32.png new file mode 100644 index 00000000..f00f4ee7 Binary files /dev/null and b/assets/favicon-32x32.png differ diff --git a/assets/favicon-96.png b/assets/favicon-96.png deleted file mode 100644 index ab851902..00000000 Binary files a/assets/favicon-96.png and /dev/null differ diff --git a/assets/github-icon.svg b/assets/github-icon.svg deleted file mode 100644 index 44e074c8..00000000 --- a/assets/github-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/icon-64x64.png b/assets/icon-64x64.png new file mode 100644 index 00000000..e3a6b2a7 Binary files /dev/null and b/assets/icon-64x64.png differ diff --git a/assets/icon.svg b/assets/icon.svg new file mode 100644 index 00000000..e4bfb3d1 --- /dev/null +++ b/assets/icon.svg @@ -0,0 +1,34 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/illustration_download.svg b/assets/illustration_download.svg deleted file mode 100644 index 9425fc28..00000000 --- a/assets/illustration_download.svg +++ /dev/null @@ -1 +0,0 @@ -Untitled \ No newline at end of file diff --git a/assets/illustration_error.svg b/assets/illustration_error.svg deleted file mode 100644 index cba8d2e0..00000000 --- a/assets/illustration_error.svg +++ /dev/null @@ -1 +0,0 @@ -illustration \ No newline at end of file diff --git a/assets/illustration_expired.svg b/assets/illustration_expired.svg deleted file mode 100644 index 1d569f08..00000000 --- a/assets/illustration_expired.svg +++ /dev/null @@ -1 +0,0 @@ -Group \ No newline at end of file diff --git a/assets/lock.svg b/assets/lock.svg new file mode 100644 index 00000000..d4e16c96 --- /dev/null +++ b/assets/lock.svg @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/assets/main.css b/assets/main.css deleted file mode 100644 index 0ff37f08..00000000 --- a/assets/main.css +++ /dev/null @@ -1,1096 +0,0 @@ -/*** index.html ***/ -html { - background: url('./send_bg.svg'); - font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui', - 'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif; - font-weight: 200; - background-size: 110%; - background-repeat: no-repeat; - background-position: center top; - height: 100%; - margin: auto; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui', - 'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif; - display: flex; - flex-direction: column; - margin: 0; - min-height: 100vh; - position: relative; -} - -#progress circle { - stroke: #eee; - stroke-width: 0.75em; -} - -#progress #bar { - transition: stroke-dashoffset 300ms linear; - stroke: #3b9dff; -} - -.header { - align-items: flex-start; - box-sizing: border-box; - display: flex; - justify-content: space-between; - padding: 31px; - width: 100%; -} - -.send-logo { - display: flex; - position: relative; - align-items: center; -} - -.send-logo h1 { - transition: color 50ms; -} - -.send-logo h1:hover { - color: #0297f8; -} - -.send-logo > a { - display: flex; - flex-direction: row; -} - -.site-title { - color: #3e3d40; - font-size: 32px; - font-weight: 500; - margin: 0; - position: relative; - top: -1px; - letter-spacing: 1px; - margin-left: 8px; -} - -.site-subtitle { - color: #3e3d40; - font-size: 12px; - margin: 0 8px; -} - -.site-subtitle a { - font-weight: bold; - color: #3e3d40; - transition: color 50ms; -} - -.site-subtitle a:hover { - color: #0297f8; -} - -.feedback { - background-color: #0297f8; - background-image: url('./feedback.svg'); - background-position: 2px 4px; - background-repeat: no-repeat; - background-size: 18px; - border-radius: 3px; - border: 1px solid #0297f8; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); - color: #fff; - cursor: pointer; - display: block; - float: right; - font-size: 12px; - line-height: 12px; - opacity: 0.9; - padding: 5px; - overflow: hidden; - min-width: 12px; - max-width: 12px; - text-indent: 17px; - transition: all 250ms ease-in-out; - white-space: nowrap; -} - -.feedback:hover, -.feedback:focus { - min-width: 30px; - max-width: 300px; - text-indent: 2px; - padding: 5px 5px 5px 20px; - background-color: #0287e8; -} - -.feedback:active { - background-color: #0277d8; -} - -.all { - flex: 1; - display: flex; - flex-direction: column; - justify-content: flex-start; - max-width: 650px; - margin: 0 auto; - padding: 0 20px; - box-sizing: border-box; - width: 96%; -} - -pre, -input, -select, -textarea, -button { - font-family: inherit; - margin: 0; -} - -pre { - font-weight: 600; - display: inline-block; -} - -a { - text-decoration: none; -} - -.btn { - font-weight: 500; -} - -/** page-one **/ - -.fadeOut { - opacity: 0; - animation: fadeout 200ms linear; -} - -@keyframes fadeout { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - } -} - -.fadeIn { - opacity: 1; - animation: fadein 200ms linear; -} - -@keyframes fadein { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } -} - -.title { - font-size: 33px; - line-height: 40px; - margin: 20px auto; - text-align: center; - max-width: 520px; - font-family: 'SF Pro Text', sans-serif; - word-wrap: break-word; -} - -.description { - font-size: 15px; - line-height: 23px; - max-width: 630px; - text-align: center; - margin: 0 auto 60px; - color: #0c0c0d; - width: 92%; -} - -.upload-window { - border: 3px dashed rgba(0, 148, 251, 0.5); - margin: 0 auto 10px; - height: 255px; - border-radius: 4px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; - transition: transform 150ms; - padding: 15px; -} - -.upload-window.ondrag { - border: 5px dashed rgba(0, 148, 251, 0.5); - height: 251px; - transform: scale(1.04); - border-radius: 4.2px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; -} - -.link { - color: #0094fb; - text-decoration: none; -} - -.link:hover { - color: #0287e8; -} - -#upload-text { - font-size: 22px; - color: #737373; - margin: 20px 0 10px; - font-family: 'SF Pro Text', sans-serif; -} - -.browse { - background: #0297f8; - border-radius: 5px; - font-size: 20px; - color: #fff; - min-width: 240px; - height: 60px; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - padding: 0 10px; -} - -.browse:hover { - background-color: #0287e8; -} - -input[type='file'] { - opacity: 0; - overflow: hidden; - position: absolute; - z-index: -1; -} - -input[type='file'].has-focus + #browse, -input[type='file']:focus + #browse { - background-color: #0287e8; - outline: 1px dotted #000; - outline: -webkit-focus-ring-color auto 5px; -} - -#file-size-msg { - font-size: 12px; - line-height: 16px; - color: #737373; - margin-bottom: 22px; -} - -/** file-list **/ -th { - font-size: 16px; - color: #858585; - font-weight: lighter; - text-align: left; - background: rgba(0, 148, 251, 0.05); - height: 40px; - border-top: 1px solid rgba(0, 148, 251, 0.1); - padding: 0 19px; - white-space: nowrap; -} - -td { - font-size: 15px; - vertical-align: top; - color: #4a4a4a; - padding: 17px 19px 0; - line-height: 23px; - position: relative; -} - -table { - border-collapse: collapse; - font-family: 'Segoe UI', 'SF Pro Text', sans-serif; -} - -tbody { - word-wrap: break-word; - word-break: break-all; -} - -#uploaded-files { - margin: 45.3px auto; - table-layout: fixed; -} - -#uploaded-file { - width: 35%; -} - -#copy-file-list { - width: 25%; -} - -#expiry-file-list { - width: 21%; -} - -#delete-file-list { - width: 12%; -} - -.overflow-col { - text-overflow: ellipsis; - max-width: 0; - overflow: hidden; - white-space: nowrap; -} - -.center-col { - text-align: center; -} - -.icon-delete, -.icon-copy, -.icon-check { - cursor: pointer; -} - -.icon-copy[disabled='disabled'] { - pointer-events: none; - opacity: 0.3; -} - -.text-copied { - color: #0a8dff; -} - -/* Popup container */ -.popup { - position: absolute; - display: inline-block; -} - -/* The actual popup (appears on top) */ -.popup .popuptext { - visibility: hidden; - min-width: 204px; - min-height: 105px; - background-color: #fff; - color: #000; - border: 1px solid #d7d7db; - padding: 15px 24px; - box-sizing: content-box; - text-align: center; - border-radius: 5px; - position: absolute; - z-index: 1; - bottom: 20px; - left: -40px; - transition: opacity 0.5s; - opacity: 0; - outline: 0; - box-shadow: 3px 3px 7px rgba(136, 136, 136, 0.3); -} - -/* Popup arrow */ -.popup .popuptext::after { - content: ''; - position: absolute; - bottom: -11px; - left: 20px; - background-color: #fff; - display: block; - width: 20px; - height: 20px; - transform: rotate(45deg); - border-radius: 0 0 5px; - border-right: 1px solid #d7d7db; - border-bottom: 1px solid #d7d7db; -} - -.popup .show { - visibility: visible; - opacity: 1; -} - -.popup-message { - height: 40px; - display: flex; - justify-content: center; - align-items: center; - border-bottom: 1px #ebebeb solid; - color: #0c0c0d; - font-size: 15px; - font-weight: normal; - padding-bottom: 15px; - white-space: nowrap; - width: calc(100% + 48px); - margin-left: -24px; -} - -.popup-action { - margin-top: 15px; - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; -} - -.popup-yes { - color: #fff; - background-color: #0297f8; - border-radius: 5px; - padding: 5px 25px; - font-weight: normal; - cursor: pointer; - min-width: 94px; - box-sizing: border-box; - white-space: nowrap; - margin-left: 12px; -} - -.popup-yes:hover { - background-color: #0287e8; -} - -.popup-no { - color: #4a4a4a; - background-color: #fbfbfb; - border: 1px #c1c1c1 solid; - border-radius: 5px; - padding: 5px 25px; - font-weight: normal; - min-width: 94px; - box-sizing: border-box; - cursor: pointer; - white-space: nowrap; -} - -.popup-no:hover { - background-color: #efeff1; -} - -/** upload-progress **/ -.progress-bar { - margin-top: 3px; - display: flex; - justify-content: center; - align-items: center; - text-align: center; - position: relative; -} - -.percentage { - letter-spacing: -0.78px; - font-family: 'Segoe UI', 'SF Pro Text', sans-serif; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.percent-number { - font-size: 43.2px; - line-height: 58px; -} - -.percent-sign { - font-size: 28.8px; - stroke: none; - fill: #686868; -} - -.upload { - margin: 0 auto; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; - font-size: 15px; -} - -.progress-text { - color: rgba(0, 0, 0, 0.5); - letter-spacing: -0.4px; - margin-top: 24px; - margin-bottom: 74px; -} - -#cancel-upload { - color: #d70022; - background: #fff; - font-size: 15px; - border: 0; - cursor: pointer; - text-decoration: underline; -} - -#cancel-upload:disabled { - text-decoration: none; - cursor: auto; -} - -/** share-link **/ -#share-window { - margin: 0 auto; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - width: 100%; - max-width: 640px; -} - -#share-window-r > div { - font-size: 12px; - padding-bottom: 10px; -} - -#copy { - display: flex; - flex-wrap: nowrap; - width: 100%; -} - -#copy.wait-password #link, -#copy.wait-password #copy-btn { - opacity: 0.5; -} - -#copy-text { - align-self: flex-start; - margin-top: 60px; - margin-bottom: 10px; - color: #0c0c0d; - max-width: 614px; - word-wrap: break-word; -} - -#link { - flex: 1; - height: 56px; - border: 1px solid #0297f8; - border-radius: 6px 0 0 6px; - font-size: 20px; - color: #737373; - font-family: 'SF Pro Text', sans-serif; - letter-spacing: 0; - line-height: 23px; - font-weight: 300; - padding-left: 10px; - padding-right: 10px; -} - -#link:disabled { - border: 1px solid #05a700; - background: #fff; -} - -#copy-btn { - flex: 0 1 165px; - background: #0297f8; - border-radius: 0 6px 6px 0; - border: 1px solid #0297f8; - color: white; - cursor: pointer; - font-size: 15px; - padding-left: 10px; - padding-right: 10px; - white-space: nowrap; -} - -#copy-btn:not(:disabled):hover { - background-color: #0287e8; -} - -#copy-btn.success { - background: #05a700; - border: 1px solid #05a700; -} - -#copy-btn:disabled { - cursor: auto; -} - -#delete-file { - width: 176px; - height: 44px; - background: #fff; - border: 1px solid rgba(12, 12, 13, 0.3); - border-radius: 5px; - font-size: 15px; - margin-top: 50px; - margin-bottom: 12px; - cursor: pointer; - color: #313131; -} - -#delete-file:hover { - background: #efeff1; -} - -.send-new { - font-size: 15px; - margin: auto; - text-align: center; - color: #0094fb; - cursor: pointer; - text-decoration: underline; -} - -.send-new:hover, -.send-new:focus, -.send-new:active { - color: #0287e8; -} - -.hidden { - visibility: hidden; -} - -.selectPassword { - padding: 10px 0; - align-self: left; - max-width: 100%; - overflow-wrap: break-word; -} - -.setPassword { - align-self: left; - display: flex; - flex-wrap: nowrap; - width: 80%; - padding: 10px 5px; -} - -/* upload-error */ -#upload-error { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; -} - -#upload-error[hidden], -#unsupported-browser[hidden] { - display: none; -} - -#upload-error-img { - margin: 51px 0 71px; -} - -/* unsupported-browser */ -#unsupported-browser { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.unsupported-description { - font-size: 13px; - line-height: 23px; - text-align: center; - color: #7d7d7d; - margin: 0 auto 23px; -} - -.firefox-logo { - width: 70px; -} - -.firefox-logo-small { - width: 24px; -} - -#dl-firefox, -#update-firefox { - margin-bottom: 181px; - height: 80px; - background: #98e02b; - border-radius: 3px; - cursor: pointer; - border: 0; - box-shadow: 0 5px 3px rgb(234, 234, 234); - font-family: 'Fira Sans'; - font-weight: 500; - color: #fff; - font-size: 26px; - display: flex; - justify-content: center; - align-items: center; - line-height: 1; - padding: 0 25px; -} - -.unsupported-button-text { - text-align: left; - margin-left: 20.4px; -} - -.unsupported-button-text > span { - font-family: 'Fira Sans'; - font-weight: 300; - font-size: 18px; - letter-spacing: -0.69px; -} - -/** download.html **/ -#download-btn { - font-size: 15px; - color: white; - width: 180px; - height: 44px; - margin-top: 20px; - margin-bottom: 30px; - text-align: center; - background: #0297f8; - border: 1px solid #0297f8; - border-radius: 5px; - cursor: pointer; -} - -#download-btn:hover { - background-color: #0287e8; -} - -#download-btn:disabled { - background: #47b04b; - cursor: auto; -} - -#download { - margin: 0 auto 30px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; -} - -#expired-img { - margin: 51px 0 71px; -} - -.expired-description { - font-size: 15px; - line-height: 23px; - text-align: center; - color: #7d7d7d; - margin: 0 auto 23px; -} - -#download-progress { - width: 590px; -} - -#download-progress[hidden] { - display: none; -} - -#download-img { - width: 283px; - height: 196px; -} - -.enterPassword { - text-align: left; - padding: 40px; -} - -.red { - color: red; -} - -#unlock { - display: flex; - flex-wrap: nowrap; - width: 100%; - padding: 10px 0; -} - -.unlock-input { - flex: 1; - height: 46px; - border: 1px solid #0297f8; - border-radius: 6px 0 0 6px; - font-size: 20px; - color: #737373; - font-family: 'SF Pro Text', sans-serif; - letter-spacing: 0; - line-height: 23px; - font-weight: 300; - padding-left: 10px; - padding-right: 10px; -} - -#unlock-btn { - flex: 0 1 165px; - background: #0297f8; - border-radius: 0 6px 6px 0; - border: 1px solid #0297f8; - color: white; - cursor: pointer; - font-size: 15px; - padding-left: 10px; - padding-right: 10px; - white-space: nowrap; -} - -#unlock-btn:hover { - background-color: #0287e8; -} - -.btn-hidden { - visibility: hidden; -} - -.input-no-btn { - border-radius: 6px; -} - -/* footer */ -.footer { - right: 0; - bottom: 0; - left: 0; - font-size: 13px; - display: flex; - align-items: flex-end; - flex-direction: row; - justify-content: space-between; - padding: 50px 31px 41px; - width: 100%; - box-sizing: border-box; -} - -.mozilla-logo { - width: 112px; - height: 32px; - margin-bottom: -5px; -} - -.legal-links { - max-width: 81vw; - display: flex; - align-items: center; - flex-direction: row; -} - -.legal-links > a { - color: #858585; - opacity: 0.9; - white-space: nowrap; - margin-right: 2vw; -} - -.legal-links > a:hover { - opacity: 1; -} - -.legal-links > a:visited { - color: #858585; -} - -.social-links { - display: flex; - justify-content: space-between; - width: 94px; -} - -.social-links > a { - opacity: 0.9; -} - -.social-links > a:hover { - opacity: 1; -} - -.github, -.twitter { - width: 32px; - height: 32px; - margin-bottom: -5px; -} - -#addPasswordWrapper { - min-height: 24px; -} - -#addPassword { - position: absolute; - visibility: collapse; -} - -#addPasswordWrapper label { - line-height: 20px; - cursor: pointer; - position: relative; - opacity: 0.6; -} - -#addPassword:checked + label { - opacity: 1; -} - -#addPasswordWrapper label::before { - content: ''; - height: 20px; - width: 20px; - margin-right: 10px; - margin-left: 5px; - float: left; - border: 1px solid rgba(12, 12, 13, 0.3); - border-radius: 2px; -} - -#addPassword:checked + label::before { - background-image: url('./check-16-blue.svg'); - background-position: 2px 1px; -} - -.banner { - padding: 0 15px; - height: 48px; - background-color: #efeff1; - color: #4a4a4f; - font-size: 13px; - display: flex; - flex-direction: row; - align-content: center; - align-items: center; - justify-content: center; -} - -.banner > div { - display: flex; - align-items: center; - margin: 0 auto; -} - -.banner > div > span { - margin-left: 10px; -} - -@media (max-device-width: 992px), (max-width: 992px) { - .popup .popuptext { - left: auto; - right: -40px; - } - - .popup .popuptext::after { - left: auto; - right: 36px; - } -} - -@media (max-device-width: 768px), (max-width: 768px) { - .description { - margin: 0 auto 25px; - } - - #copy { - width: 100%; - } - - #link { - font-size: 18px; - } - - .footer { - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - max-width: 630px; - margin: auto; - } - - .mozilla-logo { - margin-left: -7px; - } - - .legal-links { - flex-direction: column; - margin: auto; - width: 100%; - max-width: 100%; - } - - .legal-links > * { - display: block; - padding: 10px 0; - align-self: flex-start; - } - - .social-links { - margin-top: 20px; - align-self: flex-start; - } -} - -@media (max-device-width: 520px), (max-width: 520px) { - .header { - flex-direction: column; - justify-content: flex-start; - } - - .feedback { - margin-top: 10px; - min-width: 30px; - max-width: 300px; - text-indent: 2px; - padding: 5px 5px 5px 20px; - } - - #copy, - .setPassword, - #unlock { - width: 100%; - flex-direction: column; - padding-left: 0; - } - - .selectPassword { - align-self: center; - min-width: 95%; - } - - #addPasswordWrapper label::before { - margin-left: 0; - } - - #link, - #unlock-input { - font-size: 22px; - padding: 15px 10px; - border-radius: 6px 6px 0 0; - } - - #copy-btn, - #unlock-btn { - border-radius: 0 0 6px 6px; - flex: 0 1 65px; - } - - #copy-text { - text-align: center; - } - - th { - font-size: 14px; - padding: 0 5px; - } - - td { - font-size: 13px; - padding: 17px 5px 0; - } -} diff --git a/assets/master-logo.svg b/assets/master-logo.svg new file mode 100644 index 00000000..ec8e6f8f --- /dev/null +++ b/assets/master-logo.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/mozilla-logo.svg b/assets/mozilla-logo.svg deleted file mode 100644 index 3ea2e868..00000000 --- a/assets/mozilla-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/notFound.svg b/assets/notFound.svg new file mode 100644 index 00000000..24e04000 --- /dev/null +++ b/assets/notFound.svg @@ -0,0 +1,274 @@ + + + + + + image/svg+xml + + 27A08916-26BA-4E40-BE07-5F49802F2EFC + + + + + 27A08916-26BA-4E40-BE07-5F49802F2EFC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/safari-pinned-tab.svg b/assets/safari-pinned-tab.svg new file mode 100644 index 00000000..d1fec797 --- /dev/null +++ b/assets/safari-pinned-tab.svg @@ -0,0 +1,34 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/select-arrow.svg b/assets/select-arrow.svg new file mode 100644 index 00000000..d43db4d0 --- /dev/null +++ b/assets/select-arrow.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/send-fb.jpg b/assets/send-fb.jpg index 784fe51f..a9dcbdbf 100644 Binary files a/assets/send-fb.jpg and b/assets/send-fb.jpg differ diff --git a/assets/send-twitter.jpg b/assets/send-twitter.jpg index d13d5f90..ae30ad54 100644 Binary files a/assets/send-twitter.jpg and b/assets/send-twitter.jpg differ diff --git a/assets/send_bg.svg b/assets/send_bg.svg deleted file mode 100644 index a4557acc..00000000 --- a/assets/send_bg.svg +++ /dev/null @@ -1 +0,0 @@ -File transfer_homepage Copy{ } \ No newline at end of file diff --git a/assets/send_logo.svg b/assets/send_logo.svg deleted file mode 100644 index b13d138f..00000000 --- a/assets/send_logo.svg +++ /dev/null @@ -1 +0,0 @@ -send logo \ No newline at end of file diff --git a/assets/share-24.svg b/assets/share-24.svg new file mode 100644 index 00000000..f85064c9 --- /dev/null +++ b/assets/share-24.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/assets/thunderbird-icon.svg b/assets/thunderbird-icon.svg new file mode 100644 index 00000000..4f555086 --- /dev/null +++ b/assets/thunderbird-icon.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/twitter-icon.svg b/assets/twitter-icon.svg deleted file mode 100644 index 8816009a..00000000 --- a/assets/twitter-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/upload.svg b/assets/upload.svg deleted file mode 100644 index f98e6b2e..00000000 --- a/assets/upload.svg +++ /dev/null @@ -1 +0,0 @@ -upload \ No newline at end of file diff --git a/assets/user.svg b/assets/user.svg new file mode 100644 index 00000000..3d052d07 --- /dev/null +++ b/assets/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/wordmark.svg b/assets/wordmark.svg new file mode 100644 index 00000000..bc4841c6 --- /dev/null +++ b/assets/wordmark.svg @@ -0,0 +1,6 @@ + + + + diff --git a/assets_src/apple-touch-icon.xcf b/assets_src/apple-touch-icon.xcf new file mode 100644 index 00000000..71584e92 Binary files /dev/null and b/assets_src/apple-touch-icon.xcf differ diff --git a/assets_src/completed.svg b/assets_src/completed.svg new file mode 100644 index 00000000..7d4736cb --- /dev/null +++ b/assets_src/completed.svg @@ -0,0 +1,284 @@ + + + + + + image/svg+xml + + CC310D7B-7EC7-4AEF-90E5-10044C2FA0F1 + + + + + + CC310D7B-7EC7-4AEF-90E5-10044C2FA0F1 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets_src/error.svg b/assets_src/error.svg new file mode 100644 index 00000000..cea8a7ac --- /dev/null +++ b/assets_src/error.svg @@ -0,0 +1,284 @@ + + + + + + image/svg+xml + + 5A8EEB55-E89B-49C5-8493-6FC78CEDF580 + + + + + + 5A8EEB55-E89B-49C5-8493-6FC78CEDF580 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets_src/icon.svg b/assets_src/icon.svg new file mode 100644 index 00000000..efa7b48e --- /dev/null +++ b/assets_src/icon.svg @@ -0,0 +1,76 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets_src/notFound.svg b/assets_src/notFound.svg new file mode 100644 index 00000000..ce74ddb8 --- /dev/null +++ b/assets_src/notFound.svg @@ -0,0 +1,300 @@ + + + + + + image/svg+xml + + 27A08916-26BA-4E40-BE07-5F49802F2EFC + + + + + + 27A08916-26BA-4E40-BE07-5F49802F2EFC + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets_src/safari-pinned-tab.svg b/assets_src/safari-pinned-tab.svg new file mode 100644 index 00000000..4f7a6f54 --- /dev/null +++ b/assets_src/safari-pinned-tab.svg @@ -0,0 +1,76 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets_src/send-header.xcf b/assets_src/send-header.xcf new file mode 100644 index 00000000..bff45898 Binary files /dev/null and b/assets_src/send-header.xcf differ diff --git a/browserconfig.xml b/browserconfig.xml deleted file mode 100644 index a1ff7e28..00000000 --- a/browserconfig.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - #0297F8 - - - \ No newline at end of file diff --git a/browserslist b/browserslist index d4ca6a4f..6ba761ca 100644 --- a/browserslist +++ b/browserslist @@ -1,5 +1,6 @@ last 2 chrome versions last 2 firefox versions +last 2 safari versions +last 2 edge versions +edge 18 firefox esr -ie >= 9 -safari >= 9 diff --git a/build/android_index_plugin.js b/build/android_index_plugin.js new file mode 100644 index 00000000..7f37d608 --- /dev/null +++ b/build/android_index_plugin.js @@ -0,0 +1,50 @@ +const path = require('path'); +const html = require('choo/html'); +const NAME = 'AndroidIndexPlugin'; + +function chunkFileNames(compilation) { + const names = {}; + for (const chunk of compilation.chunks) { + for (const file of chunk.files) { + if (!/\.map$/.test(file)) { + names[`${chunk.name}${path.extname(file)}`] = file; + } + } + } + return names; +} +class AndroidIndexPlugin { + apply(compiler) { + compiler.hooks.emit.tap(NAME, compilation => { + const files = chunkFileNames(compilation); + const page = html` + + + Send + + + + + + + + + ` + .toString() + .replace(/\n\s{6}/g, '\n'); + compilation.assets['android.html'] = { + source() { + return page; + }, + size() { + return page.length; + } + }; + }); + } +} + +module.exports = AndroidIndexPlugin; diff --git a/build/fluent_loader.js b/build/fluent_loader.js deleted file mode 100644 index 8ba41928..00000000 --- a/build/fluent_loader.js +++ /dev/null @@ -1,38 +0,0 @@ -const { MessageContext } = require('fluent'); - -function toJSON(map) { - return JSON.stringify(Array.from(map)); -} - -module.exports = function(source) { - const localeExp = this.options.locale || /([^/]+)\/[^/]+\.ftl$/; - const result = localeExp.exec(this.resourcePath); - const locale = result && result[1]; - // pre-parse the ftl - const context = new MessageContext(locale); - context.addMessages(source); - if (!locale) { - throw new Error(`couldn't find locale in: ${this.resourcePath}`); - } - return ` -module.exports = \` -if (typeof window === 'undefined') { - var fluent = require('fluent'); -} -var ctx = new fluent.MessageContext('${locale}', {useIsolating: false}); -ctx._messages = new Map(${toJSON(context._messages)}); -function translate(id, data) { - var msg = ctx.getMessage(id); - if (typeof(msg) !== 'string' && !msg.val && msg.attrs) { - msg = msg.attrs.title || msg.attrs.alt - } - return ctx.format(msg, data); -} -if (typeof window === 'undefined') { - module.exports = translate; -} -else { - window.translate = translate; -} -\``; -}; diff --git a/build/generate_l10n_map.js b/build/generate_l10n_map.js deleted file mode 100644 index 57f73ab4..00000000 --- a/build/generate_l10n_map.js +++ /dev/null @@ -1,22 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -function kv(d) { - return `"${d}": require('../public/locales/${d}/send.ftl')`; -} - -module.exports = function() { - const dirs = fs.readdirSync(path.join(__dirname, '..', 'public', 'locales')); - const code = ` - module.exports = { - translate: function (id, data) { return window.translate(id, data) }, - ${dirs.map(kv).join(',\n')} - };`; - return { - code, - dependencies: dirs.map(d => - require.resolve(`../public/locales/${d}/send.ftl`) - ), - cacheable: false - }; -}; diff --git a/build/package_json_loader.js b/build/package_json_loader.js deleted file mode 100644 index a03678f5..00000000 --- a/build/package_json_loader.js +++ /dev/null @@ -1,11 +0,0 @@ -const commit = require('git-rev-sync').short(); - -module.exports = function(source) { - const pkg = JSON.parse(source); - const version = { - commit, - source: pkg.homepage, - version: process.env.CIRCLE_TAG || `v${pkg.version}` - }; - return `module.exports = '${JSON.stringify(version)}'`; -}; diff --git a/build/readme.md b/build/readme.md new file mode 100644 index 00000000..b8fc18d7 --- /dev/null +++ b/build/readme.md @@ -0,0 +1,14 @@ +# Custom Loaders + +## Android Index Plugin + +Generates the `index.html` page for the native android client + +## Version Plugin + +Creates a `version.json` file that gets exposed by the `/__version__` route from the `package.json` file and current git commit hash. + +# See Also + +- [docs/build.md](../docs/build.md) +- [webpack.config.js](../webpack.config.js) \ No newline at end of file diff --git a/build/version_plugin.js b/build/version_plugin.js new file mode 100644 index 00000000..af351a3a --- /dev/null +++ b/build/version_plugin.js @@ -0,0 +1,33 @@ +const gitRevSync = require('git-rev-sync'); +const pkg = require('../package.json'); + +let commit = 'unknown'; + +try { + commit = gitRevSync.short(); +} catch (e) { + console.warn('Error fetching current git commit: ' + e); +} + +const version = JSON.stringify({ + commit, + source: pkg.homepage, + version: process.env.CIRCLE_TAG || `v${pkg.version}` +}); + +class VersionPlugin { + apply(compiler) { + compiler.hooks.emit.tap('VersionPlugin', compilation => { + compilation.assets['version.json'] = { + source() { + return version; + }, + size() { + return version.length; + } + }; + }); + } +} + +module.exports = VersionPlugin; diff --git a/circle.yml b/circle.yml deleted file mode 100644 index af534362..00000000 --- a/circle.yml +++ /dev/null @@ -1,35 +0,0 @@ -machine: - node: - version: 8 - services: - - docker - - redis - environment: - PATH: "/home/ubuntu/send/firefox:$PATH" - -dependencies: - pre: - - npm i -g get-firefox geckodriver nsp - - get-firefox --platform linux --extract --target /home/ubuntu/send - -deployment: - latest: - branch: master - commands: - - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - - docker build -t mozilla/send:latest . - - docker push mozilla/send:latest - tags: - tag: /.*/ - owner: mozilla - commands: - - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - - docker build -t mozilla/send:$CIRCLE_TAG . - - docker push mozilla/send:$CIRCLE_TAG - -test: - override: - - npm run build - - npm run lint - - npm test - - nsp check diff --git a/common/assets.js b/common/assets.js index b1db9acf..f1a4657e 100644 --- a/common/assets.js +++ b/common/assets.js @@ -1,6 +1,6 @@ -const genmap = require('../build/generate_asset_map'); +const genmap = require('./generate_asset_map'); const isServer = typeof genmap === 'function'; -const prefix = isServer ? '/' : ''; +let prefix = ''; let manifest = {}; try { //eslint-disable-next-line node/no-missing-require @@ -15,15 +15,38 @@ function getAsset(name) { return prefix + assets[name]; } +function setPrefix(name) { + prefix = name; +} + +function getMatches(match) { + return Object.keys(assets) + .filter(k => match.test(k)) + .map(getAsset); +} + const instance = { + setPrefix: setPrefix, get: getAsset, + match: getMatches, setMiddleware: function(middleware) { + function getManifest() { + return JSON.parse( + middleware.fileSystem.readFileSync( + middleware.getFilenameFromUrl('/manifest.json') + ) + ); + } if (middleware) { instance.get = function getAssetWithMiddleware(name) { - const f = middleware.fileSystem.readFileSync( - middleware.getFilenameFromUrl('/manifest.json') - ); - return prefix + JSON.parse(f)[name]; + const m = getManifest(); + return prefix + m[name]; + }; + instance.match = function matchAssetWithMiddleware(match) { + const m = getManifest(); + return Object.keys(m) + .filter(k => match.test(k)) + .map(k => prefix + m[k]); }; } } diff --git a/build/generate_asset_map.js b/common/generate_asset_map.js similarity index 53% rename from build/generate_asset_map.js rename to common/generate_asset_map.js index d1efebb1..6289e54c 100644 --- a/build/generate_asset_map.js +++ b/common/generate_asset_map.js @@ -1,3 +1,14 @@ +/* + This code is included by both the server and frontend via + common/assets.js + + When included from the server the export will be the function. + + When included from the frontend (via webpack) the export will + be an object mapping file names to hashed file names. Example: + "send_logo.svg": "send_logo.5fcfdf0e.svg" +*/ + const fs = require('fs'); const path = require('path'); @@ -8,12 +19,11 @@ function kv(f) { module.exports = function() { const files = fs.readdirSync(path.join(__dirname, '..', 'assets')); const code = `module.exports = { - "package.json": require('../package.json'), ${files.map(kv).join(',\n')} };`; return { code, dependencies: files.map(f => require.resolve('../assets/' + f)), - cacheable: false + cacheable: true }; }; diff --git a/common/locales.js b/common/locales.js deleted file mode 100644 index 17eb9c2a..00000000 --- a/common/locales.js +++ /dev/null @@ -1,51 +0,0 @@ -const gen = require('../build/generate_l10n_map'); - -const isServer = typeof gen === 'function'; -const prefix = isServer ? '/' : ''; -let manifest = {}; -try { - //eslint-disable-next-line node/no-missing-require - manifest = require('../dist/manifest.json'); -} catch (e) { - // use middleware -} - -const locales = isServer ? manifest : gen; - -function getLocale(name) { - return prefix + locales[`public/locales/${name}/send.ftl`]; -} - -function serverTranslator(name) { - return require(`../dist/${locales[`public/locales/${name}/send.ftl`]}`); -} - -function browserTranslator() { - return locales.translate; -} - -const translator = isServer ? serverTranslator : browserTranslator; - -const instance = { - get: getLocale, - getTranslator: translator, - setMiddleware: function(middleware) { - if (middleware) { - const _eval = require('require-from-string'); - instance.get = function getLocaleWithMiddleware(name) { - const f = middleware.fileSystem.readFileSync( - middleware.getFilenameFromUrl('/manifest.json') - ); - return prefix + JSON.parse(f)[`public/locales/${name}/send.ftl`]; - }; - instance.getTranslator = function(name) { - const f = middleware.fileSystem.readFileSync( - middleware.getFilenameFromUrl(instance.get(name)) - ); - return _eval(f.toString()); - }; - } - } -}; - -module.exports = instance; diff --git a/common/readme.md b/common/readme.md new file mode 100644 index 00000000..0aaad7ac --- /dev/null +++ b/common/readme.md @@ -0,0 +1,7 @@ +# Common Code + +This directory contains code loaded by both the frontend `app` and backend `server`. The code here can be challenging to understand at first because the contexts for the two (three counting the dev server) environments that include them are quite different, but the purpose of these modules are quite simple, to provide mappings from the source assets (`copy-16.png`) to the concrete production assets (`copy-16.db66e0bf.svg`). + +## Generate Asset Map + +This loader enumerates all the files in `assets/` so that `common/assets.js` can provide mappings from the source filename to the hashed filename used on the site. \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 37fb258e..8ad9fc6f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,12 @@ services: - "1443:1443" environment: - REDIS_HOST=redis - - NODE_ENV=production redis: image: redis:alpine + selenium-firefox: + image: b4handjr/selenium-firefox + ports: + - "${VNC_PORT:-5900}:5900" + shm_size: 2g + volumes: + - .:/code diff --git a/docs/AWS.md b/docs/AWS.md new file mode 100644 index 00000000..999dba85 --- /dev/null +++ b/docs/AWS.md @@ -0,0 +1,236 @@ +# Deployment to AWS + +This document describes how to do a deployment of Send in AWS + +## AWS requirements + +### Security groups (2) + +* ALB: + - inbound: allow traffic from anywhere on port 80 and 443 + - ountbound: allow traffic to the instance security group on port `8080` + +* Instance: + - inbound: allow SSH from your public IP or a bastion (changing the default SSH port is a good idea) + - inbound: allow traffic from the ALB security group on port `8080` + - ountbound: allow all traffic to anywhere + +### Resources + +* An S3 bucket (block all public access) + +* A private EC2 instance running Ubuntu `20.04` (you can use the [Amazon EC2 AMI Locator](https://cloud-images.ubuntu.com/locator/ec2/) to find the latest) + + Attach an IAM role to the instance with the following inline policy: + + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "s3:ListAllMyBuckets" + ], + "Resource": [ + "*" + ], + "Effect": "Allow" + }, + { + "Action": [ + "s3:ListBucket", + "s3:GetBucketLocation", + "s3:ListBucketMultipartUploads" + ], + "Resource": [ + "arn:aws:s3:::" + ], + "Effect": "Allow" + }, + { + "Action": [ + "s3:GetObject", + "s3:GetObjectVersion", + "s3:ListMultipartUploadParts", + "s3:PutObject", + "s3:AbortMultipartUpload", + "s3:DeleteObject", + "s3:DeleteObjectVersion" + ], + "Resource": [ + "arn:aws:s3:::/*" + ], + "Effect": "Allow" + } + ] + } + ``` + +* A public ALB: + + - Create a target group with the instance registered (HTTP on port `8080` and path `/`) + - Configure HTTP (port 80) to redirect to HTTPS (port 443) + - HTTPS (port 443) using the latest security policy and an ACM certificate like `send.mydomain.com` + +* A Route53 public record, alias from `send.mydomain.com` to the ALB + +## Software requirements + +* Git +* NodeJS `15.x` LTS +* Local Redis server + +### Prerequisite packages + +```bash +sudo apt update +sudo apt install -y apt-transport-https ca-certificates curl software-properties-common +``` + +### Add repositories + +* NodeJS `15.x` LTS (checkout [package.json](../package.json)): + +```bash +curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add - +echo 'deb [arch=amd64] https://deb.nodesource.com/node_15.x focal main' | sudo tee /etc/apt/sources.list.d/nodejs.list +``` + +* Git (latest) + +```bash +sudo add-apt-repository ppa:git-core/ppa +``` + +* Redis (latest) + +```bash +sudo add-apt-repository ppa:redislabs/redis +``` + +### Install required packages + +```bash +sudo apt update +sudo apt install git nodejs redis-server telnet +``` + +### Redis server + +#### Password (optional) + +Generate a strong password: + +```bash +makepasswd --chars=100 +``` + +Edit Redis configuration file `/etc/redis/redis.conf`: + +```bash +requirepass +``` + +_Note: documentation on securing Redis https://redis.io/topics/security_ + +#### Systemd + +Enable and (re)start the Redis server service: + +```bash +sudo systemctl enable redis-server +sudo systemctl restart redis-server +sudo systemctl status redis-server +``` + +## Website directory + +Setup a directory for the data + +``` +sudo mkdir -pv /var/www/send +sudo chown www-data:www-data /var/www/send +sudo 750 /var/www/send +``` + +### NodeJS + +Update npm: + +```bash +sudo npm install -g npm +``` + +Checkout current NodeJS and npm versions: + +```bash +node --version +npm --version +``` + +Clone repository, install JavaScript packages and compiles the assets: + +```bash +sudo su -l www-data -s /bin/bash +cd /var/www/send +git clone https://gitlab.com/timvisee/send.git . +npm install +npm run build +exit +``` + +Create the file `/var/www/send/.env` used by Systemd with your environment variables +(checkout [config.js](../server/config.js) for more configuration environment variables): + +``` +BASE_URL='https://send.mydomain.com' +NODE_ENV='production' +PORT='8080' +REDIS_PASSWORD='' +S3_BUCKET='' +``` + +Lower files and folders permissions to user and group `www-data`: + +``` +sudo find /var/www/send -type d -exec chmod 750 {} \; +sudo find /var/www/send -type f -exec chmod 640 {} \; +sudo find -L /var/www/send/node_modules/.bin/ -exec chmod 750 {} \; +``` + +### Systemd + +Create the file `/etc/systemd/system/send.service` with `root` user and `644` mode: + +``` +[Unit] +Description=Send +After=network.target +Requires=redis-server.service +Documentation=https://gitlab.com/timvisee/send + +[Service] +Type=simple +ExecStart=/usr/bin/npm run prod +EnvironmentFile=/var/www/send/.env +WorkingDirectory=/var/www/send +User=www-data +Group=www-data +Restart=on-failure + +[Install] +WantedBy=multi-user.target +``` + +_Note: could be better tuner to secure the service by restricting system permissions, +check with `systemd-analyze security send`_ + +Enable and start the Send service, check logs: + +``` +sudo systemctl daemon-reload +sudo systemctl enable send +sudo systemctl start send +sudo systemctl status send +journalctl -fu send +``` diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 548da409..8291a567 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -1,2 +1,2 @@ -# flod as main contact for string changes -public/locales/en-US/*.ftl @flodolo +# timvisee as main contact for string changes +public/locales/en-US/*.ftl @timvisee diff --git a/docs/acceptance-mobile.md b/docs/acceptance-mobile.md new file mode 100644 index 00000000..08d0d9c6 --- /dev/null +++ b/docs/acceptance-mobile.md @@ -0,0 +1,78 @@ +# Send V2 UX Mobile Acceptance and Spec Annotations + +`Date Created: 8/20/2018` + +## Acceptance Criteria + +Adapted from [this spreadsheet](https://airtable.com/shrkcBPOLkvNFOrpp) + +- [ ] It should look and feel of an Android App +- [ ] It should look and feel like the Send Web Client + +### Main Screen +- [ ] It should clearly Indicate the name of the product +- [ ] If user has no existing Sends, it should make clear the primary benefits of the service (private, e2e encrypted, self-destructing file sharing) +- [ ] It should allow users to access the file picker to create Send links +- [ ] If the user has existing Sends, it should display a card-based list view of each [see Cards section below] + +### Non-Authenticated Users +- [ ] It should make clear the benefits of a Firefox Account +- [ ] It should allow users to log into or create a Firefox account +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit the sendable file size to 1GB +- [ ] It should allow users to set an expiration time of 5 minutes, 1 hour, or 24 hours +- [ ] It should allow users to set a download count of 1 downloads + +### Authenticated Users +- [ ] It should indicate that the user is signed in via Firefox Account +- [ ] It should allow the user to sign out +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit users to sending 2.5GB per Send +- [ ] It should allow users to extend Send times up to 1 Week +- [ ] It should allow users to extend Send download counts up to 100 times + +### Cards +- [ ] It should display the name of the sent file/files +- [ ] It should display the time remaining before expiration +- [ ] It should display the number of downloads remaining before expiration +- [ ] It should have a button that lets the user copy the send link to their clipboard +- [ ] It should show a preview icon (not a thumbnail) that has some relationship to the file types or content being sent* (see 5.1 in spec) +- [ ] It should have an overflow (meatball) menu that when triggered, gives the user share or delete buttons +- [ ] While encrypting / pushing to server, it should display a progress meter and a cancel button +- [ ] For authenticated users, it should be expandable to display all files in a send (5.1.1) +- [ ] If user cancels Send, or Upload fails, it should display a warning in the card +- [ ] It should display expired Sends below current sends with their UI greyed out and an expiration warning for 24 hours after expiration +- [ ] It should remove expired cards from display after 24 hours +- [ ] It should let users permanently delete records expired sends +- [ ] It should display a visual indicator when a Send is password protected +- [ ] It should allow the user to share via a native Android share sheet +- [ ] It should allow me to create Send links through intents from other apps + +### General/other +- [ ] It should allow users to set passwords to protect their Sends +- [ ] It should warn users when they are trying to upload files larger than their share limit + +### Stretch +- [ ] It should allow users to use the photo gallery to create Send links +- [ ] It should allow users to use their camera to create Send links +- [ ] It should allow users to opt into notification when a share link expires +- [ ] It should allow users to opt into notifications when their link is downloaded + +## Annotations on Mobile Spec +This document tracks differences between the UX spec for Send and the intended MVP. + +[Spec Link](https://mozilla.invisionapp.com/share/GNN6KKOQ5XS) + +* 1.1: Spec describes toolbar which may not be possible given the application framework we're using. In particular, issues with the spec include the color, logo and different font weights may be an issue. +* 1.2: Spec's treatment of FxA UI may be difficult to match. We should use the default OAuth implementation and re-evaluate UX once we see an implementation demo. Also, the landing page UI should display a log-in CTA directly and not require users click into the hamburger menu. +* 2.1: MVP will only include file picker. Signed in users will be able to select multiple files. File selection flow will be Android-native. Probably don't have the ability to add notifications as in the last screen on this page. +* 2.1: @fzzzy will provide screenshots of this flow for UX evaluation and comment. +* 3.1.4: The spec shows deleting the last item in an unshared set returning the user to the picker menu. Instead, it should return to the app home page. +* 3.1.5: Same as 3.1.5 notes. Both cases should show the warning dialog. +* 4.1: We may not be able to do a thumbnail here. Instead we should specify a set of icons to be displayed. +* 6.3: We're not going to allow cards to be edited. This page is deprecated. +* 6.4: Swiping cards to delete is stretched. +* 6.5: We're not 100% sure what happens on network connectivity errors, we should test this and adapt UX as necessary. +* 7.1: The last screen on this page depicts a network error notification on the selection screen. Instead the user should hit the send button, be taken back to the cards and display the card as in 5.1.2 +* 7.3: May not be necessary...we can ask for permissions on install. +* 8.1: Notifications do not block launch diff --git a/docs/acceptance-web.md b/docs/acceptance-web.md new file mode 100644 index 00000000..859ef2fd --- /dev/null +++ b/docs/acceptance-web.md @@ -0,0 +1,73 @@ +# Send V2 UX Web Acceptance Criteria + +## General + +- [ ] It should match the spec provided. +- [ ] It should have a feedback button +- [ ] It should provide links to relevant legal documentation + +### Non-Authenticated Users + +- [ ] It should make clear the benefits of a Firefox Account +- [ ] It should allow users to log into or create a Firefox account +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit the sendable file size to 1GB +- [ ] It should allow users to set an expiration time of 5 minutes, 1 hour, or 24 hours +- [ ] It should allow users to set an download count of 1 downloads + +### Authenticated Users + +- [ ] It should indicate that the user is signed in via Firefox Account +- [ ] It should allow the user to sign out +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit users to sending 2.5GB per Send +- [ ] It should allow users to extend Send times up to 1 Week +- [ ] It should allow users to extend Send download counts up to 100 times + +### Main Screen + +- [ ] It should clearly indicate the name of the product +- [ ] If user has no existing Sends, it should make clear the primary benefits of the service (private, e2e encrypted, self-destructing file sharing) +- [ ] It should allow users to access the file picker to create Send links +- [ ] It should allow users to drag and drop files +- [ ] It should provide affordances to sign in to Send +- [ ] If the user has existing Sends, it should display a card-based list view of each + +### Upload UI + +- [ ] It should allow users to continue to add files to their upload up to a set limit +- [ ] It should allow users to set a password +- [ ] It should let users delete items from their upload bundle + +### Uploading UI + +- [ ] It should display an affordance to demonstrate the status of an upload + +### Share UI + +- [ ] It should provide a copiable URL to the bundle + +### Download UI + +- [ ] It should prompt the user for a password if one is required +- [ ] It should provide feedback for incorrect passwords +- [ ] It should provide a description of Send to make clear what this service is +- [ ] It should let the user see the files they are downloading +- [ ] It should let the user download their files + +### Download Complete UI + +- [ ] It should indicate that a download is complete +- [ ] It should provide a description of the Send service +- [ ] It should provide a link back to the upload UI + +### Expiry UI + +- [ ] It should provide a generic message indicating a share has expired +- [ ] It should allow the user to navigate back to the upload page + +### In Memory DL Page + +- [ ] It should show in case a user tries to download a large file on a suboptimal client +- [ ] It should suggest the user use Firefox +- [ ] It should let the user copy the download url \ No newline at end of file diff --git a/docs/build.md b/docs/build.md new file mode 100644 index 00000000..f440f410 --- /dev/null +++ b/docs/build.md @@ -0,0 +1,22 @@ +Send has two build configurations, development and production. Both can be run via `npm` scripts, `npm start` for development and `npm run build` for production. Webpack is our only build tool and all configuration lives in [webpack.config.js](../webpack.config.js). + +# Development + +`npm start` launches a `webpack-dev-server` on port 8080 that compiles the assets and watches files for changes. It also serves the backend API and frontend unit tests via the `server/bin/dev.js` entrypoint. The frontend tests can be run in the browser by navigating to http://localhost:8080/test and will rerun automatically as the watched files are saved with changes. + +# Production + +`npm run build` compiles the assets and writes the files to the `dist/` directory. `npm run prod` launches an Express server on port 1443 that serves the backend API and frontend static assets from `dist/` via the `server/bin/prod.js` entrypoint. + +# Notable differences + +- Development compiles assets in memory, so no `dist/` directory is generated +- Development does not enable CSP headers +- Development frontend source is instrumented for code coverage +- Only development includes sourcemaps +- Only development exposes the `/test` route +- Production sets Cache-Control immutable headers on the hashed static assets + +# Custom Loaders + +The `build/` directory contains custom webpack loaders specific to Send. See [build/readme.md](../build/readme.md) for details on each loader. \ No newline at end of file diff --git a/docs/deployment.md b/docs/deployment.md new file mode 100644 index 00000000..e4f6f60c --- /dev/null +++ b/docs/deployment.md @@ -0,0 +1,96 @@ +## Requirements + +This document describes how to do a full deployment of Send on your own Linux server. You will need: + +* A working (and ideally somewhat recent) installation of NodeJS and npm +* Git +* Apache webserver +* Optionally telnet, to be able to quickly check your installation + +For example in Debian/Ubuntu systems: + +```bash +sudo apt install git apache2 nodejs npm telnet +``` + +## Building + +* We assume an already configured virtual-host on your webserver with an existing empty htdocs folder +* First, remove that htdocs folder - we will replace it with Send's version now +* git clone https://github.com/timvisee/send.git htdocs +* Make now sure you are NOT root but rather the user your webserver is serving files under (e.g. "su www-data" or whoever the owner of your htdocs folder is) +* npm install +* npm run build + +## Running + +To have a permanently running version of Send as a background process: + +* Create a file `run.sh` with: + +```bash +#!/bin/bash +nohup su www-data -c "npm run prod" 2>/dev/null & +``` + +* Execute the script: + +```bash +chmod +x run.sh +./run.sh +``` + +Now the Send backend should be running on port 1443. You can check with: + +```bash +telnet localhost 1443 +``` + +## Reverse Proxy + +Of course, we don't want to expose the service on port 1443. Instead we want our normal webserver to forward all requests to Send ("Reverse proxy"). + +# Apache webserver + +* Enable Apache required modules: + +```bash +sudo a2enmod headers +sudo a2enmod proxy +sudo a2enmod proxy_http +sudo a2enmod proxy_wstunnel +sudo a2enmod rewrite +``` + +* Edit your Apache virtual host configuration file, insert this: + +``` +# Enable rewrite engine +RewriteEngine on + +# Make sure the original domain name is forwarded to Send +# Otherwise the generated URLs will be wrong +ProxyPreserveHost on + +# Make sure the generated URL is https:// +RequestHeader set X-Forwarded-Proto https + +# If it's a normal file (e.g. PNG, CSS) just return it +RewriteCond %{REQUEST_FILENAME} -f +RewriteRule .* - [L] + +# If it's a websocket connection, redirect it to a Send WS connection +RewriteCond %{HTTP:Upgrade} =websocket [NC] +RewriteRule /(.*) ws://127.0.0.1:1443/$1 [P,L] + +# Otherwise redirect it to a normal HTTP connection +RewriteRule ^/(.*)$ http://127.0.0.1:1443/$1 [P,QSA] +ProxyPassReverse "/" "http://127.0.0.1:1443" +``` + +* Test configuration and restart Apache: + +```bash +sudo apache2ctl configtest +sudo systemctl restart apache2 +``` diff --git a/docs/docker.md b/docs/docker.md index 9003412b..265485a7 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -1,35 +1,160 @@ -## Setup +## Docker Quickstart -Before building the Docker image, you must build the production assets: +Use `registry.gitlab.com/timvisee/send:latest` from [`timvisee/send`'s Gitlab image registry](https://gitlab.com/timvisee/send/container_registry) for the latest Docker image. -```sh -npm run build +```bash +docker pull registry.gitlab.com/timvisee/send:latest + +# example quickstart (point REDIS_HOST to an already-running redis server) +docker run -v $PWD/uploads:/uploads -p 1443:1443 \ + -e 'DETECT_BASE_URL=true' \ + -e 'REDIS_HOST=localhost' \ + -e 'FILE_DIR=/uploads' \ + registry.gitlab.com/timvisee/send:latest ``` -Then you can run either `docker build` or `docker-compose up`. +Or clone this repo and run `docker build -t send:latest .` to build an image locally. +*Note: for Docker Compose, see: https://github.com/timvisee/send-docker-compose* -## Environment variables: +## Environment Variables -| Name | Description +All the available config options and their defaults can be found here: https://github.com/timvisee/send/blob/master/server/config.js + +Config options should be set as unquoted environment variables. Boolean options should be `true`/`false`, time/duration should be integers (seconds), and filesize values should be integers (bytes). + +Config options expecting array values (e.g. `EXPIRE_TIMES_SECONDS`, `DOWNLOAD_COUNTS`) should be in unquoted CSV format. UI dropdowns will default to the first value in the CSV, e.g. `DOWNLOAD_COUNTS=5,1,10,100` will show four dropdown options, with `5` selected by the default. + +#### Server Configuration + +| Name | Description | |------------------|-------------| -| `PORT` | Port the server will listen on (defaults to 1443). -| `S3_BUCKET` | The S3 bucket name. -| `REDIS_HOST` | Host name of the Redis server. -| `GOOGLE_ANALYTICS_ID` | Google Analytics ID -| `SENTRY_CLIENT` | Sentry Client ID -| `SENTRY_DSN` | Sentry DSN -| `MAX_FILE_SIZE` | in bytes (defaults to 2147483648) -| `NODE_ENV` | "production" +| `BASE_URL` | The HTTPS URL where traffic will be served (e.g. `https://send.firefox.com`) +| `DETECT_BASE_URL` | Autodetect the base URL using browser if `BASE_URL` is unset (defaults to `false`) +| `PORT` | Port the server will listen on (defaults to `1443`) +| `NODE_ENV` | Run in `development` mode (unsafe) or `production` mode (the default) +| `SEND_FOOTER_DMCA_URL` | A URL to a contact page for DMCA requests (empty / not shown by default) +| `SENTRY_CLIENT`, `SENTRY_DSN` | Sentry Client ID and DSN for error tracking (optional, disabled by default) -## Example: +*Note: more options can be found here: https://github.com/timvisee/send/blob/master/server/config.js* -```sh -$ docker run --net=host -e 'NODE_ENV=production' \ +#### Upload and Download Limits + +Configure the limits for uploads and downloads. Long expiration times are risky on public servers as people may use you as free hosting for copyrighted content or malware (which is why Mozilla shut down their `send` service). It's advised to only expose your service on a LAN/intranet, password protect it with a proxy/gateway, or make sure to set `SEND_FOOTER_DMCA_URL` above so you can respond to takedown requests. + +| Name | Description | +|------------------|-------------| +| `MAX_FILE_SIZE` | Maximum upload file size in bytes (defaults to `2147483648` aka 2GB) +| `MAX_FILES_PER_ARCHIVE` | Maximum number of files per archive (defaults to `64`) +| `MAX_EXPIRE_SECONDS` | Maximum upload expiry time in seconds (defaults to `604800` aka 7 days) +| `MAX_DOWNLOADS` | Maximum number of downloads (defaults to `100`) +| `DOWNLOAD_COUNTS` | Download limit options to show in UI dropdown, e.g. `10,1,2,5,10,15,25,50,100,1000` +| `EXPIRE_TIMES_SECONDS` | Expire time options to show in UI dropdown, e.g. `3600,86400,604800,2592000,31536000` +| `DEFAULT_DOWNLOADS` | Default download limit in UI (defaults to `1`) +| `DEFAULT_EXPIRE_SECONDS` | Default expire time in UI (defaults to `86400`) + +*Note: more options can be found here: https://github.com/timvisee/send/blob/master/server/config.js* + +#### Storage Backend Options + +Pick how you want to store uploaded files and set these config options accordingly: + +- Local filesystem (the default): set `FILE_DIR` to the local path used inside the container for storage (or leave the default) +- S3-compatible object store: set `S3_BUCKET`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` (and `S3_ENDPOINT` if using something other than AWS) +- Google Cloud Storage: set `GCS_BUCKET` to the name of a GCS bucket (auth should be set up using [Application Default Credentials](https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-nodejs)) + +Redis is used as the metadata database for the backend and is required no matter which storage method you use. + +| Name | Description | +|------------------|-------------| +| `REDIS_HOST`, `REDIS_PORT`, `REDIS_USER`, `REDIS_PASSWORD`, `REDIS_DB` | Host name, port, and pass of the Redis server (defaults to `localhost`, `6379`, and no password) +| `FILE_DIR` | Directory for storage inside the Docker container (defaults to `/uploads`) +| `S3_BUCKET` | The S3 bucket name to use (only set if using S3 for storage) +| `S3_ENDPOINT` | An optional custom endpoint to use for S3 (defaults to AWS) +| `S3_USE_PATH_STYLE_ENDPOINT`| Whether to force [path style URLs](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#s3ForcePathStyle-property) for S3 objects (defaults to `false`) +| `AWS_ACCESS_KEY_ID` | S3 access key ID (only set if using S3 for storage) +| `AWS_SECRET_ACCESS_KEY` | S3 secret access key ID (only set if using S3 for storage) +| `GCS_BUCKET` | Google Cloud Storage bucket (only set if using GCP for storage) + +*Note: more options can be found here: https://github.com/timvisee/send/blob/master/server/config.js* + +## Branding + +To change the look the colors aswell as some graphics can be changed via environment variables. +See the table below for the variables and their default values. + +| Name | Default | Description | +|---|---|---| +| UI_COLOR_PRIMARY | #0a84ff | The primary color | +| UI_COLOR_ACCENT | #003eaa | The accent color (eg. for hover-effects) | +| UI_CUSTOM_ASSETS_ANDROID_CHROME_192PX | | A custom icon for Android (192x192px) | +| UI_CUSTOM_ASSETS_ANDROID_CHROME_512PX | | A custom icon for Android (512x512px) | +| UI_CUSTOM_ASSETS_APPLE_TOUCH_ICON | | A custom icon for Apple | +| UI_CUSTOM_ASSETS_FAVICON_16PX | | A custom favicon (16x16px) | +| UI_CUSTOM_ASSETS_FAVICON_32PX | | A custom favicon (32x32px) | +| UI_CUSTOM_ASSETS_ICON | | A custom icon (Logo on the top-left of the UI) | +| UI_CUSTOM_ASSETS_SAFARI_PINNED_TAB | | A custom icon for Safari | +| UI_CUSTOM_ASSETS_FACEBOOK | | A custom header image for Facebook | +| UI_CUSTOM_ASSETS_TWITTER | | A custom header image for Twitter | +| UI_CUSTOM_ASSETS_WORDMARK | | A custom wordmark (Text next to the logo) | +| UI_CUSTOM_CSS | | Allows you to define a custom CSS file for custom styling | +| CUSTOM_FOOTER_TEXT | | Allows you to define a custom footer | +| CUSTOM_FOOTER_URL | | Allows you to define a custom URL in your footer | + +Side note: If you define a custom URL and a custom footer, only the footer text will display, but will be hyperlinked to the URL. + +## Examples + +**Run using an Amazon Elasticache for the Redis DB, Amazon S3 for the storage backend, and Sentry for error reporting.** + +```bash +$ docker run -p 1443:1443 \ -e 'S3_BUCKET=testpilot-p2p-dev' \ -e 'REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' \ - -e 'GOOGLE_ANALYTICS_ID=UA-35433268-78' \ -e 'SENTRY_CLIENT=https://51e23d7263e348a7a3b90a5357c61cb2@sentry.prod.mozaws.net/168' \ -e 'SENTRY_DSN=https://51e23d7263e348a7a3b90a5357c61cb2:65e23d7263e348a7a3b90a5357c61c44@sentry.prod.mozaws.net/168' \ - mozilla/send:latest + -e 'BASE_URL=https://send.example.com' \ + registry.gitlab.com/timvisee/send:latest ``` + +*Note: make sure to replace the example values above with your real values before running.* + + +**Run totally self-hosted using the current filesystem directry (`$PWD`) to store the Redis data and file uploads, with a `5GB` upload limit, 1 month expiry, and contact URL set.** + +```bash +# create a network for the send backend and redis containers to talk to each other +$ docker network create timviseesend + +# start the redis container +$ docker run --net=timviseesend -v $PWD/redis:/data redis-server --appendonly yes + +# start the send backend container +$ docker run --net=timviseesend -v $PWD/uploads:/uploads -p 1443:1443 \ + -e 'BASE_URL=http://localhost:1443' \ + -e 'MAX_FILE_SIZE=5368709120' \ + -e 'MAX_EXPIRE_SECONDS=2592000' \ + -e 'SEND_FOOTER_DMCA_URL=https://example.com/dmca-contact-info' \ + registry.gitlab.com/timvisee/send:latest +``` +Then open http://localhost:1443 to view the UI. (change the `localhost` to your IP or hostname above to serve the UI to others) + +To run with HTTPS, you will need to set up a reverse proxy with SSL termination in front of the backend. See Docker Compose below for an example setup. + + +**Run with custom branding.** + +```bash +$ docker run -p 1443:1443 \ + -v $PWD/custom_assets:/app/dist/custom_assets \ + -e 'UI_COLOR_PRIMARY=#f00' \ + -e 'UI_COLOR_ACCENT=#a00' \ + -e 'UI_CUSTOM_ASSETS_ICON=custom_assets/logo.svg' \ + registry.gitlab.com/timvisee/send:latest +``` + +## Docker Compose + +For a Docker compose configuration example, see: + +https://github.com/timvisee/send-docker-compose diff --git a/docs/encryption.md b/docs/encryption.md new file mode 100644 index 00000000..b41d37de --- /dev/null +++ b/docs/encryption.md @@ -0,0 +1,46 @@ +# File Encryption + +Send uses 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt files in the browser before uploading them to the server. The code is in [app/keychain.js](../app/keychain.js). + +## Steps + +### Uploading + +1. A new secret key is generated with `crypto.getRandomValues` +2. The secret key is used to derive more keys via HKDF SHA-256 + - a series of encryption keys for the file, via [ECE](https://tools.ietf.org/html/rfc8188) (AES-GCM) + - an encryption key for the file metadata (AES-GCM) + - a signing key for request authentication (HMAC SHA-256) +3. The file and metadata are encrypted with their corresponding keys +4. The encrypted data and signing key are uploaded to the server +5. An owner token and the share url are returned by the server and stored in local storage +6. The secret key is appended to the share url as a [#fragment](https://en.wikipedia.org/wiki/Fragment_identifier) and presented to the UI + +### Downloading + +1. The browser loads the share url page, which includes an authentication nonce +2. The browser imports the secret key from the url fragment +3. The same 3 keys as above are derived +4. The browser signs the nonce with its signing key and requests the metadata +5. The encrypted metadata is decrypted and presented on the page +6. The browser makes another authenticated request to download the encrypted file +7. The browser downloads and decrypts the file +8. The file prompts the save dialog or automatically saves depending on the browser settings + +### Passwords + +A password may optionally be set to authenticate the download request. When a password is set the following steps occur. + +#### Sender + +1. The original signing key derived from the secret key is discarded +2. A new signing key is generated via PBKDF2 from the user entered password and the full share url (including secret key fragment) +3. The new key is sent to the server, authenticated by the owner token +4. The server stores the new key and marks the record as needing a password + +#### Downloader + +1. The browser loads the share url page, which includes an authentication nonce and indicator that the file requires a password +2. The user is prompted for the password and the signing key is derived +3. The browser requests the metadata using the key to sign the nonce +4. If the password was correct the metadata is returned, otherwise a 401 diff --git a/docs/experiments.md b/docs/experiments.md new file mode 100644 index 00000000..f627204b --- /dev/null +++ b/docs/experiments.md @@ -0,0 +1,84 @@ +# A/B experiment testing + +We're using Google Analytics Experiments for A/B testing. + +## Creating an experiment + +Navigate to the Behavior > Experiments section of Google Analytics and click the "Create experiment" button. + +The "Objective for this experiment" is the most complicated part. See the "Promo click (Goal ID 4 / Goal Set 1)" for an example. + +In step 2 add as many variants as you plan to test. The urls are not important since we aren't using their js library to choose the variants. The name will show up in the report so choose good ones. "Original page" becomes variant 0 and each variant increments by one. We'll use the numbers in our `app/experiments.js` code. + +Step 3 contains some script that we'll ignore. The important thing here is the **Experiment ID**. This is the value we need to name our experiment in `app/experiments.js`. Save the changes so far and wait until the code containing the experiment has been deployed to production **before** starting the experiment. + +## Experiment code + +Code for experiments live in [app/experiments.js](../app/experiments.js). There's an `experiments` object that contains the logic for deciding whether an experiment should run, which variant to use, and what to do. Each object needs to have these functions: + +### `eligible` function + +This function returns a boolean of whether this experiment should be active for this session. Any data available to the page can be used determine the result. + +### `variant` function + +This function returns which experimental group this session is placed in. The variant values need to match the values set up in Google Analytics, usually 0 thru N-1. This value is usually picked at random based on what percentage of each variant is desired. + +### `run` function + +This function gets the `variant` value chosen by the variant function and the `state` and `emitter` objects from the app. This function can do anything needed to change the app based on the experiment. A common pattern is to set or change a value on `state` that will be picked up by other parts of the app, like ui templates, to change how it looks or behaves. + +### Example + +Here's a full example of the experiment object: + +```js +const experiments = { + S9wqVl2SQ4ab2yZtqDI3Dw: { // The Experiment ID from Google Analytics + id: 'S9wqVl2SQ4ab2yZtqDI3Dw', + run: function(variant, state, emitter) { + switch (variant) { + case 1: + state.promo = 'blue'; + break; + case 2: + state.promo = 'pink'; + break; + default: + state.promo = 'grey'; + } + emitter.emit('render'); + }, + eligible: function() { + return ( + !/firefox|fxios/i.test(navigator.userAgent) && + document.querySelector('html').lang === 'en-US' + ); + }, + variant: function(state) { + const n = this.luckyNumber(state); + if (n < 0.33) { + return 0; + } + return n < 0.66 ? 1 : 2; + }, + luckyNumber: function(state) { + return luckyNumber( + `${this.id}:${state.storage.get('testpilot_ga__cid')}` + ); + } + } +}; +``` + +## Reporting results + +All metrics pings will include the variant and experiment id, but it's usually important to trigger a specific event to be counted as the experiment goal (the "Objective for this experiment" part from setup). Use an 'experiment' event to do this. For example: + +```js +emit('experiment', { cd3: 'promo' }); +``` + +where `emit` is the app emitter function passed to the [route handler](https://github.com/choojs/choo#approuteroutename-handlerstate-emit) + +The second argument can be an object with any additional parameters. It usually includes a custom dimension that we chose to filter on while creating the experiment in Google Analytics. \ No newline at end of file diff --git a/docs/faq.md b/docs/faq.md index 7809e48f..657042de 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,12 +1,12 @@ -## How big of a file can I transfer with Firefox Send? +## How big of a file can I transfer with Send? -There is a 2GB file size limit built in to Send, however, in practice you may -be unable to send files that large. Send encrypts and decrypts the files in -the browser which is great for security but will tax your system resources. In -particular you can expect to see your memory usage go up by at least the size -of the file when the transfer is processing. You can see [the results of some -testing](https://github.com/mozilla/send/issues/170#issuecomment-314107793). -For the most reliable operation on common computers, it’s probably best to stay +There is a 2GB file size limit built in to Send, but this may be changed by the +hoster. Send encrypts and decrypts the files in the browser which is great for +security but will tax your system resources. In particular you can expect to +see your memory usage go up by at least the size of the file when the transfer +is processing. You can see [the results of some +testing](https://github.com/mozilla/send/issues/170#issuecomment-314107793). For +the most reliable operation on common computers, it’s probably best to stay under a few hundred megabytes. ## Why is my browser not supported? @@ -17,26 +17,25 @@ Many browsers support this standard and should work fine, but some have not implemented it yet (mobile browsers lag behind on this, in particular). -## Why does Firefox Send require JavaScript? +## Why does Send require JavaScript? -Firefox Send uses JavaScript to: +Send uses JavaScript to: - Encrypt and decrypt files locally on the client instead of the server. - Render the user interface. -- Manage translations on the website into [various different languages](https://github.com/mozilla/send#localization). +- Manage translations on the website into [various different languages](https://github.com/timvisee/send#localization). - Collect data to help us improve Send in accordance with our [Terms & Privacy](https://send.firefox.com/legal). -Since Send is an open source project, you can see all of the cool ways we use JavaScript by [examining our code](https://github.com/mozilla/send/). +Since Send is an open source project, you can see all of the cool ways we use JavaScript by [examining our code](https://github.com/timvisee/send/). ## How long are files available for? Files are available to be downloaded for 24 hours, after which they are removed -from the server. They are also removed immediately after a download completes. +from the server. They are also removed immediately once the download limit is reached. ## Can a file be downloaded more than once? -Not currently, but we're considering multiple download support in a future -release. +Yes, once a file is submitted to Send you can select the download limit. *Disclaimer: Send is an experiment and under active development. The answers diff --git a/docs/localization.md b/docs/localization.md new file mode 100644 index 00000000..1cd92d41 --- /dev/null +++ b/docs/localization.md @@ -0,0 +1,29 @@ +# Localization + +Send is localized in over 50 languages. We use the [fluent](http://projectfluent.org/) library and store our translations in [FTL](http://projectfluent.org/fluent/guide/) files in `public/locales/`. `en-US` is our base language. + +## Process + +Strings are added or removed from [public/locales/en-US/send.ftl] as needed. Strings **MUST NOT** be *changed* after they've been commited and pushed to master. Changing a string requires creating a new ID with a new name (preferably descriptive instead of incremented) and deletion of the obsolete ID. It's often useful to add a comment above the string with info about how and where the string is used. + +Once new strings are commited to master they are available for translators in Pontoon. All languages other than `en-US` should be edited via Pontoon. Translations get automatically commited to the github master branch. + +### Activation + +The development environment includes all locales in `public/locales` via the `L10N_DEV` environment variable. Production uses `package.json` as the list of locales to use. Once a locale has enough string coverage it should be added to `package.json`. + +## Code + +In `app/` we use the `state.translate()` function to translate strings to the best matching language base on the user's `Accept-Language` header. It's a wrapper around fluent's [FluentBundle.format](http://projectfluent.org/fluent.js/fluent/FluentBundle.html). It works the same for both server and client side rendering. + +### Examples + +```js +// simple string +const finishedString = state.translate('downloadFinish') +// with parameters +const progressString = state.translate('downloadingPageProgress', { + filename: state.fileInfo.name, + size: bytes(state.fileInfo.size) +}) +``` diff --git a/docs/metrics.md b/docs/metrics.md deleted file mode 100644 index 9006b347..00000000 --- a/docs/metrics.md +++ /dev/null @@ -1,144 +0,0 @@ -# Send Metrics -The metrics collection and analysis plan for Send, a forthcoming Test Pilot experiment. - -## Analysis -Data collected by Send will be used to answer the following high-level questions: - -- Do users send files? - - How often? How many? - - What is the retention? - - What is the distribution of senders? -- How do recipients interact with promotional UI elements? - - Are file recipients converted to file senders? - - Are non-Firefox users converted to Firefox users? -- Where does it go wrong? - - How often are there errors in uploading or downloading files? - - What types of errors to users commonly see? - - At what point do errors affect retention? - -## Collection -Data will be collected with Google Analytics and follow [Test Pilot standards](https://github.com/mozilla/testpilot/blob/master/docs/experiments/ga.md) for reporting. - -### Custom Metrics -- `cm1` - the size of the file, in bytes. -- `cm2` - the amount of time it took to complete the file transfer, in milliseconds. Only include if the file completed transferring (ref: `cd2`). -- `cm3` - the rate of the file transfer, in bytes per second. This is computed by dividing `cm1` by `cm2`, not by monitoring transfer speeds. Only include if the file completed transferring (ref: `cd2`). -- `cm4` - the amount of time until the file will expire, in milliseconds. -- `cm5` - the number of files the user has ever uploaded. -- `cm6` - the number of unexpired files the user has uploaded. -- `cm7` - the number of files the user has ever downloaded. - -### Custom Dimensions -- `cd1` - the method by which the user initiated an upload. One of `drag`, `click`. -- `cd2` - the reason that the file transfer stopped. One of `completed`, `errored`, `cancelled`. -- `cd3` - the destination of a link click. One of `experiment-page`, `download-firefox`, `twitter`, `github`, `cookies`, `terms`, `privacy`, `about`, `legal`, `mozilla`. -- `cd4` - the location from which the user copied the URL to an upload file. One of `success-screen`, `upload-list`. -- `cd5` - the referring location. One of `completed-download`, `errored-download`, `cancelled-download`, `completed-upload`, `errored-upload`, `cancelled-upload`, `testpilot`, `external`. -- `cd6` - identifying information about an error. Exclude if there is no error involved. **TODO:** enumerate a list of possibilities. - -### Events - -_NB:_ due to how files are being tracked, there are no events indicating file expiry. This carries some risk: most notably, we can only derive expiration rates by looking at download rates, which is prone to skew if there are problems in data collection. - -#### `upload-started` -Triggered whenever a user begins uploading a file. Includes: - -- `ec` - `sender` -- `ea` - `upload-started` -- `cm1` -- `cm5` -- `cm6` -- `cm7` -- `cd1` -- `cd5` - -#### `upload-stopped` -Triggered whenever a user stops uploading a file. Includes: - -- `ec` - `sender` -- `ea` - `upload-stopped` -- `cm1` -- `cm2` -- `cm3` -- `cm5` -- `cm6` -- `cm7` -- `cd1` -- `cd2` -- `cd6` - -#### `password-added` -Triggered whenever a password is added to a file. Includes: - -- `cm1` -- `cm5` -- `cm6` -- `cm7` - -#### `download-started` -Triggered whenever a user begins downloading a file. Includes: - -- `ec` - `recipient` -- `ea` - `download-started` -- `cm1` -- `cm4` -- `cm5` -- `cm6` -- `cm7` - -#### `download-stopped` -Triggered whenever a user stops downloading a file. - -- `ec` - `recipient` -- `ea` - `download-stopped` -- `cm1` -- `cm2` (if possible and applicable) -- `cm3` (if possible and applicable) -- `cm5` -- `cm6` -- `cm7` -- `cd2` -- `cd6` - -#### `exited` -Fired whenever a user follows a link external to Send. - -- `ec` - `recipient`, `sender`, or `other`, as applicable. -- `ea` - `exited` -- `cd3` - -#### `upload-deleted` -Fired whenever a user deletes a file they’ve uploaded. - -- `ec` - `sender` -- `ea` - `upload-deleted` -- `cm1` -- `cm2` -- `cm3` -- `cm4` -- `cm5` -- `cm6` -- `cm7` -- `cd1` -- `cd4` - -#### `copied` -Fired whenever a user copies the URL of an upload file. - -- `ec` - `sender` -- `ea` - `copied` -- `cd4` - -#### `restarted` -Fired whenever the user interrupts any part of funnel to return to the start of it (e.g. with a “send another file” or “send your own files” link). - -- `ec` - `recipient`, `sender`, or `other`, as applicable. -- `ea` - `restarted` -- `cd2` - -#### `unsupported` -Fired whenever a user is presented a message saying that their browser is unsupported due to missing crypto APIs. - -- `ec` - `recipient` or `sender`, as applicable. -- `ea` - `unsupported` -- `cd6` diff --git a/docs/notes/streams.md b/docs/notes/streams.md new file mode 100644 index 00000000..ec0c0b89 --- /dev/null +++ b/docs/notes/streams.md @@ -0,0 +1,34 @@ +# Web Streams + +- API + - https://developer.mozilla.org/en-US/docs/Web/API/Streams_API +- Reference Implementation + - https://github.com/whatwg/streams/tree/master/reference-implementation +- Examples + - https://github.com/mdn/dom-examples/tree/master/streams +- Polyfill + - https://github.com/MattiasBuelens/web-streams-polyfill + +# Encrypted Content Encoding + +- Spec + - https://trac.tools.ietf.org/html/rfc8188 +- node.js implementation + - https://github.com/web-push-libs/encrypted-content-encoding/tree/master/nodejs + +# Other APIs + +- Blobs + - https://developer.mozilla.org/en-US/docs/Web/API/Blob +- ArrayBuffers, etc + - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer + - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array +- FileReader + - https://developer.mozilla.org/en-US/docs/Web/API/FileReader + +# Other + +- node.js Buffer browser library + - https://github.com/feross/buffer +- StreamSaver + - https://github.com/jimmywarting/StreamSaver.js diff --git a/docs/takedowns.md b/docs/takedowns.md new file mode 100644 index 00000000..da09c2ee --- /dev/null +++ b/docs/takedowns.md @@ -0,0 +1,19 @@ +## Take-down process + +In cases of a DMCA notice, or other abuse yet to be determined, a file has to be removed from the service. + +Files can be delisted and made inaccessible by removing their record from Redis. + +Send share links contain the `id` of the file, for example `https://send.firefox.com/download/3d9d2bb9a1` + +From a host with access to the Redis server run a `DEL` command with the file id. + +For example: + +```sh +redis-cli DEL 3d9d2bb9a1 +``` + +Other redis-cli parameters like `-h` may also be required. See [redis-cli docs](https://redis.io/topics/rediscli) for more info. + +The encrypted file resides on S3 as the same `id` under the bucket that the app was configured with as `S3_BUCKET`. The file can be managed if it has not already expired with the [AWS cli](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) or AWS web console. \ No newline at end of file diff --git a/ios/generate-bundle.js b/ios/generate-bundle.js new file mode 100644 index 00000000..70f60c3d --- /dev/null +++ b/ios/generate-bundle.js @@ -0,0 +1,21 @@ +const child_process = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +child_process.execSync('npm run build'); + +const prefix = path.join('..', 'dist'); +const json_string = fs.readFileSync(path.join(prefix, 'manifest.json')); +const manifest = JSON.parse(json_string); + +const ios_filename = manifest['ios.js']; +fs.writeFileSync( + 'send-ios/assets/ios.js', + fs.readFileSync(`${prefix}${ios_filename}`) +); + +const vendor_filename = manifest['vendor.js']; +fs.writeFileSync( + 'send-ios/assets/vendor.js', + fs.readFileSync(`${prefix}${vendor_filename}`) +); diff --git a/ios/ios.js b/ios/ios.js new file mode 100644 index 00000000..23b7c4a3 --- /dev/null +++ b/ios/ios.js @@ -0,0 +1,158 @@ +/* global window, document, fetch */ + +const MAXFILESIZE = 1024 * 1024 * 1024 * 2; + +const EventEmitter = require('events'); +const emitter = new EventEmitter(); + +function dom(tagName, attributes, children = []) { + const node = document.createElement(tagName); + for (const name in attributes) { + if (name.indexOf('on') === 0) { + node[name] = attributes[name]; + } else if (name === 'htmlFor') { + node.htmlFor = attributes.htmlFor; + } else if (name === 'className') { + node.className = attributes.className; + } else { + node.setAttribute(name, attributes[name]); + } + } + if (!(children instanceof Array)) { + children = [children]; + } + for (let child of children) { + if (typeof child === 'string') { + child = document.createTextNode(child); + } + node.appendChild(child); + } + return node; +} + +function uploadComplete(file) { + document.body.innerHTML = ''; + const input = dom('input', { id: 'url', value: file.url }); + const copy = dom( + 'button', + { + id: 'copy-button', + className: 'button', + onclick: () => { + window.webkit.messageHandlers['copy'].postMessage(input.value); + copy.textContent = 'Copied!'; + setTimeout(function() { + copy.textContent = 'Copy to clipboard'; + }, 2000); + } + }, + 'Copy to clipboard' + ); + const node = dom( + 'div', + { id: 'striped' }, + dom('div', { id: 'white' }, [ + input, + copy, + dom( + 'button', + { id: 'send-another', className: 'button', onclick: render }, + 'Send another file' + ) + ]) + ); + document.body.appendChild(node); +} + +const state = { + storage: { + files: [], + remove: function(fileId) { + console.log('REMOVE FILEID', fileId); + }, + writeFile: function(file) { + console.log('WRITEFILE', file); + }, + addFile: uploadComplete, + totalUploads: 0 + }, + transfer: null, + uploading: false, + settingPassword: false, + passwordSetError: null, + route: '/' +}; + +function upload(event) { + console.log('UPLOAD'); + event.preventDefault(); + const target = event.target; + const file = target.files[0]; + if (file.size === 0) { + return; + } + if (file.size > MAXFILESIZE) { + console.log('file too big (no bigger than ' + MAXFILESIZE + ')'); + return; + } + + emitter.emit('upload', { file: file, type: 'click' }); +} + +function render() { + document.body.innerHTML = ''; + const striped = dom( + 'div', + { id: 'striped' }, + dom('div', { id: 'white' }, [ + dom('label', { id: 'label', htmlFor: 'input' }, 'Choose file'), + dom('input', { + id: 'input', + type: 'file', + name: 'input', + onchange: upload + }) + ]) + ); + document.body.appendChild(striped); +} + +emitter.on('render', function() { + document.body.innerHTML = ''; + const percent = + (state.transfer.progress[0] / state.transfer.progress[1]) * 100; + const node = dom( + 'div', + { style: 'background-color: white; width: 100%' }, + dom('span', { + style: `display: inline-block; width: ${percent}%; background-color: blue` + }) + ); + document.body.appendChild(node); +}); + +emitter.on('pushState', function(path) { + console.log('pushState ' + path + ' ' + JSON.stringify(state)); +}); + +const controller = require('../app/controller').default; +try { + controller(state, emitter); +} catch (e) { + console.error('error' + e); + console.error(e); +} + +function sendBase64EncodedFromSwift(encoded) { + fetch(encoded) + .then(res => res.blob()) + .then(blob => { + emitter.emit('upload', { file: blob, type: 'share' }); + }); +} + +window.sendBase64EncodedFromSwift = sendBase64EncodedFromSwift; + +render(); + +window.webkit.messageHandlers['loaded'].postMessage(''); diff --git a/ios/send-ios-action-extension/ActionViewController.swift b/ios/send-ios-action-extension/ActionViewController.swift new file mode 100644 index 00000000..9b202adb --- /dev/null +++ b/ios/send-ios-action-extension/ActionViewController.swift @@ -0,0 +1,77 @@ +// +// ActionViewController.swift +// send-ios-action-extension +// +// Created by Donovan Preston on 7/26/18. +// + +import UIKit +import WebKit +import MobileCoreServices + +var typesToLoad = [("com.adobe.pdf", "application/pdf"), ("public.png", "image/png"), + ("public.jpeg", "image/jpeg"), ("public.jpeg-2000", "image/jp2"), + ("com.compuserve.gif", "image/gif"), ("com.microsoft.bmp", "image/bmp"), + ("public.plain-text", "text/plain")] + +class ActionViewController: UIViewController, WKScriptMessageHandler { + + @IBOutlet var webView: WKWebView! + var typeToSend: String? + var dataToSend: Data? + + override func viewDidLoad() { + super.viewDidLoad() + self.webView.frame = self.view.bounds + self.webView?.configuration.userContentController.add(self, name: "loaded") + self.webView?.configuration.userContentController.add(self, name: "copy") + + if let url = Bundle.main.url( + forResource: "index", + withExtension: "html", + subdirectory: "assets") { + self.webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) + } + // Get the item[s] we're handling from the extension context. + + for item in self.extensionContext!.inputItems as! [NSExtensionItem] { + for provider in item.attachments! as! [NSItemProvider] { + for (type, mimeType) in typesToLoad { + if provider.hasItemConformingToTypeIdentifier(type) { + provider.loadDataRepresentation(forTypeIdentifier: type, completionHandler: { (data, error) in + OperationQueue.main.addOperation { + self.typeToSend = mimeType + self.dataToSend = data + } + }) + return + } + } + } + } + } + + public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + print("Message received: \(message.name) with body: \(message.body)") + if (message.name == "loaded") { + let stringToSend = "window.sendBase64EncodedFromSwift('data:\(self.typeToSend ?? "application/octet-stream");base64,\(self.dataToSend?.base64EncodedString() ?? "")')"; + self.webView.evaluateJavaScript(stringToSend) { (object: Any?, error: Error?) -> Void in + print("completed") + } + } else if (message.name == "copy") { + UIPasteboard.general.string = "\(message.body)" + } + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @IBAction func done() { + // Return any edited content to the host app. + // This template doesn't do anything, so we just echo the passed in items. + self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems, completionHandler: nil) + } + +} diff --git a/ios/send-ios-action-extension/Base.lproj/MainInterface.storyboard b/ios/send-ios-action-extension/Base.lproj/MainInterface.storyboard new file mode 100644 index 00000000..5939032d --- /dev/null +++ b/ios/send-ios-action-extension/Base.lproj/MainInterface.storyboard @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/send-ios-action-extension/Info.plist b/ios/send-ios-action-extension/Info.plist new file mode 100644 index 00000000..10caa73e --- /dev/null +++ b/ios/send-ios-action-extension/Info.plist @@ -0,0 +1,53 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + send-ios-action-extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + SUBQUERY ( + extensionItems, + $extensionItem, + SUBQUERY ( + $extensionItem.attachments, + $attachment, + ( + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.bmp" + ) + ).@count == 1 + ).@count == 1 + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.ui-services + + + diff --git a/ios/send-ios.xcodeproj/project.pbxproj b/ios/send-ios.xcodeproj/project.pbxproj new file mode 100644 index 00000000..83f460b2 --- /dev/null +++ b/ios/send-ios.xcodeproj/project.pbxproj @@ -0,0 +1,526 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + E34149C621017A3A00930775 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34149C521017A3A00930775 /* AppDelegate.swift */; }; + E34149C821017A3A00930775 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34149C721017A3A00930775 /* ViewController.swift */; }; + E34149CB21017A3A00930775 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E34149C921017A3A00930775 /* Main.storyboard */; }; + E34149CD21017A3D00930775 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E34149CC21017A3D00930775 /* Assets.xcassets */; }; + E34149D021017A3D00930775 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E34149CE21017A3D00930775 /* LaunchScreen.storyboard */; }; + E355478521028193009D206E /* help.html in Resources */ = {isa = PBXBuildFile; fileRef = E355478421028193009D206E /* help.html */; }; + E355478921092E22009D206E /* assets in Resources */ = {isa = PBXBuildFile; fileRef = E355478821092E22009D206E /* assets */; }; + E355478C210A534F009D206E /* ios.js in Resources */ = {isa = PBXBuildFile; fileRef = E355478B210A534F009D206E /* ios.js */; }; + E355478E210A5357009D206E /* generate-bundle.js in Resources */ = {isa = PBXBuildFile; fileRef = E355478D210A5357009D206E /* generate-bundle.js */; }; + E397A0B2210A641C00A978D4 /* ActionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E397A0B1210A641C00A978D4 /* ActionViewController.swift */; }; + E397A0B5210A641C00A978D4 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E397A0B3210A641C00A978D4 /* MainInterface.storyboard */; }; + E397A0B9210A641C00A978D4 /* send-ios-action-extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + E397A0BF210A6B5500A978D4 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = E397A0BE210A6B5500A978D4 /* assets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + E397A0B7210A641C00A978D4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E34149BA21017A3900930775 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E397A0AE210A641C00A978D4; + remoteInfo = "send-ios-action-extension"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + E397A0BD210A641C00A978D4 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + E397A0B9210A641C00A978D4 /* send-ios-action-extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + E34149C221017A3900930775 /* send-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "send-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E34149C521017A3A00930775 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E34149C721017A3A00930775 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + E34149CA21017A3A00930775 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E34149CC21017A3D00930775 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E34149CF21017A3D00930775 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + E34149D121017A3D00930775 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E355478421028193009D206E /* help.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = help.html; sourceTree = ""; }; + E355478821092E22009D206E /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = ""; }; + E355478B210A534F009D206E /* ios.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = ios.js; sourceTree = SOURCE_ROOT; }; + E355478D210A5357009D206E /* generate-bundle.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "generate-bundle.js"; sourceTree = SOURCE_ROOT; }; + E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "send-ios-action-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + E397A0B1210A641C00A978D4 /* ActionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionViewController.swift; sourceTree = ""; }; + E397A0B4210A641C00A978D4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + E397A0B6210A641C00A978D4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E397A0BE210A6B5500A978D4 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = "send-ios/assets"; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E34149BF21017A3900930775 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E397A0AC210A641C00A978D4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + E34149B921017A3900930775 = { + isa = PBXGroup; + children = ( + E34149C421017A3900930775 /* send-ios */, + E397A0B0210A641C00A978D4 /* send-ios-action-extension */, + E34149C321017A3900930775 /* Products */, + ); + sourceTree = ""; + }; + E34149C321017A3900930775 /* Products */ = { + isa = PBXGroup; + children = ( + E34149C221017A3900930775 /* send-ios.app */, + E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */, + ); + name = Products; + sourceTree = ""; + }; + E34149C421017A3900930775 /* send-ios */ = { + isa = PBXGroup; + children = ( + E355478D210A5357009D206E /* generate-bundle.js */, + E355478B210A534F009D206E /* ios.js */, + E34149C521017A3A00930775 /* AppDelegate.swift */, + E34149C721017A3A00930775 /* ViewController.swift */, + E34149C921017A3A00930775 /* Main.storyboard */, + E34149CC21017A3D00930775 /* Assets.xcassets */, + E34149CE21017A3D00930775 /* LaunchScreen.storyboard */, + E34149D121017A3D00930775 /* Info.plist */, + E355478421028193009D206E /* help.html */, + E355478821092E22009D206E /* assets */, + ); + path = "send-ios"; + sourceTree = ""; + }; + E397A0B0210A641C00A978D4 /* send-ios-action-extension */ = { + isa = PBXGroup; + children = ( + E397A0BE210A6B5500A978D4 /* assets */, + E397A0B1210A641C00A978D4 /* ActionViewController.swift */, + E397A0B3210A641C00A978D4 /* MainInterface.storyboard */, + E397A0B6210A641C00A978D4 /* Info.plist */, + ); + path = "send-ios-action-extension"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E34149C121017A3900930775 /* send-ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = E34149D421017A3D00930775 /* Build configuration list for PBXNativeTarget "send-ios" */; + buildPhases = ( + E355478A210A4C43009D206E /* ShellScript */, + E34149BE21017A3900930775 /* Sources */, + E34149BF21017A3900930775 /* Frameworks */, + E34149C021017A3900930775 /* Resources */, + E397A0BD210A641C00A978D4 /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + E397A0B8210A641C00A978D4 /* PBXTargetDependency */, + ); + name = "send-ios"; + productName = "send-ios"; + productReference = E34149C221017A3900930775 /* send-ios.app */; + productType = "com.apple.product-type.application"; + }; + E397A0AE210A641C00A978D4 /* send-ios-action-extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = E397A0BC210A641C00A978D4 /* Build configuration list for PBXNativeTarget "send-ios-action-extension" */; + buildPhases = ( + E397A0AB210A641C00A978D4 /* Sources */, + E397A0AC210A641C00A978D4 /* Frameworks */, + E397A0AD210A641C00A978D4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "send-ios-action-extension"; + productName = "send-ios-action-extension"; + productReference = E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E34149BA21017A3900930775 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = "Donovan Preston"; + TargetAttributes = { + E34149C121017A3900930775 = { + CreatedOnToolsVersion = 9.4.1; + }; + E397A0AE210A641C00A978D4 = { + CreatedOnToolsVersion = 9.4.1; + }; + }; + }; + buildConfigurationList = E34149BD21017A3900930775 /* Build configuration list for PBXProject "send-ios" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = E34149B921017A3900930775; + productRefGroup = E34149C321017A3900930775 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E34149C121017A3900930775 /* send-ios */, + E397A0AE210A641C00A978D4 /* send-ios-action-extension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + E34149C021017A3900930775 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E355478C210A534F009D206E /* ios.js in Resources */, + E355478921092E22009D206E /* assets in Resources */, + E355478E210A5357009D206E /* generate-bundle.js in Resources */, + E34149D021017A3D00930775 /* LaunchScreen.storyboard in Resources */, + E355478521028193009D206E /* help.html in Resources */, + E34149CD21017A3D00930775 /* Assets.xcassets in Resources */, + E34149CB21017A3A00930775 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E397A0AD210A641C00A978D4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E397A0B5210A641C00A978D4 /* MainInterface.storyboard in Resources */, + E397A0BF210A6B5500A978D4 /* assets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + E355478A210A4C43009D206E /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "node generate-bundle.js\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + E34149BE21017A3900930775 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E34149C821017A3A00930775 /* ViewController.swift in Sources */, + E34149C621017A3A00930775 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E397A0AB210A641C00A978D4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E397A0B2210A641C00A978D4 /* ActionViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + E397A0B8210A641C00A978D4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = E397A0AE210A641C00A978D4 /* send-ios-action-extension */; + targetProxy = E397A0B7210A641C00A978D4 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + E34149C921017A3A00930775 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E34149CA21017A3A00930775 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + E34149CE21017A3D00930775 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E34149CF21017A3D00930775 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + E397A0B3210A641C00A978D4 /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E397A0B4210A641C00A978D4 /* Base */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + E34149D221017A3D00930775 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + E34149D321017A3D00930775 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + E34149D521017A3D00930775 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + E34149D621017A3D00930775 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + E397A0BA210A641C00A978D4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios-action-extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios.send-ios-action-extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + E397A0BB210A641C00A978D4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios-action-extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios.send-ios-action-extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E34149BD21017A3900930775 /* Build configuration list for PBXProject "send-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E34149D221017A3D00930775 /* Debug */, + E34149D321017A3D00930775 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E34149D421017A3D00930775 /* Build configuration list for PBXNativeTarget "send-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E34149D521017A3D00930775 /* Debug */, + E34149D621017A3D00930775 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E397A0BC210A641C00A978D4 /* Build configuration list for PBXNativeTarget "send-ios-action-extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E397A0BA210A641C00A978D4 /* Debug */, + E397A0BB210A641C00A978D4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E34149BA21017A3900930775 /* Project object */; +} diff --git a/ios/send-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/send-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..883bc6f4 --- /dev/null +++ b/ios/send-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/send-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/send-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/ios/send-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/donovan.xcuserdatad/UserInterfaceState.xcuserstate b/ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/donovan.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 00000000..ccfe2abd Binary files /dev/null and b/ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/donovan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..a53fd357 --- /dev/null +++ b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..566d89e1 --- /dev/null +++ b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SchemeUserState + + send-ios-action-extension.xcscheme + + orderHint + 1 + + send-ios.xcscheme + + orderHint + 0 + + + + diff --git a/ios/send-ios/AppDelegate.swift b/ios/send-ios/AppDelegate.swift new file mode 100644 index 00000000..bfb62d7a --- /dev/null +++ b/ios/send-ios/AppDelegate.swift @@ -0,0 +1,45 @@ +// +// AppDelegate.swift +// send-ios +// +// Created by Donovan Preston on 7/19/18. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/ios/send-ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/send-ios/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d8db8d65 --- /dev/null +++ b/ios/send-ios/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/send-ios/Assets.xcassets/Contents.json b/ios/send-ios/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/ios/send-ios/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/send-ios/Base.lproj/LaunchScreen.storyboard b/ios/send-ios/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f83f6fd5 --- /dev/null +++ b/ios/send-ios/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/send-ios/Base.lproj/Main.storyboard b/ios/send-ios/Base.lproj/Main.storyboard new file mode 100644 index 00000000..09ae84fd --- /dev/null +++ b/ios/send-ios/Base.lproj/Main.storyboard @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/send-ios/Info.plist b/ios/send-ios/Info.plist new file mode 100644 index 00000000..16be3b68 --- /dev/null +++ b/ios/send-ios/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios/send-ios/ViewController.swift b/ios/send-ios/ViewController.swift new file mode 100644 index 00000000..289f07c4 --- /dev/null +++ b/ios/send-ios/ViewController.swift @@ -0,0 +1,39 @@ +// +// ViewController.swift +// send-ios +// +// Created by Donovan Preston on 7/19/18. +// + +import UIKit +import WebKit + +class ViewController: UIViewController, WKScriptMessageHandler { + @IBOutlet var webView: WKWebView! + + override func viewDidLoad() { + super.viewDidLoad() + self.webView.frame = self.view.bounds + self.webView?.configuration.userContentController.add(self, name: "loaded") + self.webView?.configuration.userContentController.add(self, name: "copy") + if let url = Bundle.main.url( + forResource: "index", + withExtension: "html", + subdirectory: "assets") { + webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) + } + } + + public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + print("Message received: \(message.name) with body: \(message.body)") + UIPasteboard.general.string = "\(message.body)" + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/ios/send-ios/assets/background_1.jpg b/ios/send-ios/assets/background_1.jpg new file mode 100644 index 00000000..c92d3fb1 Binary files /dev/null and b/ios/send-ios/assets/background_1.jpg differ diff --git a/ios/send-ios/assets/index.css b/ios/send-ios/assets/index.css new file mode 100644 index 00000000..3dd18d2d --- /dev/null +++ b/ios/send-ios/assets/index.css @@ -0,0 +1,84 @@ +body { + background: url('background_1.jpg'); + display: flex; + flex-direction: row; + flex: auto; + justify-content: center; + align-items: center; + padding: 0 20px; + box-sizing: border-box; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +#striped { + background-image: repeating-linear-gradient( + 45deg, + white, + white 5px, + #ea000e 5px, + #ea000e 25px, + white 25px, + white 30px, + #0083ff 30px, + #0083ff 50px + ); + height: 350px; + width: 480px; +} + +#white { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + height: 100%; + background-color: white; + margin: 0 10px; + padding: 1px 10px 0 10px; +} + +#label { + background: #0297f8; + border: 1px solid #0297f8; + color: white; + font-size: 24px; + font-weight: 500; + height: 60px; + width: 200px; + display: flex; + justify-content: center; + align-items: center; +} + +#input { + display: none; +} + +#url { + flex: 1; + width: 100%; + height: 32px; + font-size: 24px; + margin-top: 1em; +} + +.button { + flex: 1; + display: block; + background: #0297f8; + border: 1px solid #0297f8; + color: white; + font-size: 24px; + font-weight: 500; + width: 95%; + height: 32px; + margin-top: 1em; +} + +#send-another { + margin-bottom: 1em; +} diff --git a/ios/send-ios/assets/index.html b/ios/send-ios/assets/index.html new file mode 100644 index 00000000..4579be02 --- /dev/null +++ b/ios/send-ios/assets/index.html @@ -0,0 +1,17 @@ + + + + + Send + + + + + + + + + + diff --git a/ios/send-ios/help.html b/ios/send-ios/help.html new file mode 100644 index 00000000..afbd39d5 --- /dev/null +++ b/ios/send-ios/help.html @@ -0,0 +1,5 @@ + + + HELLO WORLD + + diff --git a/package-lock.json b/package-lock.json index 59ca7ad6..2af3dd62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12458 +1,25230 @@ { - "name": "firefox-send", - "version": "2.1.2", - "lockfileVersion": 1, + "name": "send", + "version": "3.4.27", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@f/has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@f/has/-/has-1.0.1.tgz", - "integrity": "sha1-t08TK/OqpdwECe3+jucjN9bnP74=", - "dev": true - }, - "@f/is-svg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@f/is-svg/-/is-svg-1.0.0.tgz", - "integrity": "sha1-Q0fYy1VBkl+F9WMXSMwx3GRQ70Y=", - "dev": true, - "requires": { - "@f/has": "1.0.1", - "@f/svg-elements": "1.0.1" - } - }, - "@f/svg-elements": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@f/svg-elements/-/svg-elements-1.0.1.tgz", - "integrity": "sha1-qNMKizODbJiISNKOs8RgXZI1gd0=", - "dev": true - }, - "@f/svg-namespace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@f/svg-namespace/-/svg-namespace-1.0.1.tgz", - "integrity": "sha1-9vGlzl05caSt6RoR0i1MRZrNN18=", - "dev": true - }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", - "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": "2.3.8" - } - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, + "packages": { + "": { + "name": "send", + "version": "3.4.27", + "license": "MPL-2.0", "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" + "@dannycoates/express-ws": "^5.0.3", + "@fluent/bundle": "^0.17.1", + "@fluent/langneg": "^0.6.2", + "@google-cloud/storage": "^6.2.3", + "@sentry/node": "^7.7.0", + "aws-sdk": "^2.1109.0", + "body-parser": "^1.20.0", + "choo": "^7.0.0", + "cldr-core": "^35.1.0", + "configstore": "github:dannycoates/configstore#master", + "convict": "^6.2.4", + "convict-format-with-validator": "^6.2.0", + "double-ended-queue": "^2.1.0-0", + "express": "^4.17.3", + "helmet": "^3.23.3", + "mozlog": "^3.0.1", + "node-fetch": "^2.6.7", + "redis": "^3.1.1", + "redis-mock": "^0.47.0", + "selenium-standalone": "^6.24.0", + "ua-parser-js": "^0.7.31" }, + "devDependencies": { + "@babel/core": "^7.17.9", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/preset-env": "^7.16.11", + "@dannycoates/webcrypto-liner": "^0.1.37", + "@fullhuman/postcss-purgecss": "^4.1.3", + "@mattiasbuelens/web-streams-polyfill": "0.2.1", + "@sentry/browser": "^5.30.0", + "asmcrypto.js": "^0.22.0", + "babel-loader": "^8.2.4", + "babel-plugin-istanbul": "^5.2.0", + "base64-js": "^1.5.1", + "content-disposition": "^0.5.4", + "copy-webpack-plugin": "^6.4.0", + "core-js": "^3.21.1", + "crc": "^3.8.0", + "cross-env": "^6.0.3", + "css-loader": "^5.2.7", + "css-mqpacker": "^7.0.0", + "cssnano": "^5.1.12", + "eslint": "^6.6.0", + "eslint-config-prettier": "^6.15.0", + "eslint-plugin-mocha": "^6.2.1", + "eslint-plugin-node": "^10.0.0", + "eslint-plugin-security": "^1.4.0", + "expose-loader": "^0.7.5", + "extract-loader": "^3.2.0", + "extract-text-webpack-plugin": "^4.0.0-beta.0", + "fast-text-encoding": "^1.0.3", + "file-loader": "^6.2.0", + "git-rev-sync": "^3.0.2", + "html-loader": "^0.5.5", + "http_ece": "^1.1.0", + "husky": "^3.0.9", + "intl-pluralrules": "^1.3.1", + "lint-staged": "^9.4.2", + "mocha": "^10.1.0", + "morgan": "^1.9.1", + "nanobus": "^4.5.0", + "nanohtml": "^1.9.0", + "nanotiming": "^7.3.1", + "npm-run-all": "^4.1.5", + "nyc": "^14.1.1", + "postcss": "^8.4.14", + "postcss-loader": "^4.2.0", + "postcss-preset-env": "^7.7.2", + "prettier": "^1.19.1", + "proxyquire": "^2.1.3", + "puppeteer": "^2.0.0", + "raw-loader": "^3.1.0", + "rimraf": "^3.0.0", + "script-loader": "^0.7.2", + "sinon": "^7.5.0", + "string-hash": "^1.1.3", + "stylelint": "^14.9.1", + "stylelint-config-standard": "^26.0.0", + "stylelint-no-unsupported-browser-features": "^5.0.3", + "svgo": "^2.8.0", + "svgo-loader": "^3.0.1", + "tailwindcss": "^2", + "val-loader": "^2.1.2", + "webpack": "4.38.0", + "webpack-cli": "^3.3.12", + "webpack-dev-middleware": "^3.7.3", + "webpack-dev-server": "^3.11.3", + "webpack-manifest-plugin": "^2.2.0", + "webpack-unassert-loader": "^1.2.0" + }, + "engines": { + "node": "^16.13.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "ajv": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", - "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "alphanum-sort": { + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", + "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", + "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", + "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", + "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - }, + "license": "CC0-1.0", "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.1.0" - } + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "dev": true, + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "dev": true, + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@dannycoates/elliptic": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@dannycoates/elliptic/-/elliptic-6.4.2.tgz", + "integrity": "sha512-2G4qWMB2SRBk4H75d+BFBbz2b1cseIYCI8G7duGxtxdnjGxhewpripDsVr1lCagmijyYX4zDyfKTNoId5GGyow==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + } + }, + "node_modules/@dannycoates/express-ws": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@dannycoates/express-ws/-/express-ws-5.0.3.tgz", + "integrity": "sha512-EvHGP+NU2GVeQQDzlJRclN86UxxGJP5er4v8ojVn55cu7zhLLXZ5/QQJu0RcIzh4WHMjgYEE7/bKCohVK946og==", + "license": "BSD-2-Clause", + "dependencies": { + "esm": "^3.0.84", + "ws": "^7.1.1" + }, + "engines": { + "node": ">=4.5.0" + }, + "peerDependencies": { + "express": "^4.0.0 || ^5.0.0-alpha.1" + } + }, + "node_modules/@dannycoates/webcrypto-liner": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/@dannycoates/webcrypto-liner/-/webcrypto-liner-0.1.37.tgz", + "integrity": "sha512-EM29TDkn7GJaa/oOfLeS1vrAxEkyM+WfUsmHTz7OyrxvMZNqz2SiYdZkXBIvg+QCnKTfXc2x//ORAilesugQlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dannycoates/elliptic": "^6.4.2", + "asmcrypto.js": "^0.22.0", + "webcrypto-core": "github:dannycoates/webcrypto-core" + } + }, + "node_modules/@fluent/bundle": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@fluent/bundle/-/bundle-0.17.1.tgz", + "integrity": "sha512-CRFNT9QcSFAeFDneTF59eyv3JXFGhIIN4boUO2y22YmsuuKLyDk+N1I/NQUYz9Ab63e6V7T6vItoZIG/2oOOuw==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@fluent/langneg": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@fluent/langneg/-/langneg-0.6.2.tgz", + "integrity": "sha512-YF4gZ4sLYRQfctpUR2uhb5UyPUYY5n/bi3OaED/Q4awKjPjlaF8tInO3uja7pnLQcmLTURkZL7L9zxv2Z5NDwg==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@fullhuman/postcss-purgecss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-4.1.3.tgz", + "integrity": "sha512-jqcsyfvq09VOsMXxJMPLRF6Fhg/NNltzWKnC9qtzva+QKTxerCO4esG6je7hbnmkpZtaDyPTwMBj9bzfWorsrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "purgecss": "^4.1.3" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@google-cloud/paginator": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz", + "integrity": "sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==", + "license": "Apache-2.0", + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz", + "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz", + "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/@google-cloud/storage": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.12.0.tgz", + "integrity": "sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==", + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/paginator": "^3.0.7", + "@google-cloud/projectify": "^3.0.0", + "@google-cloud/promisify": "^3.0.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "compressible": "^2.0.12", + "duplexify": "^4.0.0", + "ent": "^2.2.0", + "extend": "^3.0.2", + "fast-xml-parser": "^4.2.2", + "gaxios": "^5.0.0", + "google-auth-library": "^8.0.1", + "mime": "^3.0.0", + "mime-types": "^2.0.8", + "p-limit": "^3.0.1", + "retry-request": "^5.0.0", + "teeny-request": "^8.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mattiasbuelens/web-streams-polyfill": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.2.1.tgz", + "integrity": "sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==", + "deprecated": "moved to web-streams-polyfill@2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/whatwg-streams": "^0.0.7" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-observable": "^0.3.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + }, + "zen-observable": { + "optional": true } } }, - "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", - "dev": true - }, - "application-config": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/application-config/-/application-config-0.1.2.tgz", - "integrity": "sha1-MnJTO1+fg7MjqeXWQKNVi1Cls4U=", - "dev": true, - "requires": { - "application-config-path": "0.1.0", - "mkdirp": "0.5.1" + "node_modules/@sentry-internal/tracing": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.3.tgz", + "integrity": "sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" } }, - "application-config-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", - "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=", - "dev": true - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" + "node_modules/@sentry-internal/tracing/node_modules/@sentry/core": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", + "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" } }, - "arr-diff": { + "node_modules/@sentry-internal/tracing/node_modules/@sentry/types": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", + "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry-internal/tracing/node_modules/@sentry/utils": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", + "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.30.0.tgz", + "integrity": "sha512-rOb58ZNVJWh1VuMuBG1mL9r54nZqKeaIlwSlvzJfc89vyfd7n6tQ1UXMN383QBz/MS5H5z44Hy5eE+7pCrYAfw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/integrations": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.3.tgz", + "integrity": "sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations/node_modules/@sentry/core": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", + "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations/node_modules/@sentry/types": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", + "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations/node_modules/@sentry/utils": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", + "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.3.tgz", + "integrity": "sha512-t+QtekZedEfiZjbkRAk1QWJPnJlFBH/ti96tQhEq7wmlk3VszDXraZvLWZA0P2vXyglKzbWRGkT31aD3/kX+5Q==", + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/integrations": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/core": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", + "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/types": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", + "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/utils": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", + "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "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==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "engines": { + "node": ">= 10" } }, - "arr-flatten": { + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime-types": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", + "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/whatwg-streams": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz", + "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "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==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "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==", + "license": "Apache-2.0", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "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/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "license": "ISC" + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "license": "MIT", + "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-find-index": { + "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "array-flatten": { + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0" + "license": "MIT" + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { + "node_modules/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "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 - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "dev": true - }, - "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, - "requires": { - "util": "0.10.3" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "dev": true + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "ast-types": { + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asmcrypto.js": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz", + "integrity": "sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { "version": "0.9.6", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "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 - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "autoprefixer": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", - "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", + "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==", "dev": true, - "requires": { - "browserslist": "2.8.0", - "caniuse-lite": "1.0.30000760", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.14", - "postcss-value-parser": "3.3.0" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "aws-sdk": { - "version": "2.149.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.149.0.tgz", - "integrity": "sha1-dvU3Iqd4C9sxkeg/J8EBCMb+mBM=", - "requires": { - "buffer": "4.9.1", - "crypto-browserify": "1.0.9", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "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, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1692.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz", + "integrity": "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "buffer": "4.9.2", "events": "1.1.1", - "jmespath": "0.15.0", + "ieee754": "1.1.13", + "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.1.0", - "xml2js": "0.4.17", - "xmlbuilder": "4.2.1" + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" + }, + "engines": { + "node": ">= 10.0.0" } }, - "aws-sign": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz", - "integrity": "sha1-PYHKabR0seFlGHKLUcJP8Lvtxuk=", - "dev": true + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "babel-code-frame": { + "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=", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "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.0", - "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" - }, + "license": "MIT", "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "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" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "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": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "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.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-template": "6.26.0" - } - }, - "babel-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", - "dev": true, - "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.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.26.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.26.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-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "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-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "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-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "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.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.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.26.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.26.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.26.0", - "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.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-template": "6.26.0" - } - }, - "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.26.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.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.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.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.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.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "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.26.0", - "babel-template": "6.26.0" - } - }, - "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.26.0", - "babel-template": "6.26.0" - } - }, - "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.26.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.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.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.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "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.26.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.26.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.26.0", - "babel-runtime": "6.26.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.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.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.1" - } - }, - "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.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-yo-yoify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-yo-yoify/-/babel-plugin-yo-yoify-1.0.1.tgz", - "integrity": "sha512-apPjOzas8nhKR1GT1h8fuJhClS/BJck6+bVZph7rjrHYgLkrkEBQVpOQ7y1HydKgVEj2dL6BRNpp+nAJAj/Q7A==", - "dev": true, - "requires": { - "@f/is-svg": "1.0.0", - "@f/svg-namespace": "1.0.1", - "camel-case": "3.0.0", - "hyperx": "2.3.2", - "is-boolean-attribute": "0.0.1", - "normalize-html-whitespace": "0.2.0", - "yo-yoify": "4.0.0" - } - }, - "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.1", - "regenerator-runtime": "0.10.5" - }, - "dependencies": { - "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 - } - } - }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "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.24.1", - "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.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "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.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.8.0", - "invariant": "2.2.2", - "semver": "5.4.1" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "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.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "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.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.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.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "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.5.1", - "regenerator-runtime": "0.11.0" - } - }, - "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.9", - "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 - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bel": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/bel/-/bel-5.1.5.tgz", - "integrity": "sha512-t9R67SKL3lRygFqhrsHfw5w3lAi541pyQD+xdxpClTpxKN+ooW8WcqNXTysoIYQda0qu7aqJVZruwHm4WaQ8mw==", - "requires": { - "hyperx": "2.3.2", - "is-electron": "2.1.0", - "pelo": "0.0.4" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", - "dev": true - }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, - "requires": { - "readable-stream": "1.0.34" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "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 - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.1.1", - "multicast-dns-service-types": "1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "dev": true - } - } - }, - "boom": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", - "dev": true, - "requires": { - "hoek": "0.9.1" - }, - "dependencies": { - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", - "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": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "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-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "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.11.8", - "randombytes": "2.0.5" - } - }, - "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.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "0.2.9" - }, - "dependencies": { - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - } - } - }, - "browserslist": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.8.0.tgz", - "integrity": "sha512-iiWHM1Et6Q4TQpB7Ar6pxuM3TNMXasVJY4Y/oh3q38EwR3Z+IdZ9MyVf7PI4MJFB4xpwMcZgs9bEUnPG2E3TCA==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000760", - "electron-to-chromium": "1.3.27" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "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 - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.14" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "call-matcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", - "dev": true, - "requires": { - "core-js": "2.5.1", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000760", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000760", - "electron-to-chromium": "1.3.27" - } - } - } - }, - "caniuse-db": { - "version": "1.0.30000760", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000760.tgz", - "integrity": "sha1-PqKUc+t4psywny63Osnh3r/sUo0=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000760.tgz", - "integrity": "sha1-7HIDlXQvHH7IlH/W3SYE53qPmP8=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { + "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=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - }, + "license": "MIT", "dependencies": { - "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 - }, - "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, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "choo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/choo/-/choo-6.5.1.tgz", - "integrity": "sha512-5nfyEn0b/AZqH4MOwCtwXbZKdMrd+5zyWwygXnOQvkiSn8wRtDFoyKUQW3qC4iuUlb77HnapL9s0NaJ6RWK+6A==", - "requires": { - "bel": "5.1.5", - "document-ready": "2.0.1", - "nanobus": "4.3.0", - "nanohref": "3.0.1", - "nanolocation": "1.0.0", - "nanomorph": "5.1.3", - "nanoquery": "1.1.0", - "nanoraf": "3.0.1", - "nanorouter": "2.1.0", - "nanotiming": "6.1.5", - "scroll-to-anchor": "1.1.0", - "xtend": "4.0.1" - } - }, - "ci-info": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", - "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==", - "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.3", - "safe-buffer": "5.1.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, - "cldr-core": { - "version": "32.0.0", - "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-32.0.0.tgz", - "integrity": "sha1-M7OO+WyaGD9SilZGBJRaqqTs6nE=" - }, - "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", - "dev": true, - "requires": { - "source-map": "0.5.7" + "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/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "1.0.2" + "ansi-regex": "^2.0.0" }, - "dependencies": { - "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.1" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } + "engines": { + "node": ">=0.10.0" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "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.1" - } - }, - "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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, - "clone-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.0.tgz", - "integrity": "sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw=", - "dev": true, - "requires": { - "is-regexp": "1.0.0", - "is-supported-regexp-flag": "1.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "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 - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true, - "requires": { - "clone": "1.0.3", - "color-convert": "1.9.1", - "color-string": "0.3.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.3" - } - }, - "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-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.1" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "dev": true, - "requires": { - "delayed-stream": "0.0.5" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "compressible": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", - "dev": true, - "requires": { - "mime-db": "1.30.0" - } - }, - "compression": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", - "dev": true, - "requires": { - "accepts": "1.3.4", - "bytes": "3.0.0", - "compressible": "2.0.12", - "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.2" - } - }, - "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.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - }, - "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } - } - }, - "connect-busboy": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-0.0.2.tgz", - "integrity": "sha1-rFyclmchcYheV2xmsr/ZXTuxEJc=", - "requires": { - "busboy": "0.2.14" - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "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 - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-security-policy-builder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-1.1.0.tgz", - "integrity": "sha1-2R8bB2I2wRmFDH3umSS/VeBXcrM=", - "requires": { - "dashify": "0.2.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "convict": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/convict/-/convict-4.0.1.tgz", - "integrity": "sha1-3yhunfaNik43icCfkvSdK6e51Z4=", - "requires": { - "depd": "1.1.1", - "json5": "0.5.1", - "lodash.clonedeep": "4.5.0", - "moment": "2.18.1", - "validator": "7.2.0", - "varify": "0.2.0", - "yargs-parser": "7.0.0" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-jar": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz", - "integrity": "sha1-vJon1OK5fhhs1XyeIGPLmfpozMw=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-eZERim02YjJcepLjrToQMapOoRLfiXewJi9zJON6xXNNJSUhkGzL1L/yFjOufS0KxsnWUzc2szg9t8ZaZKJXAg==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "fs-extra": "4.0.2", - "glob": "7.1.2", - "is-glob": "4.0.0", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "node-dir": "0.1.17" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "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=" - }, - "cosmiconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-1.1.0.tgz", - "integrity": "sha1-DeoPmATv37kp+7GxiOJVU+oFPTc=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "require-from-string": "1.2.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" - } - }, - "cross-env": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.1.tgz", - "integrity": "sha512-Wtvr+z0Z06KO1JxjfRRsPC+df7biIOiuV4iZ73cThjFGkH+ULBZq1MkBdywEcJC4cTDbO6c8IjgRjfswx3YTBA==", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "is-windows": "1.0.1" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", - "dev": true, - "requires": { - "boom": "0.4.2" - } - }, - "crypto-browserify": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", - "integrity": "sha1-zFRJaF37hesRyYKKzHy4erW7/MA=" - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "css-mqpacker": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/css-mqpacker/-/css-mqpacker-6.0.1.tgz", - "integrity": "sha512-pQ40tp4ooLopvkYA8YfQdDAAnoPToP5a3tdOWn6A4VwaJ6tGJLvyC3UEfmfsw9DbX2Ofgk4WBIVW3EZmNYvLYQ==", - "dev": true, - "requires": { - "minimist": "1.2.0", - "postcss": "6.0.14" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "css-rule-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", - "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=", - "dev": true, - "requires": { - "css-tokenize": "1.0.1", - "duplexer2": "0.0.2", - "ldjson-stream": "1.2.1", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - } - } - }, - "css-tokenize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", - "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" - }, - "dependencies": { - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000760", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000760", - "electron-to-chromium": "1.3.27" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.35" - } - }, - "dasherize": { + "node_modules/babel-code-frame/node_modules/supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", - "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } }, - "dashify": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dashify/-/dashify-0.2.2.tgz", - "integrity": "sha1-agdBWgHJH69KMuONnfunH2HLIP4=" + "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, + "license": "MIT", + "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" + } }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true + "node_modules/babel-core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" }, - "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 - }, - "dbug": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/dbug/-/dbug-0.4.2.tgz", - "integrity": "sha1-MrSzEF6IYQQ6b5rHVdgOVC02WzE=" - }, - "debug": { + "node_modules/babel-core/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "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 - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "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 - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "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.3", - "minimalistic-assert": "1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "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.1" - } - }, - "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", - "dev": true - }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.14", - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.5" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", - "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", - "dev": true, - "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.1" - } - }, - "dns-prefetch-control": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", - "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "1.1.1" - } - }, - "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "document-ready": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/document-ready/-/document-ready-2.0.1.tgz", - "integrity": "sha1-PjvzHTI1uU4jLnssX6GmNOhzuuQ=" - }, - "doiuse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.0.0.tgz", - "integrity": "sha512-j2KwY4eJdysCnRY/CVYG3/cE0t5SEOCtGMvdfVLkcmyay9W43rmZbb4bOmkCN25aJ9EkkRhxCJe44uMt92WqgQ==", - "dev": true, - "requires": { - "browserslist": "2.8.0", - "caniuse-lite": "1.0.30000760", - "css-rule-stream": "1.1.0", - "duplexer2": "0.0.2", - "jsonfilter": "1.1.2", - "ldjson-stream": "1.2.1", - "lodash": "4.17.4", - "multimatch": "2.1.0", - "postcss": "6.0.14", - "source-map": "0.5.7", - "through2": "0.6.5", - "yargs": "8.0.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "dont-sniff-mimetype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", - "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" - }, - "double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "1.1.14" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.27", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", - "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", - "dev": true - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" - } - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true, - "requires": { - "prr": "0.0.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.9.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", - "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", - "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.35", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", - "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "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.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "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.0.0", - "es5-ext": "0.10.35" - } - }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", - "dev": true, - "requires": { - "recast": "0.11.23", - "through": "2.3.8" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=" - }, - "escodegen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", - "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", - "dev": true, - "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.5.7" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", - "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", - "dev": true, - "requires": { - "ajv": "5.3.0", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.0.0", - "eslint-scope": "3.7.1", - "espree": "3.5.1", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "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" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "eslint-plugin-mocha": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.11.0.tgz", - "integrity": "sha1-kRk6L1XiCl41l0BUoAidMBmO5Xg=", - "dev": true, - "requires": { - "ramda": "0.24.1" - } - }, - "eslint-plugin-node": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", - "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", - "dev": true, - "requires": { - "ignore": "3.3.7", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "eslint-plugin-security": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", - "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", - "dev": true, - "requires": { - "safe-regex": "1.1.0" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "espree": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", - "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", - "dev": true, - "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", - "optional": true - }, - "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", - "dev": true, - "requires": { - "core-js": "2.5.1" - } - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" - } - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", - "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" - } - }, - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, - "requires": { - "original": "1.0.0" - } - }, - "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": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "execall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", - "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", - "dev": true, - "requires": { - "clone-regexp": "1.0.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "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, - "requires": { - "fill-range": "2.2.3" - } - }, - "expect-ct": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.0.tgz", - "integrity": "sha1-UnNWeN4YUwiQ2Ne5XwrGNkCVgJQ=" - }, - "expose-loader": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.3.tgz", - "integrity": "sha1-NfvTZZeJ5PqoH1nei36fw55GbVE=", - "dev": true - }, - "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "external-editor": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", - "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", - "dev": true, - "requires": { - "iconv-lite": "0.4.19", - "jschardet": "1.6.0", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - }, - "dependencies": { - "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 - } - } - }, - "extract-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-1.0.1.tgz", - "integrity": "sha512-As/KL9XEi3O4gpJsP3qvYFXy8yN9hqsDNY8/VCN0iEAPV7OieMx44jib1M8Ba0Y/t6MOEvJMyvWJQqFxcMZ14w==", - "dev": true, - "requires": { - "loader-utils": "1.1.0" - } - }, - "falafel": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", - "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", - "dev": true, - "requires": { - "acorn": "5.2.1", - "foreach": "2.0.5", - "isarray": "0.0.1", - "object-keys": "1.0.11" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "file-loader": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", - "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" - } - }, - "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 - }, - "fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "dev": true, - "requires": { - "is-object": "1.0.1", - "merge-descriptors": "1.0.1" - }, - "dependencies": { - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - } - } - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.1.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, - "fluent": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/fluent/-/fluent-0.4.1.tgz", - "integrity": "sha512-vatFe36jVjXclCYPRopLVB6oR5ceuKWnn6oVLIuLCnkdCb49RGuTznPdd51xATo+S83N9zLD1xsYf1Ma4s2VoQ==" - }, - "fluent-langneg": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fluent-langneg/-/fluent-langneg-0.1.0.tgz", - "integrity": "sha512-SzRtXNaIcCyRabIpcv+AQd0gn+tXv1wfDDvej3wtBo1/XV0iDnCw5XzbARRRmZMW+IEg+Q26jup6vYgnDam4dg==" - }, - "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": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "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.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", - "dev": true - }, - "form-data": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.8.tgz", - "integrity": "sha1-CJDNEAXFzOzAudJKiAUskkQtDbU=", - "dev": true, - "requires": { - "async": "0.2.10", - "combined-stream": "0.0.7", - "mime": "1.2.11" - }, - "dependencies": { - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", - "dev": true - } - } - }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.3.0" - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "frameguard": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", - "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "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": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } - }, - "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.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "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, - "requires": { - "wrappy": "1.0.2" - } - }, - "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.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "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.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.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 - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": 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 - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "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-own-enumerable-property-symbols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", - "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", - "dev": true - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "ghauth": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ghauth/-/ghauth-3.0.0.tgz", - "integrity": "sha1-gpKiTvR4mfGAo5x4DEgJVhKUvbw=", - "dev": true, - "requires": { - "application-config": "0.1.2", - "bl": "0.9.5", - "hyperquest": "1.2.0", - "mkdirp": "0.5.1", - "read": "1.0.7", - "xtend": "4.0.1" - } - }, - "git-rev-sync": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.9.1.tgz", - "integrity": "sha1-oMLj3TkqvPa3aWLif8dfsyI0Sc4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "graceful-fs": "4.1.11", - "shelljs": "0.7.7" - } - }, - "github": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/github/-/github-0.1.16.tgz", - "integrity": "sha1-iV0qhbD+t5gNiawM5PRNyqA/F7U=", - "dev": true - }, - "github-changes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/github-changes/-/github-changes-1.1.1.tgz", - "integrity": "sha512-PlFQpIM/RP0fYnC7beCvtqa73QRWX9Z1NTp4qxOW9qVVnWnfzrQ1VxhOOwKvCbbgWevI/+2MZqTpTTLj5TdAtQ==", - "dev": true, - "requires": { - "bluebird": "1.0.3", - "ghauth": "3.0.0", - "github": "0.1.16", - "github-commit-stream": "0.1.0", - "lodash": "2.4.1", - "moment-timezone": "0.5.5", - "nomnom": "1.6.2", - "parse-link-header": "0.1.0", - "semver": "2.2.1" - }, - "dependencies": { - "bluebird": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-1.0.3.tgz", - "integrity": "sha1-xLRBGEgC47ZKYe7tRXgnG0yL9qw=", - "dev": true - }, - "lodash": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=", - "dev": true - }, - "semver": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz", - "integrity": "sha1-eUEYKz/8xYC/8cF5QqzfeVHA0hM=", - "dev": true - } - } - }, - "github-commit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/github-commit-stream/-/github-commit-stream-0.1.0.tgz", - "integrity": "sha1-2823smeWcYa3DMc2ORgw2mNo16E=", - "dev": true, - "requires": { - "async": "0.2.10", - "parse-link-header": "0.1.0", - "request": "2.22.0", - "through": "2.3.8" - } - }, - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "is-extglob": "1.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, - "requires": { - "is-glob": "2.0.1" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "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=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hawk": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.13.1.tgz", - "integrity": "sha1-NheViCH1gxHk1/beKR/KZitBLvQ=", - "dev": true, - "requires": { - "boom": "0.4.2", - "cryptiles": "0.2.2", - "hoek": "0.8.5", - "sntp": "0.2.4" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "helmet": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.9.0.tgz", - "integrity": "sha512-czCyS77TyanWlfVSoGlb9GBJV2Q2zJayKxU5uBw0N1TzDTs/qVNh1SL8Q688KU0i0Sb7lQ/oLtnaEqXzl2yWvA==", - "requires": { - "dns-prefetch-control": "0.1.0", - "dont-sniff-mimetype": "1.0.0", - "expect-ct": "0.1.0", - "frameguard": "3.0.0", - "helmet-csp": "2.6.0", - "hide-powered-by": "1.0.0", - "hpkp": "2.0.0", - "hsts": "2.1.0", - "ienoopen": "1.0.0", - "nocache": "2.0.0", - "referrer-policy": "1.1.0", - "x-xss-protection": "1.0.0" - } - }, - "helmet-csp": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.6.0.tgz", - "integrity": "sha512-n/oW9l6RtO4f9YvphsNzdvk1zITrSN7iRT8ojgrJu/N3mVdHl9zE4OjbiHWcR64JK32kbqx90/yshWGXcjUEhw==", - "requires": { - "camelize": "1.0.0", - "content-security-policy-builder": "1.1.0", - "dasherize": "2.0.0", - "lodash.reduce": "4.6.0", - "platform": "1.3.4" - } - }, - "hide-powered-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", - "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" - }, - "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.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.8.5.tgz", - "integrity": "sha1-Hp/XcO9+vgJ0rfy1sIBqAlpeTp8=", - "dev": true - }, - "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.2", - "os-tmpdir": "1.0.2" - } - }, - "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 - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "wbuf": "1.7.2" - }, - "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } - } - }, - "hpkp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", - "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" - }, - "hsts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", - "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", - "dev": true - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.1.tgz", - "integrity": "sha512-RxokXoxcsRSWcN553Ew+K0TUo68gQfmddTuUIZ4xRD8Ax1xXzX2UYQ3FC3D5MoRPGAdL1erWKeEFihDrrdxHiA==", - "dev": true, - "requires": { - "es6-templates": "0.2.3", - "fastparse": "1.1.1", - "html-minifier": "3.5.6", - "loader-utils": "1.1.0", - "object-assign": "4.1.1" - } - }, - "html-minifier": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.6.tgz", - "integrity": "sha512-88FjtKrlak2XjczhxrBomgzV4jmGzM3UnHRBScRkJcmcRum0kb+IwhVAETJ8AVp7j0p3xugjSaw9L+RmI5/QOA==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.9", - "commander": "2.11.0", - "he": "1.1.1", - "ncname": "1.0.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.1.8" - } - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "http-parser-js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", - "dev": true - }, - "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", - "dev": true, - "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dev": true, - "requires": { - "http-proxy": "1.16.2", - "is-glob": "3.1.0", - "lodash": "4.17.4", - "micromatch": "2.3.11" - }, - "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.1" - } - } - } - }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "dev": true, - "requires": { - "asn1": "0.1.11", - "assert-plus": "0.1.5", - "ctype": "0.5.3" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", - "dev": true, - "requires": { - "is-ci": "1.0.10", - "normalize-path": "1.0.0", - "strip-indent": "2.0.0" - } - }, - "hyperquest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperquest/-/hyperquest-1.2.0.tgz", - "integrity": "sha1-OeH+9miI3Hzg3sbA3YFPb8iUStU=", - "dev": true, - "requires": { - "duplexer2": "0.0.2", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "hyperscript-attribute-to-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperscript-attribute-to-property/-/hyperscript-attribute-to-property-1.0.0.tgz", - "integrity": "sha1-glMI1Ju44pV5I/cxmBvMgRytev8=" - }, - "hyperx": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/hyperx/-/hyperx-2.3.2.tgz", - "integrity": "sha512-fYFJn0kVMHpkLJKzqGXfs0+p26NH0R3PsLWQGZ5Enbp1jcyEK9U9uJGnsRKPgBCoQ6bVzkV+srwHVFc2+pHfYQ==", - "requires": { - "hyperscript-attribute-to-property": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "6.0.14" - } - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "ienoopen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", - "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "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.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.0.5", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "intel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/intel/-/intel-1.2.0.tgz", - "integrity": "sha1-EdEUfraz9Fgr31M3s31UFYTp5B4=", - "requires": { - "chalk": "1.1.3", - "dbug": "0.4.2", - "stack-trace": "0.0.10", - "strftime": "0.10.0", - "symbol": "0.3.1", - "utcstring": "0.1.0" - } - }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, - "requires": { - "meow": "3.7.0" - } - }, - "interpret": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", - "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "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": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" - }, - "is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "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.10.0" - } - }, - "is-boolean-attribute": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/is-boolean-attribute/-/is-boolean-attribute-0.0.1.tgz", - "integrity": "sha1-JKtZt9y52jYSx3PmDGVlZeWgmAw=", - "dev": true - }, - "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-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.1.1" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-ci": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", - "dev": true, - "requires": { - "ci-info": "1.1.1" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "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 - }, - "is-electron": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.1.0.tgz", - "integrity": "sha512-dkg5xT383+M6zIbbXW/z7n2nz4SFUi2OSyhntnFYkRdtV+HVEfdjEK+5AWisfYgkpe3WYjTIuh7toaKmSfFVWw==" - }, - "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, - "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": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "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-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "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-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 - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } - }, - "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-supported-regexp-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz", - "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true, - "requires": { - "html-comment-regex": "1.1.1" - } - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "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-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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": "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" - } - }, - "jest-get-type": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", - "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", - "dev": true - }, - "jest-validate": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", - "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "jest-get-type": "21.2.0", - "leven": "2.1.0", - "pretty-format": "21.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-base64": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", - "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==", - "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": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } - } - }, - "jschardet": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz", - "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==", - "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-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-4.0.0.tgz", - "integrity": "sha1-d8JxqupUMC5o7+rMtWq78GqbGlQ=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { + "node_modules/babel-core/node_modules/json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", "dev": true, - "requires": { - "graceful-fs": "4.1.11" + "license": "MIT", + "bin": { + "json5": "lib/cli.js" } }, - "jsonfilter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz", - "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=", - "dev": true, - "requires": { - "JSONStream": "0.8.4", - "minimist": "1.2.0", - "stream-combiner": "0.2.2", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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.8" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, - "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", - "dev": true, - "requires": { - "core-js": "2.3.0", - "es6-promise": "3.0.2", - "lie": "3.1.1", - "pako": "1.0.6", - "readable-stream": "2.0.6" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - } - } - }, - "just-extend": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", - "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", - "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.6" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "known-css-properties": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.4.1.tgz", - "integrity": "sha512-n+ThoCKhyMFKkMfksdLMP5ndp+VzwDRzQdH6JlmZ2GTpUenYB2EeEKjOue2SErAAG/MmBSUISpwvawDhydWQdQ==", - "dev": true - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "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" - } - }, - "ldjson-stream": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz", - "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=", - "dev": true, - "requires": { - "split2": "0.2.1", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "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" - } - }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "dev": true, - "requires": { - "immediate": "3.0.6" - } - }, - "lint-staged": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-4.3.0.tgz", - "integrity": "sha512-C/Zxslg0VRbsxwmCu977iIs+QyrmW2cyRCPUV5NDFYOH/jtRFHH8ch7ua2fH0voI/nVC3Tpg7DykfgMZySliKw==", - "dev": true, - "requires": { - "app-root-path": "2.0.1", - "chalk": "2.3.0", - "commander": "2.11.0", - "cosmiconfig": "1.1.0", - "execa": "0.8.0", - "is-glob": "4.0.0", - "jest-validate": "21.2.1", - "listr": "0.12.0", - "lodash": "4.17.4", - "log-symbols": "2.1.0", - "minimatch": "3.0.4", - "npm-which": "3.0.1", - "p-map": "1.2.0", - "staged-git-files": "0.0.4", - "stringify-object": "3.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "listr": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", - "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.2.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.2", - "stream-to-observable": "0.1.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", - "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - } - } - }, - "listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" - }, - "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - } - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.1" - } - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "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.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", - "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", - "dev": true, - "requires": { - "chalk": "2.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - } - } - }, - "loglevel": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.5.1.tgz", - "integrity": "sha1-GJB4yUq5BT7iFaCs2/JCROoPZQI=", - "dev": true - }, - "lolex": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.0.tgz", - "integrity": "sha512-rPO6R1t8PjYL6xbsFUg7aByKkWAql907na6powPBORVs4DCm8aMBUkL4+6CXO0gEIV8vtu3mWV0FB8ZaCYPBmA==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "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.2" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "lsmod": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", - "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" - }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", - "dev": true - }, - "make-dir": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", - "dev": true - }, - "mathml-tag-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz", - "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "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.3", - "safe-buffer": "5.1.1" - } - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" - }, - "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "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.1.0", - "pinkie-promise": "2.0.1" - } - }, - "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.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "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.1" - } - }, - "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.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "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.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.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.1.2", - "read-pkg": "1.1.0" - } - }, - "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.1" - } - } - } - }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "is-extglob": "1.0.0" - } - }, - "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.1.0" - } - } - } - }, - "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.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "0.1.1" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "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.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", - "dev": true - }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" - }, - "moment-timezone": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.5.tgz", - "integrity": "sha1-odVBCnLBil8pPyouYocKgK1DLa4=", - "dev": true, - "requires": { - "moment": "2.18.1" - } - }, - "mozlog": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-2.1.1.tgz", - "integrity": "sha1-JxCOChxQvOMuo3Q4kRiDrjdO77s=", - "requires": { - "intel": "1.2.0", - "merge": "1.2.0" - } - }, - "ms": { + "node_modules/babel-core/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", - "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "requires": { - "dns-packet": "1.2.2", - "thunky": "0.1.0" - } + "license": "MIT" }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "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, - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "dev": true, - "optional": true - }, - "nanoassert": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", - "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" - }, - "nanobus": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.3.0.tgz", - "integrity": "sha512-M8ZN8fg9gidyGPJY0rWxHQbBlXs9Vy8afd/AuFqqVw65fYl3E/MVAQmTYg9VpLoCE/PGmHdGEEDHJ/7hkH3Ktg==", - "requires": { - "nanotiming": "6.1.5", - "remove-array-items": "1.0.0" - } - }, - "nanohref": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nanohref/-/nanohref-3.0.1.tgz", - "integrity": "sha512-YfDhNcglFDIISfKVnXHovDaaglTauD2ThidaTZuyV6NE0lQMvGs5UfSoa1GvX6Nd9p2TfFeYzzc+TtjH+htu+Q==" - }, - "nanolocation": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nanolocation/-/nanolocation-1.0.0.tgz", - "integrity": "sha1-FbXHrwWJXRqfIfDRNkldmURQaGs=" - }, - "nanomorph": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanomorph/-/nanomorph-5.1.3.tgz", - "integrity": "sha512-VydkKjFWU/DAO0R10awFASRNXQKHrZUMdMIiNcdmWm+IhuifuPOw/dDtpiQ1cNROF8f3ATPrcKRVarEayQJOqA==", - "requires": { - "nanoassert": "1.1.0" - } - }, - "nanoquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nanoquery/-/nanoquery-1.1.0.tgz", - "integrity": "sha1-g6giCTNAygU9aW7IYKEKWsTDtEI=" - }, - "nanoraf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nanoraf/-/nanoraf-3.0.1.tgz", - "integrity": "sha1-q5+5wle5rcxx2CmCy1jY+jUDdko=" - }, - "nanorouter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nanorouter/-/nanorouter-2.1.0.tgz", - "integrity": "sha1-T8r5YgOgCJjaiRiLG/9aj8Bu9P8=", - "requires": { - "wayfarer": "6.6.2" - } - }, - "nanotiming": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/nanotiming/-/nanotiming-6.1.5.tgz", - "integrity": "sha512-cMM+WkW9wqx3Kr3vKAhWKXN5vK4eElE8ooKEoLsfmxByCV+zob0fNJexG07sBa8vpFYAgXRlLhxcZ3b5k9yWrw==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, - "requires": { - "xml-char-classes": "1.0.0" - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "nise": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz", - "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==", - "dev": true, - "requires": { - "formatio": "1.2.0", - "just-extend": "1.1.27", - "lolex": "1.6.0", - "path-to-regexp": "1.7.0", - "text-encoding": "0.6.4" - }, + "license": "MIT", "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } + "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" } }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "1.1.4" - } - }, - "nocache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", - "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "node-forge": { - "version": "0.6.33", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", - "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", - "dev": true - }, - "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.3.2", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.4", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "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.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "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.1" - } - } - } - }, - "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" - } - } - } - }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.1", - "underscore": "1.4.4" - }, - "dependencies": { - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - } - } - }, - "normalize-html-whitespace": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", - "integrity": "sha1-EBci9kI1Ucdc24+dEE/4UNrx4Q4=", - "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.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" - } - }, - "npm-path": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.3.tgz", - "integrity": "sha1-Fc/04ciaONp39W9gVbJPl137K74=", - "dev": true, - "requires": { - "which": "1.3.0" - } - }, - "npm-run-all": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.2.tgz", - "integrity": "sha512-Z2aRlajMK4SQ8u19ZA75NZZu7wupfCNQWdYosIi8S6FgBdGf/8Y6Hgyjdc8zU2cYmIRVCx1nM80tJPkdEd+UYg==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "chalk": "2.3.0", - "cross-spawn": "5.1.0", - "memorystream": "0.3.1", - "minimatch": "3.0.4", - "ps-tree": "1.1.0", - "read-pkg": "3.0.0", - "shell-quote": "1.6.1", - "string.prototype.padend": "3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", - "dev": true, - "requires": { - "commander": "2.11.0", - "npm-path": "2.0.3", - "which": "1.3.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "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 - }, - "oauth-sign": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", - "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-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "obuf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "on-load": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/on-load/-/on-load-3.3.1.tgz", - "integrity": "sha1-izj1t46ITuRXwFFpmdMB2BSw/qA=", - "dev": true, - "requires": { - "global": "4.3.2", - "nanoassert": "1.1.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "dev": true, - "requires": { - "is-wsl": "1.1.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "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", - "wordwrap": "1.0.0" - } - }, - "ora": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - } - } - }, - "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", - "dev": true, - "requires": { - "url-parse": "1.0.5" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "dev": true, - "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" - } - } - } - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "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-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "2.3.2" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "is-extglob": "1.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.3.1" - } - }, - "parse-link-header": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-0.1.0.tgz", - "integrity": "sha1-VQP6f7LzVLsjQlXBxCHaPrBbkYU=", - "dev": true, - "requires": { - "xtend": "2.0.6" - }, - "dependencies": { - "object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "indexof": "0.0.1", - "is": "0.2.7" - } - }, - "xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", - "dev": true, - "requires": { - "is-object": "0.1.2", - "object-keys": "0.2.0" - } - } - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "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 - }, - "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-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "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.8" - } - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" - } - }, - "pelo": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/pelo/-/pelo-0.0.4.tgz", - "integrity": "sha1-yjDI1ZpmnTtDptFMKGgcohtgSw8=" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "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.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "platform": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.4.tgz", - "integrity": "sha1-bw+xftqqSPIUQrOpdcBjEw8cPr0=" - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "dev": true, - "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "postcss": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", - "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true, - "requires": { - "postcss": "5.2.18" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true, - "requires": { - "postcss": "5.2.18" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "requires": { - "postcss": "5.2.18" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "requires": { - "postcss": "5.2.18" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "uniqid": "4.1.1" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-less": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.2.tgz", - "integrity": "sha512-zRMQLHjD5BsnKOPAr+jCw3M5NoHoEANJ1xg8ftu0lpfRailrchh3spt9n6jFdBF/WGpI8Q+Ch21QnLlLaKGxnA==", - "dev": true, - "requires": { - "postcss": "5.2.18" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } - } - }, - "postcss-loader": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", - "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.14", - "postcss-load-config": "1.2.0", - "schema-utils": "0.3.0" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", - "dev": true - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true, - "requires": { - "postcss": "5.2.18" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000760", - "electron-to-chromium": "1.3.27" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "requires": { - "postcss": "6.0.14" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.14" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.14" - } - }, - "postcss-modules-values": { + "node_modules/babel-generator/node_modules/jsesc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", "dev": true, - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.14" + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" } }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "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": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", "dev": true, - "requires": { - "postcss": "5.2.18" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "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": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", "dev": true, - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "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": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "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": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "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": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", "dev": true, - "requires": { - "postcss": "5.2.18" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "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" } }, - "postcss-reduce-transforms": { + "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": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", + "dev": true, + "license": "MIT", + "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": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", + "dev": true, + "license": "MIT", + "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": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", + "dev": true, + "license": "MIT", + "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": "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==", + "dev": true, + "license": "MIT", + "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": "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==", + "dev": true, + "license": "MIT", + "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": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", + "dev": true, + "license": "MIT", + "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": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-add-module-exports": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, + "license": "MIT" + }, + "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": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "babel-runtime": "^6.22.0" } }, - "postcss-reporter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "node_modules/babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, - "requires": { - "chalk": "2.3.0", - "lodash": "4.17.4", - "log-symbols": "2.1.0", - "postcss": "6.0.14" - }, + "license": "BSD-3-Clause", "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true - }, - "postcss-safe-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-3.0.1.tgz", - "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=", - "dev": true, - "requires": { - "postcss": "6.0.14" - } - }, - "postcss-scss": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.2.tgz", - "integrity": "sha1-/0XPM1S4ee6JpOtoaA9GrJuxT5Q=", - "dev": true, - "requires": { - "postcss": "6.0.14" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "dev": true, - "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "engines": { + "node": ">=6" } }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "uniqs": "2.0.0" - }, + "license": "MIT", "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.3.2", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "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 - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.2.tgz", - "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", - "dev": true - }, - "pretty-format": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", - "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "dev": true, - "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.0" - }, + "license": "MIT", "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - } + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "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 + "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": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", + "dev": true, + "license": "MIT" }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "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": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", + "dev": true, + "license": "MIT" }, - "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 + "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": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", + "dev": true, + "license": "MIT" }, - "progress": { + "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": "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==", + "dev": true, + "license": "MIT", + "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": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", + "dev": true, + "license": "MIT", + "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": "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==", + "dev": true, + "license": "MIT", + "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": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", + "dev": true, + "license": "MIT", + "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": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", + "dev": true, + "license": "MIT", + "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": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", + "dev": true, + "license": "MIT", + "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": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", + "dev": true, + "license": "MIT", + "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": "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==", + "dev": true, + "license": "MIT", + "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": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", + "dev": true, + "license": "MIT", + "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": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", + "dev": true, + "license": "MIT", + "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": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", + "dev": true, + "license": "MIT", + "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": "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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": "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==", + "dev": true, + "license": "MIT", + "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": "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==", + "dev": true, + "license": "MIT", + "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": "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==", + "dev": true, + "license": "MIT", + "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": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", + "dev": true, + "license": "MIT", + "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": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", + "dev": true, + "license": "MIT", + "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": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", + "dev": true, + "license": "MIT", + "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": "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==", + "dev": true, + "license": "MIT", + "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": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", + "dev": true, + "license": "MIT", + "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": "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==", + "dev": true, + "license": "MIT", + "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": "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex/node_modules/regexpu-core": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" - } - }, - "proxyquire": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", - "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==", "dev": true, - "requires": { - "fill-keys": "1.0.2", - "module-not-found-error": "1.0.1", - "resolve": "1.1.7" - }, + "license": "MIT", "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - }, - "ps-tree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", - "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", - "dev": true, - "requires": { - "event-stream": "3.3.4" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" - } - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "querystring": { + "node_modules/babel-plugin-transform-es2015-unicode-regex/node_modules/regjsgen": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "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": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", - "dev": true - }, - "ramda": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", - "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex/node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", + "dev": true, + "license": "BSD", "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.2.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.6" - } - } - } - }, - "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.6" - } - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", - "dev": true, - "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raven": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/raven/-/raven-2.2.1.tgz", - "integrity": "sha1-V8f75oqAFH7FJ97z18AVdc+Uj+M=", - "requires": { - "cookie": "0.3.1", - "lsmod": "1.0.0", - "stack-trace": "0.0.9", - "timed-out": "4.0.1", - "uuid": "3.0.0" + "jsesc": "~0.5.0" }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "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": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", + "dev": true, + "license": "MIT", "dependencies": { - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" - }, - "uuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", - "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" - } + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "raven-js": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.19.1.tgz", - "integrity": "sha512-E01uqSgP4JJIZNCaug2rV8g3JcIabLP09POLJ6wpM0oWftfnjqIWHYipUuscltCjQAxsPV3FFnMkW22/93qgig==", - "dev": true - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "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": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", "dev": true, - "requires": { - "mute-stream": "0.0.7" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - }, + "license": "MIT", "dependencies": { - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - } + "regenerator-transform": "^0.10.0" } }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - }, - "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "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.5.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - } - } - }, - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", - "optional": true, - "requires": { - "esprima": "3.0.0" - } - }, - "redis": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", - "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", - "requires": { - "double-ended-queue": "2.1.0-0", - "redis-commands": "1.3.1", - "redis-parser": "2.6.0" - } - }, - "redis-commands": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.1.tgz", - "integrity": "sha1-gdgm9F+pyLIBH0zXoP5ZfSQdRCs=" - }, - "redis-mock": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/redis-mock/-/redis-mock-0.20.0.tgz", - "integrity": "sha1-lKOVhlurvOv1OLa1mUFyPkgHMBA=", - "dev": true - }, - "redis-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", - "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "dev": true, - "requires": { - "balanced-match": "0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "referrer-policy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", - "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - }, - "regenerator-transform": { + "node_modules/babel-plugin-transform-regenerator/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, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "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.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "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" - }, + "license": "BSD", "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-array-items": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.0.0.tgz", - "integrity": "sha1-B79CyzMvTPboXq2DteToltIyayE=" - }, - "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.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 - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "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": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.22.0.tgz", - "integrity": "sha1-uIOnacxKkJVx61AEs0TEPPflFZI=", - "dev": true, - "requires": { - "aws-sign": "0.3.0", - "cookie-jar": "0.3.0", - "forever-agent": "0.5.2", - "form-data": "0.0.8", - "hawk": "0.13.1", - "http-signature": "0.10.1", - "json-stringify-safe": "4.0.0", - "mime": "1.2.11", - "node-uuid": "1.4.8", - "oauth-sign": "0.3.0", - "qs": "0.6.6", - "tunnel-agent": "0.3.0" - }, + "license": "MIT", "dependencies": { - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", - "dev": true - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, - "qs": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=", - "dev": true - } + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "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.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", - "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=", - "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 - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "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, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "license": "MIT", + "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" } }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "node_modules/babel-preset-env/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, - "requires": { - "path-parse": "1.0.5" + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + }, + "bin": { + "browserslist": "cli.js" } }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true + "node_modules/babel-preset-env/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "restore-cursor": { + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", + "dev": true, + "license": "MIT", + "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-register/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.23.3 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. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/babel-register/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/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.23.3 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. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "license": "MIT", + "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": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "license": "MIT", + "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-traverse/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "license": "MIT" + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, - "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 - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "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, - "requires": { - "align-text": "0.1.4" + "license": "MIT", + "bin": { + "babylon": "bin/babylon.js" } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "requires": { - "glob": "7.1.2" + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "license": "MIT", + "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" } }, - "ripemd160": { + "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": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-auth": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" } }, - "run-async": { + "node_modules/basic-auth/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, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", + "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } - }, - "rxjs": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.4" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "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.15" - } - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "5.3.0" - } - }, - "scroll-to-anchor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/scroll-to-anchor/-/scroll-to-anchor-1.1.0.tgz", - "integrity": "sha1-yZuNLl2VBWdSeHyngJWrdbUgs/0=" - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "3.1.5", - "rimraf": "2.6.2", - "tmp": "0.0.30", - "xml2js": "0.4.17" + "license": "MIT", + "engines": { + "node": ">=8" }, - "dependencies": { - "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.2" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "selfsigned": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", - "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "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, - "requires": { - "node-forge": "0.6.33" + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" } }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "requires": { + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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, + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } + "ms": "2.0.0" } }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.2", - "mime-types": "2.1.17", - "parseurl": "1.3.2" - } - }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, - "set-blocking": { + "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "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 - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" } }, - "shebang-command": { + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "ISC" + }, + "node_modules/bowser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "license": "BSD-2-Clause" + }, + "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, + "license": "ISC" + }, + "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" - } - }, - "shelljs": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.0.4", - "rechoir": "0.6.2" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "sinon": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.1.2.tgz", - "integrity": "sha512-5uLBZPdCWl59Lpbf45ygKj7Z0LVol+ftBe7RDIXOQV/sF58pcFmbK8raA7bt6eljNuGnvBP+/ZxlicVn0emDjA==", - "dev": true, - "requires": { - "diff": "3.2.0", - "formatio": "1.2.0", - "lodash.get": "4.4.2", - "lolex": "2.3.0", - "nise": "1.2.0", - "supports-color": "4.5.0", - "type-detect": "4.0.5" - }, + "license": "MIT", "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "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" } }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "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, - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "sntp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", - "dev": true, - "requires": { - "hoek": "0.9.1" - }, + "license": "MIT", "dependencies": { - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", - "dev": true - } + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "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, - "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" - }, + "license": "MIT", "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "dev": true, - "requires": { - "debug": "2.6.9", - "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.2.0" - }, + "license": "MIT", "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - } + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, - "sort-keys": { + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/browserify-sign/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, + "license": "MIT" + }, + "node_modules/browserify-sign/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/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, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, - "requires": { - "is-plain-obj": "1.1.0" + "license": "MIT" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" + }, + "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": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } }, - "source-map": { + "node_modules/cacache/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, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/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, + "license": "ISC" + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "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/cacheable-request/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==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/caching-transform/node_modules/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, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/caching-transform/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-matcher": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-2.0.0.tgz", + "integrity": "sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-equal": "^1.0.0", + "espurify": "^2.0.0", + "estraverse": "^4.0.0" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==", + "license": "MIT" + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001715", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", + "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/choo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/choo/-/choo-7.1.0.tgz", + "integrity": "sha512-E4Gcpw1W0vACY3jkuwsVQUTQcriaIsLgS8DZJXzZ3iuJez8ZY3yoAdYwJlbLFL9OMglNhfrb/E/1HBcUeRuisA==", + "license": "MIT", + "dependencies": { + "document-ready": "^2.0.1", + "nanoassert": "^1.1.0", + "nanobus": "^4.4.0", + "nanocomponent": "^6.5.0", + "nanohref": "^3.0.0", + "nanohtml": "^1.1.0", + "nanolru": "^1.0.0", + "nanomorph": "^5.1.2", + "nanoquery": "^1.1.0", + "nanoraf": "^3.0.0", + "nanorouter": "^4.0.0", + "nanotiming": "^7.0.0", + "scroll-to-anchor": "^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, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "MIT", + "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/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cldr-core": { + "version": "35.1.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-35.1.0.tgz", + "integrity": "sha512-fTexZlDx+dbjaRNOEzRMqgg9/NxxtPtdIz6CClUNA8rTXBC2RgmP7iag3Z1WCVXqjlIEvWqUvN71c0onhficIA==" + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/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": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "license": "MIT", + "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/cli-truncate/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "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, + "license": "ISC", + "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.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/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, + "license": "MIT" + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "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/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "license": "MIT", + "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": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "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, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/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, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "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" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/concat-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, + "license": "MIT" + }, + "node_modules/concat-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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/configstore": { + "version": "5.0.0", + "resolved": "git+ssh://git@github.com/dannycoates/configstore.git#45c19536db34e7005a50b435582692886322ab36", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "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 }, - "source-map-support": { + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convict": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.4.tgz", + "integrity": "sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/convict-format-with-validator": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/convict-format-with-validator/-/convict-format-with-validator-6.2.0.tgz", + "integrity": "sha512-2LIL3yEZY27M13UHLIP4mGivusP9h2M+X4mYsRBLexwUp8+0sgVk2MgB2b2bnQwkn293lkbkxgdevzn0nZdyzQ==", + "license": "Apache-2.0", + "dependencies": { + "validator": "^13.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cp-file/node_modules/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, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cp-file/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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-env": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-mqpacker": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-mqpacker/-/css-mqpacker-7.0.0.tgz", + "integrity": "sha512-temVrWS+sB4uocE2quhW8ru/KguDmGhCU7zN213KxtDvWOH3WS/ZUStfpF4fdCT7W8fPpFrQdWRFqtFtPPfBLA==", + "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0", + "postcss": "^7.0.0" + }, + "bin": { + "mqpacker": "bin/mqpacker.js" + } + }, + "node_modules/css-mqpacker/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true, + "license": "ISC" + }, + "node_modules/css-mqpacker/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-mqpacker/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-rule-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", + "integrity": "sha512-qiio/Zkr8I19jh/XuzEkK8OKDQRTrEYaRyIHy4Bwh/tPUe0w8GcQs7r6x24Yc9lT+FbnZFYULxEIXCmaymguUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tokenize": "^1.0.1", + "duplexer2": "0.0.2", + "ldjson-stream": "^1.2.1", + "through2": "^0.6.3" + }, + "bin": { + "css-rule-stream": "index.js" + } + }, + "node_modules/css-rule-stream/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, + "license": "MIT" + }, + "node_modules/css-rule-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/css-rule-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-rule-stream/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tokenize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", + "integrity": "sha512-gLmmbJdwH9HLY4bcA17lnZ8GgPwEXRbvxBJGHnkiB6gLhRpTzjkjtMIvz7YORGW/Ptv2oMk8b5g+u7mRD6Dd7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^1.0.33" + } + }, + "node_modules/css-tokenize/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, + "license": "MIT" + }, + "node_modules/css-tokenize/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/css-tokenize/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "Apache-2.0" + }, + "node_modules/dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha512-APql/TZ6FdLEpf2z7/X2a2zyqK8juYtqaSVqxw9mYoQ64CXkfU15AeLh8pUszT8+fnYjgm6t0aIYpWKJbnLkuA==", + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dbug": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/dbug/-/dbug-0.4.2.tgz", + "integrity": "sha512-nrmsMK1msY0WXwfA2czrKVDgpIYJR2JJaq5cX4DwW7Rxm11nXHqouh9wmubEs44bHYxk8CqeP/Jx4URqSB961w==", + "license": "MPLv2.0" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/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, + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/del/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/del/node_modules/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, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "license": "MIT", + "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": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/document-ready": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/document-ready/-/document-ready-2.0.2.tgz", + "integrity": "sha512-C0ht1cPSVzL5ALWnLiXDGfQXbzmNMJrLQ7wzc2fwz5x/wlZun+uzTGJGdKgfygZQ9i7RNRxI+OV909zXKFPycA==", + "license": "MIT" + }, + "node_modules/doiuse": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.1.tgz", + "integrity": "sha512-TUpr1/YNg20IB09tZmwGCTsTQoxj8jUld/hUZprZMj8vj0VpAJySXEWCr8WMvqvgzk0/kG/FxeSMGKode4UjPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.16.1", + "caniuse-lite": "^1.0.30001179", + "css-rule-stream": "^1.1.0", + "duplexer2": "0.0.2", + "ldjson-stream": "^1.2.1", + "multimatch": "^5.0.0", + "postcss": "^8.2.4", + "source-map": "^0.7.3", + "through2": "^4.0.2", + "yargs": "^16.2.0" + }, + "bin": { + "doiuse": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/doiuse/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/doiuse/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, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "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, + "license": "MIT", + "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" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "license": "BSD", + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexer2/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, + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.140", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.140.tgz", + "integrity": "sha512-o82Rj+ONp4Ip7Cl1r7lrqx/pXhbp/lh9DpKcMNscFJdh8ebyRofnc7Sh01B4jx403RI0oqTBvlZ7OBIZLMr2+Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dev": true, + "license": "MIT", + "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/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, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enhanced-resolve/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/enhanced-resolve/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, + "license": "MIT" + }, + "node_modules/enhanced-resolve/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT" + }, + "node_modules/es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha512-sziUVwcvQ+lOsrTyUY0Q11ilAPj+dy7AQ1E1MgSaHTaaAFTffaa08QSlGNU61iyVaroyb6nYdBV6oD7nzn6i8w==", + "dev": true, + "license": "Apache 2", + "dependencies": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "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, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-stdin": "^6.0.0" + }, + "bin": { + "eslint-config-prettier-check": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=3.14.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", + "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^1.4.2", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-mocha": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz", + "integrity": "sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "ramda": "^0.27.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "eslint": ">= 4.0.0" + } + }, + "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-node": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", + "integrity": "sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-es": "^2.0.0", + "eslint-utils": "^1.4.2", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-security": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-regex": "^2.1.1" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/eslint/node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/eslint/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/espurify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.1.1.tgz", + "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-is-member-expression": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz", + "integrity": "sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==", + "license": "Apache-2.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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "license": "MIT", + "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/expand-brackets/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expose-loader": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz", + "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "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/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-loader": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-3.2.0.tgz", + "integrity": "sha512-MnbQPMQAvRfiObL2XRZy4xUnP2I9CFwVvz5VyyQ01+nTKoTKABtmpNShqusvxVe9i6UuUnF/Hn8s2zi/erGjcw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "babel-core": "^6.26.3", + "babel-plugin-add-module-exports": "^1.0.2", + "babel-preset-env": "^1.7.0", + "babel-runtime": "^6.26.0", + "btoa": "^1.2.1", + "loader-utils": "^1.1.0", + "resolve": "^1.8.1" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/extract-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/extract-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/extract-text-webpack-plugin": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz", + "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/extract-text-webpack-plugin/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/extract-text-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/extract-text-webpack-plugin/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", + "license": "Apache-2.0" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "deprecated": "This module is no longer supported.", + "dev": true, + "license": "ISC" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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, + "license": "MIT", + "optional": true + }, + "node_modules/fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-object": "~1.0.1", + "merge-descriptors": "~1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "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/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "license": "MIT", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "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": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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, + "license": "MIT" + }, + "node_modules/findup-sync/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "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": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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, + "license": "MIT", + "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": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/flush-write-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, + "license": "MIT" + }, + "node_modules/flush-write-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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/foreground-child/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, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/foreground-child/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/foreground-child/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/from2/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, + "license": "MIT" + }, + "node_modules/from2/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/fs-write-stream-atomic/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, + "license": "MIT" + }, + "node_modules/fs-write-stream-atomic/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-rev-sync": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-3.0.2.tgz", + "integrity": "sha512-Nd5RiYpyncjLv0j6IONy0lGzAqdRXUaBctuGBbrEA2m6Bn4iDrN/9MeQTXuiquw8AEKL9D2BW0nw5m/lQvxqnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "1.0.5", + "graceful-fs": "4.1.15", + "shelljs": "0.8.5" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "license": "Apache-2.0", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-auth-library/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==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-auth-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "deprecated": "Package is no longer maintained", + "license": "MIT", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "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/graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true, + "license": "ISC" + }, + "node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "license": "MIT", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "license": "MIT", + "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": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/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, + "license": "MIT" + }, + "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": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "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": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasha/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/helmet": { + "version": "3.23.3", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", + "integrity": "sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "dont-sniff-mimetype": "1.1.0", + "feature-policy": "0.3.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.10.0", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-csp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz", + "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==", + "license": "MIT", + "dependencies": { + "bowser": "2.9.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "license": "MIT", + "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": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/hpack.js/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, + "license": "MIT" + }, + "node_modules/hpack.js/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha512-TaZpC6cO/k3DFsjfzz1LnOobbVSq+J+7WpJxrVtN4L+8+BPQj8iBDRB2Dx49613N+e7/+ZSQ9ra+xZm7Blf4wg==", + "license": "MIT" + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true, + "license": "MIT" + }, + "node_modules/hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/html-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http_ece": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/http_ece/-/http_ece-1.2.1.tgz", + "integrity": "sha512-+tzLoMYgXvicu60sVFoswTiu6BiQ6EX3DORRJQ3W2dNpNWCyZ3tcmRFZZ3jgVyw8ziWUCeUARKCkYDY6JgFx+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/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, + "license": "MIT", + "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/http-proxy-middleware/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "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/http-proxy-middleware/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/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, + "license": "MIT" + }, + "node_modules/http-proxy-middleware/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/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, + "license": "MIT", + "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/http-proxy-middleware/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": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "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": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/husky": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-3.1.0.tgz", + "integrity": "sha512-FJkPoHHB+6s4a+jwPqBudBDvYZsoQW5/HBuMSehC8qDiCe50kpcxeqFoDSlow+9I6wg47YxBoT3WxaURlrDIIQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "ci-info": "^2.0.0", + "cosmiconfig": "^5.2.1", + "execa": "^1.0.0", + "get-stdin": "^7.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "read-pkg": "^5.2.0", + "run-node": "^1.0.0", + "slash": "^3.0.0" + }, + "bin": { + "husky-run": "run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=8.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/husky" + } + }, + "node_modules/husky/node_modules/get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hyperscript-attribute-to-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyperscript-attribute-to-property/-/hyperscript-attribute-to-property-1.0.2.tgz", + "integrity": "sha512-oerMul16jZCmrbNsUw8QgrtDzF8lKgFri1bKQjReLw1IhiiNkI59CWuzZjJDGT79UQ1YiWqXhJMv/tRMVqgtkA==", + "license": "MIT" + }, + "node_modules/hyperx": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/hyperx/-/hyperx-2.5.4.tgz", + "integrity": "sha512-iOkSh7Yse7lsN/B9y7OsevLWjeXPqGuHQ5SbwaiJM5xAhWFqhoN6erpK1dQsS12OFU36lyai1pnx1mmzWLQqcA==", + "license": "BSD", + "dependencies": { + "hyperscript-attribute-to-property": "^1.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "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==", + "license": "ISC" + }, + "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, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/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, + "license": "MIT", + "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/inquirer/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/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, + "license": "MIT" + }, + "node_modules/inquirer/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/intel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/intel/-/intel-1.2.0.tgz", + "integrity": "sha512-CUDyAtEeEeDo5YtwANOuDhxuFEOgInHvbMrBbhXCD4tAaHuzHM2llevtTeq2bmP8Jf7NkpN305pwDncRmhc1Wg==", + "license": "MPL-2.0", + "dependencies": { + "chalk": "^1.1.0", + "dbug": "~0.4.2", + "stack-trace": "~0.0.9", + "strftime": "~0.10.0", + "symbol": "~0.3.1", + "utcstring": "~0.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/intel/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/intel/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/intel/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "license": "MIT", + "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/intel/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/intel/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/intl-pluralrules": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/intl-pluralrules/-/intl-pluralrules-1.3.1.tgz", + "integrity": "sha512-sNYPls1Q4fyN0EGLFVJ7TIuaMWln01LupLozfIBt69rHK0DHehghMSz6ejfnSklgRddnyQSEaQPIU6d9TCKH3w==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "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": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-attribute": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-attribute/-/is-boolean-attribute-0.0.1.tgz", + "integrity": "sha512-0kXT52Scokg2Miscvsn5UVqg6y1691vcLJcagie1YHJB4zOEuAhMERLX992jtvaStGy2xQTqOtJhvmG/MK1T5w==", + "license": "MIT" + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable/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, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "symbol-observable": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/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, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/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, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/istanbul-lib-source-maps/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.6.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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, + "license": "MIT" + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ldjson-stream": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz", + "integrity": "sha512-xw/nNEXafuPSLu8NjjG3+atVVw+8U1APZAQylmwQn19Hgw6rC7QjHvP6MupnHWCrzSm9m0xs5QWkCLuRvBPjgQ==", + "dev": true, + "license": "BSD", + "dependencies": { + "split2": "^0.2.1", + "through2": "^0.6.1" + } + }, + "node_modules/ldjson-stream/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, + "license": "MIT" + }, + "node_modules/ldjson-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ldjson-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ldjson-stream/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.5.0.tgz", + "integrity": "sha512-nawMob9cb/G1J98nb8v3VC/E8rcX1rryUYXVZ69aT9kde6YWX+uvNOEHY5yf2gcWcTJGiD0kqXmCnS3oD75GIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "commander": "^2.20.0", + "cosmiconfig": "^5.2.1", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "del": "^5.0.0", + "execa": "^2.0.3", + "listr": "^0.14.3", + "log-symbols": "^3.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "string-argv": "^0.3.0", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged" + } + }, + "node_modules/lint-staged/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, + "license": "MIT" + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/lint-staged/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, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "listr": "^0.14.2" + } + }, + "node_modules/listr-update-renderer/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "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/listr-update-renderer/node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.23.2.tgz", + "integrity": "sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/memory-fs/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, + "license": "MIT" + }, + "node_modules/memory-fs/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/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, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/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, + "license": "ISC" + }, + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "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, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "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, + "license": "ISC" + }, + "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": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.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, + "license": "ISC" + }, + "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, + "license": "MIT", + "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, + "license": "ISC" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mississippi/node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/mississippi/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/mississippi/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, + "license": "MIT" + }, + "node_modules/mississippi/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/mocha/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, + "license": "Python-2.0" + }, + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "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/mocha/node_modules/chalk/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/mocha/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, + "license": "MIT" + }, + "node_modules/mocha/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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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/mocha/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/modern-normalize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", + "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/mozlog": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-3.0.2.tgz", + "integrity": "sha512-nu2pJV98gT0KFWE3sIHopR+QcSxZ2vCgnV+dvAAcCcOLjRoT3obtcINS4Vl0oc7zGEdhm0/MfE7D2MJGIwD/Ag==", + "license": "MPL-2.0", + "dependencies": { + "intel": "^1.2.0", + "merge": "^2.1.1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/mutexify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz", + "integrity": "sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==", + "license": "MIT", + "dependencies": { + "queue-tick": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nanoassert": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", + "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==", + "license": "ISC" + }, + "node_modules/nanobench": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nanobench/-/nanobench-2.1.1.tgz", + "integrity": "sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^0.1.2", + "chalk": "^1.1.3", + "mutexify": "^1.1.0", + "pretty-hrtime": "^1.0.2" + }, + "bin": { + "nanobench": "run.js", + "nanobench-compare": "compare.js" + } + }, + "node_modules/nanobench/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanobench/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanobench/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "license": "MIT", + "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/nanobench/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanobench/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nanobus": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.5.0.tgz", + "integrity": "sha512-7sBZo9wthqNJ7QXnfVXZL7fkKJLN55GLOdX+RyZT34UOvxxnFtJe/c7K0ZRLAKOvaY1xJThFFn0Usw2H9R6Frg==", + "license": "MIT", + "dependencies": { + "nanoassert": "^1.1.0", + "nanotiming": "^7.2.0", + "remove-array-items": "^1.0.0" + } + }, + "node_modules/nanocomponent": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/nanocomponent/-/nanocomponent-6.6.0.tgz", + "integrity": "sha512-9vTL0XzIUcdbBbWRebSkaj8xmhiXq7sDrMvu0Yz7nUc0U30QJLYL+t5eaLDsX1f0GkFzw3v2vV0cPz8LjM33nA==", + "license": "MIT", + "dependencies": { + "global": "^4.3.1", + "nanoassert": "^2.0.0", + "nanomorph": "^5.1.2", + "nanotiming": "^7.2.0", + "on-load": "^4.0.2" + } + }, + "node_modules/nanocomponent/node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" + }, + "node_modules/nanohref": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nanohref/-/nanohref-3.1.0.tgz", + "integrity": "sha512-2DyDzc8B/29xRCDprTt8UscdsF3E/axcHQMIBFR+WM1cj1ku7hqxQWwMYDOajfEuv5fZdVTh+NBuFronappMQQ==", + "license": "MIT", + "dependencies": { + "nanoassert": "^1.1.0" + } + }, + "node_modules/nanohtml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/nanohtml/-/nanohtml-1.10.0.tgz", + "integrity": "sha512-r/3AQl+jxAxUIJRiKExUjBtFcE1cm4yTOsTIdVqqlxPNtBxJh522ANrcQYzdNHhPzbPgb7j6qujq6eGehBX0kg==", + "license": "MIT", + "dependencies": { + "acorn-node": "^1.8.2", + "camel-case": "^3.0.0", + "convert-source-map": "^1.5.1", + "estree-is-member-expression": "^1.0.0", + "hyperx": "^2.5.0", + "is-boolean-attribute": "0.0.1", + "nanoassert": "^1.1.0", + "nanobench": "^2.1.0", + "normalize-html-whitespace": "^0.2.0", + "through2": "^2.0.3", + "transform-ast": "^2.4.0" + } + }, + "node_modules/nanohtml/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanolru": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nanolru/-/nanolru-1.0.0.tgz", + "integrity": "sha512-GyQkE8M32pULhQk7Sko5raoIbPalAk90ICG+An4fq6fCsFHsP6fB2K46WGXVdoJpy4SGMnZ/EKbo123fZJomWg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "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, + "license": "MIT", + "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/nanomorph": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/nanomorph/-/nanomorph-5.4.3.tgz", + "integrity": "sha512-uPP5y0x21KISffZCKHh1A0QW0RHZFQS0BR7LetlHBlay6UWAbjwhjiJTxOO6JeMHko5Cigl617zFoGrYFJ8ZLg==", + "license": "MIT", + "dependencies": { + "nanoassert": "^1.1.0" + } + }, + "node_modules/nanoquery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/nanoquery/-/nanoquery-1.3.0.tgz", + "integrity": "sha512-eZv8Ct2PZn/CdOmD2BgLNwjhhPmxg4tXhygp0roaRer5RqBFB0gm0wHIb5VZcL0CS0r+yWQ1kBVYG7S1jUyG0A==", + "license": "MIT", + "dependencies": { + "nanoassert": "^1.1.0" + } + }, + "node_modules/nanoraf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nanoraf/-/nanoraf-3.1.0.tgz", + "integrity": "sha512-7Emv5Pv/fvgVK6yrud93WsdO4d3AUqLoP38Cpn0chYe+tT/wu25Yl2guxBjE3ngRrI5Yd9DxaTCgCFi1uq7hgQ==", + "license": "MIT", + "dependencies": { + "nanoassert": "^1.1.0" + } + }, + "node_modules/nanorouter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nanorouter/-/nanorouter-4.0.0.tgz", + "integrity": "sha512-HQ6VeNpFhIx/vKjqQiVUodeu0SvRb6ekkmkzf4pXMjkAZy0RS2jsIWZmzob9s6ORW0dfhYHpL7+w7T+bE5kNCQ==", + "dependencies": { + "nanoassert": "^1.1.0", + "wayfarer": "^7.0.0" + } + }, + "node_modules/nanoscheduler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/nanoscheduler/-/nanoscheduler-1.0.3.tgz", + "integrity": "sha512-jBbrF3qdU9321r8n9X7yu18DjP31Do2ItJm3mWrt90wJTrnDO+HXpoV7ftaUglAtjgj9s+OaCxGufbvx6pvbEQ==", + "license": "Apache-2.0", + "dependencies": { + "nanoassert": "^1.1.0" + } + }, + "node_modules/nanotiming": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/nanotiming/-/nanotiming-7.3.1.tgz", + "integrity": "sha512-l3lC7v/PfOuRWQa8vV29Jo6TG10wHtnthLElFXs4Te4Aas57Fo4n1Q8LH9n+NDh9riOzTVvb2QNBhTS4JUKNjw==", + "license": "MIT", + "dependencies": { + "nanoassert": "^1.1.0", + "nanoscheduler": "^1.0.2" + } + }, + "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, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/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, + "license": "MIT" + }, + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "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-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/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, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/node-libs-browser/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/node-libs-browser/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/node-libs-browser/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, + "license": "MIT" + }, + "node_modules/node-libs-browser/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-libs-browser/node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/node-libs-browser/node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-html-whitespace": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", + "integrity": "sha512-5CZAEQ4bQi8Msqw0GAT6rrkrjNN4ZKqAG3+jJMwms4O6XoMvh6ekwOueG4mRS1LbPUR1r9EdnhxxfpzMTOdzKw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "BSD-2-Clause", + "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-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "BSD-2-Clause", + "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": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/nyc/node_modules/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, + "license": "MIT" + }, + "node_modules/nyc/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/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, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/nyc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nyc/node_modules/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/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, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/nyc/node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + } + }, + "node_modules/nyc/node_modules/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, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "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": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "license": "MIT", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/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, + "license": "MIT" + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "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": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-load": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/on-load/-/on-load-4.0.2.tgz", + "integrity": "sha512-ZBikjS30x2cPal7Ov0dwssra2mC+agK0aDv+0SxR0CzWTzyOOWetG75yEH3Z2vww7F6/mI9VXjkTFjDcVOUEKw==", + "license": "MIT", + "dependencies": { + "global": "^4.3.2", + "nanoassert": "^1.1.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "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, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "license": "MIT", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "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/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate/node_modules/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "(MIT AND Zlib)" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parallel-transform/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/parallel-transform/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, + "license": "MIT" + }, + "node_modules/parallel-transform/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "license": "MIT", + "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": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "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": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.36.tgz", + "integrity": "sha512-gMKUzCoP+feA7t45moaSx7UniU7PgGN3hA8acAB+3Qn7/js0/lJ07fYZlxt9riE9S3myyxDCyAFzSrLlta0c9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "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": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "dev": true, + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "dev": true, + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "MIT" + }, + "node_modules/proxyquire": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "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/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.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, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/pumpify/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, + "license": "MIT" + }, + "node_modules/pumpify/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, + "node_modules/puppeteer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", + "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "deprecated": "< 22.8.2 is no longer supported", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=8.16.0" + } + }, + "node_modules/puppeteer/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/puppeteer/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/purgecss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.1.3.tgz", + "integrity": "sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^8.0.0", + "glob": "^7.1.7", + "postcss": "^8.3.5", + "postcss-selector-parser": "^6.0.6" + }, + "bin": { + "purgecss": "bin/purgecss.js" + } + }, + "node_modules/purgecss/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "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": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "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, + "license": "MIT" + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.3.0" + } + }, + "node_modules/raw-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/raw-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/recast/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/redis": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "license": "MIT", + "dependencies": { + "denque": "^1.5.0", + "redis-commands": "^1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-redis" + } + }, + "node_modules/redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==", + "license": "MIT" + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-mock": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/redis-mock/-/redis-mock-0.47.0.tgz", + "integrity": "sha512-Kbyy7xB+Sj+fPZlwtJGIVus8QfPDFxXi1d2YJ0XXxKEIPN8ciSUFt45uw8G/gGfNm+BsT3bcvBp7D+7du7s/9Q==", + "license": "MIT" + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "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, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/remove-array-items": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.1.1.tgz", + "integrity": "sha512-MXW/jtHyl5F1PZI7NbpS8SOtympdLuF20aoWJT5lELR1p/HJDd5nqW8Eu9uLh/hCRY3FgvrIT5AwDCgBODklcA==", + "license": "MIT" + }, + "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": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "license": "MIT", + "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": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "ISC" + }, + "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, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "MIT" + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/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, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "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/resolve-dir/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz", + "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "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, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true, + "license": "MIT", + "bin": { + "run-node": "run-node" + }, + "engines": { + "node": ">=4" + } + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/script-loader": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz", + "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "raw-loader": "~0.5.1" + } + }, + "node_modules/script-loader/node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", + "dev": true + }, + "node_modules/scroll-to-anchor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/scroll-to-anchor/-/scroll-to-anchor-1.1.0.tgz", + "integrity": "sha512-mehoaNODRUsESpdiW8g5T+JIRvkoe272w5ZrEU+SHS9vosIPxn8WIGjvhIO8cUUyKInsYZYxNEzKg87YZkLByQ==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selenium-standalone": { + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.24.0.tgz", + "integrity": "sha512-Dun2XgNAgCfJNrrSzuv7Z7Wj7QTvBKpqx0VXFz7bW9T9FUe5ytzgzoCEEshwDVMh0Dv6sCgdZg7VDhM/q2yPPQ==", + "license": "MIT", + "dependencies": { + "commander": "^2.20.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.1", + "got": "^11.8.2", + "lodash.mapvalues": "^4.6.0", + "lodash.merge": "^4.6.2", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "progress": "2.0.3", + "tar-stream": "2.2.0", + "which": "^2.0.2", + "yauzl": "^2.10.0" + }, + "bin": { + "selenium-standalone": "bin/selenium-standalone", + "start-selenium": "bin/start-selenium" + } + }, + "node_modules/selenium-standalone/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==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/selfsigned/node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/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, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "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, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "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, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "deprecated": "16.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/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, + "license": "MIT" + }, + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "MIT", + "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, - "requires": { - "source-map": "0.5.7" - }, + "license": "MIT", "dependencies": { - "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": "^0.5.6" } }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } + "license": "MIT" }, - "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 + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" }, - "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 - }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "node_modules/spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", "dev": true, - "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.0.20" - } - }, - "spdy-transport": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", - "dev": true, - "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1", - "wbuf": "1.7.2" - }, + "license": "ISC", "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" } }, - "specificity": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "node_modules/spawn-wrap/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "requires": { - "through": "2.3.8" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "split2": { + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/spawn-wrap/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "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, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "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, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz", - "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=", + "integrity": "sha512-D/oTExYAkC9nWleOCTOyNmAuzfAT/6rHGBA9LIK7FVnGo13CSvrKCUzKenwH6U1s2znY9MqH6v0UQTEDa3vJmg==", "dev": true, - "requires": { - "through2": "0.6.5" - }, + "license": "ISC", "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } + "through2": "~0.6.1" } }, - "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=" - }, - "staged-git-files": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-0.0.4.tgz", - "integrity": "sha1-15fhtVHKemOd7AI33G60u5vhfTU=", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "node_modules/split2/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, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - }, + "license": "MIT" + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "0.1.1" - } - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - }, - "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } - } - }, - "stream-to-observable": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", - "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", - "dev": true - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "strftime": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", - "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1" - } - }, - "string_decoder": { + "node_modules/split2/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "stringify-object": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.1.tgz", - "integrity": "sha512-jPcQYw/52HUPP8uOE4kkjxl5bB9LfHkKCTptIk3qw7ozP5XMIMlHMLjt00GGSwW6DJAf/njY5EU6Vpwl4LlBKQ==", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "2.0.1", - "is-obj": "1.0.1", - "is-regexp": "1.0.0" + "license": "MIT" + }, + "node_modules/split2/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" } }, - "strip-bom": { + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "license": "MIT", + "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": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/stream-browserify/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, + "license": "MIT" + }, + "node_modules/stream-browserify/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "license": "MIT", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/stream-http/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, + "license": "MIT" + }, + "node_modules/stream-http/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, + "node_modules/strftime": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.3.tgz", + "integrity": "sha512-DZrDUeIF73eKJ4/GgGuv8UHWcUQPYDYfDeQFj3jrx+JZl6GQE656MbHIpvbo4mEG9a5DgS8GRCc5DxJXD2udDQ==", + "license": "MIT", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true, + "license": "CC0-1.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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "strip-eof": { + "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "strip-indent": { + "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "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 + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } }, - "style-search": { + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "license": "MIT" + }, + "node_modules/style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "stylelint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-8.2.0.tgz", - "integrity": "sha512-57JWIz/1Uh9ehZMZyAqlFC0EDfQrMXCH8yqt8ZuJQQvV3LBKgAM/JYd+CWi1hC4eJtRODSPbIIBYKdGjkPZdMg==", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true, - "requires": { - "autoprefixer": "7.1.6", - "balanced-match": "1.0.0", - "chalk": "2.3.0", - "cosmiconfig": "3.1.0", - "debug": "3.1.0", - "execall": "1.0.0", - "file-entry-cache": "2.0.0", - "get-stdin": "5.0.1", - "globby": "6.1.0", - "globjoin": "0.1.4", - "html-tags": "2.0.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "known-css-properties": "0.4.1", - "lodash": "4.17.4", - "log-symbols": "2.1.0", - "mathml-tag-names": "2.0.1", - "meow": "3.7.0", - "micromatch": "2.3.11", - "normalize-selector": "0.2.0", - "pify": "3.0.0", - "postcss": "6.0.14", - "postcss-less": "1.1.2", - "postcss-media-query-parser": "0.2.3", - "postcss-reporter": "5.0.0", - "postcss-resolve-nested-selector": "0.1.1", - "postcss-safe-parser": "3.0.1", - "postcss-scss": "1.0.2", - "postcss-selector-parser": "2.2.3", - "postcss-value-parser": "3.3.0", - "resolve-from": "4.0.0", - "specificity": "0.3.2", - "string-width": "2.1.1", - "style-search": "0.1.0", - "sugarss": "1.0.1", - "svg-tags": "1.0.0", - "table": "4.0.2" - }, + "license": "ISC" + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "cosmiconfig": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz", - "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.10.0", - "parse-json": "3.0.0", - "require-from-string": "2.0.1" - } - }, - "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" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "parse-json": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-3.0.0.tgz", - "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "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 - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "stylelint-config-recommended": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-1.0.0.tgz", - "integrity": "sha512-wp50rY5A6MWndIIkKNNzJv/S58lTvqQEriS7CXTBN1SwtoY/YjHhCLIOkjundLnUWMvJJska6GnciLbs76UQrA==", - "dev": true - }, - "stylelint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-17.0.0.tgz", - "integrity": "sha512-G8jMZ0KsaVH7leur9XLZVhwOBHZ2vdbuJV8Bgy0ta7/PpBhEHo6fjVDaNchyCGXB5sRcWVq6O9rEU/MvY9cQDQ==", - "dev": true, - "requires": { - "stylelint-config-recommended": "1.0.0" - } - }, - "stylelint-no-unsupported-browser-features": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-1.0.1.tgz", - "integrity": "sha512-6uaoXV/WA5BLKo9bbjERFE3oAOA0UY4FgGDaQWarV9x3qrDLS2o2SJqk0TaxwAIAgROwj9RhbQ2FF1QKRzZBNw==", - "dev": true, - "requires": { - "doiuse": "4.0.0", - "lodash": "4.17.4", - "postcss": "6.0.14", - "stylelint": "8.2.0" - } - }, - "sugarss": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", - "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", - "dev": true, - "requires": { - "postcss": "6.0.14" - } - }, - "superagent": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.1.tgz", - "integrity": "sha512-VMBFLYgFuRdfeNQSMLbxGSLfmXL/xc+OO+BZp41Za/NRDBet/BNbkRJrYzCUu0u4GU0i/ml2dtT8b9qgkw9z6Q==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.3.3" + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" }, - "dependencies": { - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "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" - } - }, - "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 - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "supertest": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", - "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", + "node_modules/stylelint": { + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", + "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", "dev": true, - "requires": { - "methods": "1.1.2", - "superagent": "3.8.1" + "license": "MIT", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^7.1.0", + "css-functions-list": "^3.1.0", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^6.0.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.2.0", + "ignore": "^5.2.1", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.26.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.19", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^2.3.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^4.0.2" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" } }, - "supports-color": { + "node_modules/stylelint-config-recommended": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-8.0.0.tgz", + "integrity": "sha512-IK6dWvE000+xBv9jbnHOnBq01gt6HGVB2ZTsot+QsMpe82doDQ9hvplxfv4YnpEuUwVGGd9y6nbaAnhrjcxhZQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "stylelint": "^14.8.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-26.0.0.tgz", + "integrity": "sha512-hUuB7LaaqM8abvkOO84wh5oYSkpXgTzHu2Zza6e7mY+aOmpNTjoFBRxSLlzY0uAOMWEFx0OMKzr+reG1BUtcqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^8.0.0" + }, + "peerDependencies": { + "stylelint": "^14.9.0" + } + }, + "node_modules/stylelint-no-unsupported-browser-features": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-5.0.4.tgz", + "integrity": "sha512-05DeIsWv262DXTSWhbQURDOxno9Tsu81sNnOpG1gD39WT+NNsEjhR2BQvwvNpZ/J/lS8vHxjhHULU2OGKSswvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "doiuse": "^4.4.1", + "lodash": "^4.17.15", + "postcss": "^8.4.16" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "stylelint": ">=13.0.0" + } + }, + "node_modules/stylelint/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/stylelint/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" }, - "svg-tags": { + "node_modules/stylelint/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/stylelint/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, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/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, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/stylelint/node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/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, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/stylelint/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dev": true, - "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.1", - "whet.extend": "0.9.9" + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" } }, - "symbol": { + "node_modules/svgo-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-3.0.3.tgz", + "integrity": "sha512-6YdWYge3h0aCb8xHvPhGP4hofIU1OWfZm0I8bteab7hddeRN4fl3aIkN8Z/ZB/ji9QrMOd6C8wT8F1p31GUwuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.3", + "svgo": "^2.8.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.3.1.tgz", - "integrity": "sha1-tvmpANSWpX8CQI8iGYwQndoGMEE=" + "integrity": "sha512-SxMrE6uv9zhnBmTCpZna1u0TcZix1k2QASZ/DpF13rAo+0Ts40faFYsMTuAirgvbbjHw1byhJ949/fP20XzVZA==", + "license": "MPLv2.0" }, - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true, - "requires": { - "ajv": "5.3.0", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } }, - "testpilot-ga": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/testpilot-ga/-/testpilot-ga-0.3.0.tgz", - "integrity": "sha512-z4PJbw3KK0R0iflA+u/3BhWZrtsLHLu+0rMviMd8H1wp8qPV0rggNBjsKckBJCcXq4uEjXETGZzApHH7Tovpzw==", - "dev": true + "node_modules/table/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true + "node_modules/table/node_modules/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, + "license": "MIT" }, - "text-table": { + "node_modules/table/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tailwindcss": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", + "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "arg": "^5.0.1", + "bytes": "^3.0.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color": "^4.0.1", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "glob-parent": "^6.0.1", + "html-tags": "^3.1.0", + "is-color-stop": "^1.1.0", + "is-glob": "^4.0.1", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.1.0", + "node-emoji": "^1.11.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^3.0.3", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.6", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "purgecss": "^4.0.3", + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0", + "tmp": "^0.2.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tailwindcss/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, + "license": "MIT", + "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/tailwindcss/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tailwindcss/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, + "license": "MIT" + }, + "node_modules/tailwindcss/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwindcss/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "ISC" + }, + "node_modules/teeny-request": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz", + "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==", + "license": "Apache-2.0", + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.6.tgz", + "integrity": "sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/terser/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, + "license": "MIT" + }, + "node_modules/terser/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/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, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/test-exclude/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/test-exclude/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/test-exclude/node_modules/read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - }, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", "dependencies": { - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "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.1" - } - } + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", - "dev": true + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "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" + } }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", - "dev": true + "node_modules/through2/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==", + "license": "MIT" }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "node_modules/through2/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } }, - "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true, - "requires": { - "setimmediate": "1.0.5" + "license": "MIT" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" } }, - "tmp": { + "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "requires": { - "os-tmpdir": "1.0.2" + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "to-arraybuffer": { + "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true, + "license": "MIT" }, - "to-fast-properties": { + "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 + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "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": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "trim-right": { + "node_modules/to-object-path/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, + "license": "MIT" + }, + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/transform-ast": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/transform-ast/-/transform-ast-2.4.4.tgz", + "integrity": "sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==", + "license": "MIT", + "dependencies": { + "acorn-node": "^1.3.0", + "convert-source-map": "^1.5.1", + "dash-ast": "^1.0.0", + "is-buffer": "^2.0.0", + "magic-string": "^0.23.2", + "merge-source-map": "1.0.4", + "nanobench": "^2.1.1" + } + }, + "node_modules/transform-ast/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/transform-ast/node_modules/merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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 + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" }, - "tty-browserify": { + "node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true, + "license": "MIT" }, - "tunnel-agent": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", - "integrity": "sha1-rWgbaPUyGtKCfEz7G31d8s/pQu4=", - "dev": true - }, - "type-check": { + "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "requires": { - "prelude-ls": "1.1.2" + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", - "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", - "dev": true + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { "media-typer": "0.3.0", - "mime-types": "2.1.17" + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typedarray": { + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.8.tgz", - "integrity": "sha512-1lnTkrJWw6LJ7n43ZyYVXx0eN2PQh0c3Inb0nY/vj5fNfwykXQFif2kvNgm/Bf0ClLA8R6SKaMHFzo9io4Q+vg==", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, - "requires": { - "commander": "2.11.0", - "source-map": "0.6.1" - } + "license": "MIT" }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.2" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "node_modules/ua-parser-js": { + "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } + { + "type": "paypal", + "url": "https://paypal.me/faisalman" }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } - } - }, - "unassert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.5.1.tgz", - "integrity": "sha1-y8iOw4dBfFpeTALTzQe+mL11/3Y=", - "dev": true, - "requires": { - "acorn": "4.0.13", - "call-matcher": "1.0.1", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "object-assign": "4.1.1" + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "engines": { + "node": "*" } }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, - "requires": { - "macaddress": "0.2.8" + "license": "BSD-2-Clause", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "uniqs": { + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unassert": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.6.0.tgz", + "integrity": "sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.0.0", + "call-matcher": "^2.0.0", + "deep-equal": "^1.0.0", + "espurify": "^2.0.1", + "estraverse": "^4.1.0", + "esutils": "^2.0.2", + "object-assign": "^4.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "universalify": { + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "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/is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "unpipe": { + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "upper-case": { + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "license": "MIT", + "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": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "license": "MIT", + "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": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "license": "MIT", + "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": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "license": "MIT" }, - "url": { + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true, + "license": "MIT" + }, + "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "license": "MIT", + "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" } }, - "url-parse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", - "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "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, - "requires": { - "querystringify": "1.0.0", - "requires-port": "1.0.0" - }, + "license": "MIT", "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", - "dev": true - } + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "utcstring": { + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/utcstring": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/utcstring/-/utcstring-0.1.0.tgz", - "integrity": "sha1-Qw/VEKt/yVtdWRDJAteYgMIIQ2s=" + "integrity": "sha512-1EpWQ6CECkoys7aX3LImrFo4nYIigY2RQHJTvgzZQCB4/oA6jJvTLTcgilTxX57GrSHDIVMtGwYd+SujGJvvyw==" }, - "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" - }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "util-deprecate": { + "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 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "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==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "val-loader": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/val-loader/-/val-loader-1.0.2.tgz", - "integrity": "sha1-eQkZgJOzfLoKlr9PbSnelw0JnT0=", + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true, - "requires": { - "loader-utils": "1.1.0" - } + "license": "MIT" }, - "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=", + "node_modules/val-loader": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/val-loader/-/val-loader-2.1.2.tgz", + "integrity": "sha512-slp7F4QaEE3h2dCKb28ulCkgVYqpbTcx9u/8or+lpWGOn5v7+hrQXZ+dGbblrIf2LBkVZBCiinLh7DgYO4Ds5g==", "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "validator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-7.2.0.tgz", - "integrity": "sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg==" - }, - "varify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/varify/-/varify-0.2.0.tgz", - "integrity": "sha1-GR2p/p3EzWjQ0USY1OKpEP9OZRY=", - "optional": true, - "requires": { - "redeyed": "1.0.1", - "through": "2.3.8" + "node_modules/val-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "vary": { + "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, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "vendors": { + "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, + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/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, + "license": "ISC", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/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": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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, + "license": "MIT", + "optional": 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/watchpack-chokidar2/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "license": "MIT", + "optional": 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/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "optional": 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/watchpack-chokidar2/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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": "Upgrade to fsevents v2 to mitigate potential security issues", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, + "license": "MIT", + "optional": true, "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - } - } - }, - "wayfarer": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/wayfarer/-/wayfarer-6.6.2.tgz", - "integrity": "sha512-jwIufUN6EYfMeCJYBA8r0YytqHaSGACLtOddMeBtdq5gTo2F2XgK+t7eEXSPUBF9vm+hdI/iPOtSz1EJOd01dQ==", - "requires": { - "xtend": "4.0.1" - } - }, - "wbuf": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", - "dev": true, - "requires": { - "minimalistic-assert": "1.0.0" - } - }, - "webpack": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", - "dev": true, - "requires": { - "acorn": "5.2.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.3.0", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.0.4", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.0.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.0.2", - "yargs": "8.0.2" + "binary-extensions": "^1.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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, + "license": "MIT", + "optional": true + }, + "node_modules/watchpack-chokidar2/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", - "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", - "dev": true, - "requires": { - "memory-fs": "0.4.1", - "mime": "1.4.1", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" - } - }, - "webpack-dev-server": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.1.tgz", - "integrity": "sha512-qFKs4Wg6JI6FkAQ6WFqeDCCxXEBLsDHkqJB3f9tmlqx8C68Y9vQWwcaMT4Q9H8WF32Q6QUNmgK4qQkdHfXvj/g==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.1", - "connect-history-api-fallback": "1.5.0", - "del": "3.0.0", - "express": "4.16.2", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "internal-ip": "1.2.0", - "ip": "1.1.5", - "loglevel": "1.5.1", - "opn": "5.1.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.1", - "serve-index": "1.9.1", - "sockjs": "0.3.18", - "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "4.5.0", - "webpack-dev-middleware": "1.12.0", - "yargs": "6.6.0" + "kind-of": "^3.0.2" }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" - } - }, - "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.1.0", - "pinkie-promise": "2.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "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.1" - } - }, - "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.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "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 - } - } - }, - "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" - } - }, - "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.1" - } - }, - "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.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "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.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.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.1.2", - "read-pkg": "1.1.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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "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.1" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "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 - }, - "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.2.0", - "get-caller-file": "1.0.2", - "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.1" - } - }, - "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" - } - } + "engines": { + "node": ">=0.10.0" } }, - "webpack-manifest-plugin": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", - "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", + "node_modules/watchpack-chokidar2/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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "requires": { - "fs-extra": "0.30.0", - "lodash": "4.17.4" - }, + "license": "MIT", + "optional": true, "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "webpack-sources": { + "node_modules/watchpack-chokidar2/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, + "license": "MIT", + "optional": 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/watchpack-chokidar2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "optional": 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/watchpack-chokidar2/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, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/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, + "license": "MIT", + "optional": true + }, + "node_modules/watchpack-chokidar2/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, + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/watchpack-chokidar2/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": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wayfarer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wayfarer/-/wayfarer-7.0.1.tgz", + "integrity": "sha512-yf+kAlOYnJRjLxflLy+1+xEclb6222EAVvAjSY+Yz2qAIDrXeN5wLl/G302Mwv3E0KMg1HT/WDGsvSymX0U7Rw==", + "license": "MIT", + "dependencies": { + "nanoassert": "^1.1.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webcrypto-core": { + "version": "0.1.19", + "resolved": "git+ssh://git@github.com/dannycoates/webcrypto-core.git#8e0152a66d3ae6329cf080ccb3085eb06637070f", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.7.1" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.38.0.tgz", + "integrity": "sha512-lbuFsVOq8PZY+1Ytz/mYOvYOo+d4IJ31hHk/7iyoeWtwN33V+5HYotSH+UIb9tq914ey0Hot7z6HugD+je3sWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "4.x.x" + } + }, + "node_modules/webpack-cli/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/webpack-cli/node_modules/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, + "license": "MIT" + }, + "node_modules/webpack-cli/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.2.tgz", - "integrity": "sha512-Y7UddMCv6dGjy81nBv6nuQeFFIt5aalHm7uyDsAsW86nZwfOVPGRr3XMjEQLaT+WKo8rlzhC9qtbJvYKLtAwaw==", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "webpack-unassert-loader": { + "node_modules/webpack-cli/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-cli/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-cli/node_modules/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/webpack-cli/node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/webpack-cli/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + } + }, + "node_modules/webpack-cli/node_modules/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, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/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": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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, + "license": "MIT", + "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/webpack-dev-server/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "license": "MIT", + "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/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "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/webpack-dev-server/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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": "Upgrade to fsevents v2 to mitigate potential security issues", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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, + "license": "MIT", + "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/webpack-dev-server/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/webpack-dev-server/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack-dev-server/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, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/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, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log/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, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "2 || 3 || 4" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-unassert-loader": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/webpack-unassert-loader/-/webpack-unassert-loader-1.2.0.tgz", - "integrity": "sha1-GE/d6xb5Yno9TGGHylMZ6WIOn/Y=", + "integrity": "sha512-/QgR5vOMDsn+6IGfhcrPp+qwYGAEcy9OoWIfFvOv+aad6KnbjHWxo7O8ew5hpf6/r3xJWakaU2kU43gVOCtyhA==", "dev": true, - "requires": { - "escodegen": "1.9.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "unassert": "1.5.1" - }, + "license": "MIT", "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - } + "escodegen": "^1.6.1", + "esprima": "^4.0.0", + "estraverse": "^4.0.0", + "unassert": "^1.5.0" } }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true, - "requires": { - "http-parser-js": "0.4.9", - "websocket-extensions": "0.1.2" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "websocket-extensions": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", - "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=", - "dev": true - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "node_modules/webpack/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, - "requires": { - "isexe": "2.0.0" + "license": "MIT", + "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" } }, - "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 + "node_modules/webpack/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true + "node_modules/webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } }, - "wordwrap": { + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "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/webpack/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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/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, + "license": "MIT" + }, + "node_modules/webpack/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/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, + "license": "MIT", + "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/webpack/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack/node_modules/schema-utils": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, + "license": "MIT", "dependencies": { - "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.1" - } - }, - "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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" } }, - "wrappy": { + "node_modules/webpack/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": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, - "requires": { - "mkdirp": "0.5.1" + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" } }, - "x-xss-protection": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz", - "integrity": "sha1-iYr7k4abJGYc+cUvnujbjtB2Tdk=" - }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true - }, - "xml2js": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", - "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", - "requires": { - "sax": "1.2.1", - "xmlbuilder": "4.2.1" - } - }, - "xmlbuilder": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", - "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", - "requires": { - "lodash": "4.17.4" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "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": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "4.1.0" + "node_modules/write/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "yo-yoify": { + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "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, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "MIT", + "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/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "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, + "license": "MIT", + "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-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yo-yoify/-/yo-yoify-4.0.0.tgz", - "integrity": "sha512-Z02JF10NsAfmUnNRi2uTNWWSq2UNnsB94Fok6Nd/0hDwv0rZU2xdAWo6V0EvvEj/JYmeB4hy6TFVq+ECELmMvg==", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "requires": { - "acorn": "5.2.1", - "falafel": "2.1.0", - "hyperx": "2.3.2", - "on-load": "3.3.1", - "through2": "2.0.3" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } } diff --git a/package.json b/package.json index e6a76049..371e932d 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,20 @@ { - "name": "firefox-send", + "name": "send", "description": "File Sharing Experiment", - "version": "2.1.2", + "version": "3.4.27", "author": "Mozilla (https://mozilla.org)", - "repository": "mozilla/send", - "homepage": "https://github.com/mozilla/send/", + "contributors": [ + "Tim Visee <3a4fb3964f@sinenomine.email> (https://timvisee.com)" + ], + "repository": "gitlab:timvisee/send", + "homepage": "https://gitlab.com/timvisee/send/", "license": "MPL-2.0", "private": true, "scripts": { - "precommit": "lint-staged", "clean": "rimraf dist", - "build": "npm run clean && webpack -p", + "build": "npm run clean && webpack", "lint": "npm-run-all lint:*", - "lint:css": "stylelint 'assets/*.css'", + "lint:css": "stylelint app/*.css app/**/*.css", "lint:js": "eslint .", "lint-locales": "node scripts/lint-locales", "lint-locales:dev": "npm run lint-locales", @@ -20,12 +22,23 @@ "format": "prettier '**/*.js' 'assets/*.css' --single-quote --write", "get-prod-locales": "node scripts/get-prod-locales", "get-prod-locales:write": "npm run get-prod-locales -- --write", - "changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges", "contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS", "release": "npm-run-all contributors changelog", - "test": "mocha test/unit", - "start": "cross-env NODE_ENV=development webpack-dev-server", - "prod": "node server/prod.js" + "test": "npm-run-all test:*", + "test:backend": "nyc --reporter=lcovonly mocha --reporter=min test/backend", + "test:frontend": "cross-env NODE_ENV=development node test/frontend/runner.js", + "test:report": "nyc report --reporter=html", + "test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js", + "circleci-test-integration": "echo 'webdriverio tests need to be updated to node 12'", + "start": "npm run clean && cross-env NODE_ENV=development L10N_DEV=true BASE_URL=http://localhost:8080 DETECT_BASE_URL=true webpack-dev-server --mode=development", + "android": "cross-env ANDROID=1 npm start", + "prod": "node server/bin/prod.js" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged", + "pre-push": "npm test" + } }, "lint-staged": { "*.js": [ @@ -39,118 +52,178 @@ "git add" ] }, + "nyc": { + "reporter": [ + "text" + ], + "cache": true + }, "engines": { - "node": ">=8.2.0" + "node": "^16.13.0" }, "devDependencies": { - "autoprefixer": "^7.1.6", - "babel-core": "^6.26.0", - "babel-loader": "^7.1.2", - "babel-plugin-yo-yoify": "^1.0.1", - "babel-polyfill": "^6.26.0", - "babel-preset-env": "^1.6.1", - "babel-preset-es2015": "^6.24.1", - "babel-preset-stage-2": "^6.24.1", - "base64-js": "^1.2.1", - "copy-webpack-plugin": "^4.2.0", - "cross-env": "^5.1.1", - "css-loader": "^0.28.7", - "css-mqpacker": "^6.0.1", - "cssnano": "^3.10.0", - "eslint": "^4.10.0", - "eslint-plugin-mocha": "^4.11.0", - "eslint-plugin-node": "^5.2.1", + "@babel/core": "^7.17.9", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/preset-env": "^7.16.11", + "@dannycoates/webcrypto-liner": "^0.1.37", + "@fullhuman/postcss-purgecss": "^4.1.3", + "@mattiasbuelens/web-streams-polyfill": "0.2.1", + "@sentry/browser": "^5.30.0", + "asmcrypto.js": "^0.22.0", + "babel-loader": "^8.2.4", + "babel-plugin-istanbul": "^5.2.0", + "base64-js": "^1.5.1", + "content-disposition": "^0.5.4", + "copy-webpack-plugin": "^6.4.0", + "core-js": "^3.21.1", + "crc": "^3.8.0", + "cross-env": "^6.0.3", + "css-loader": "^5.2.7", + "css-mqpacker": "^7.0.0", + "cssnano": "^5.1.12", + "eslint": "^6.6.0", + "eslint-config-prettier": "^6.15.0", + "eslint-plugin-mocha": "^6.2.1", + "eslint-plugin-node": "^10.0.0", "eslint-plugin-security": "^1.4.0", - "expose-loader": "^0.7.3", - "extract-loader": "^1.0.1", - "file-loader": "^1.1.5", - "git-rev-sync": "^1.9.1", - "github-changes": "^1.1.1", - "html-loader": "^0.5.1", - "husky": "^0.14.3", - "lint-staged": "^4.3.0", - "mocha": "^3.5.3", - "nanobus": "^4.3.0", - "npm-run-all": "^4.1.2", - "postcss-loader": "^2.0.8", - "prettier": "^1.8.2", - "proxyquire": "^1.8.0", - "raven-js": "^3.19.1", - "redis-mock": "^0.20.0", - "require-from-string": "^2.0.1", - "rimraf": "^2.6.2", - "selenium-webdriver": "^3.6.0", - "sinon": "^4.1.2", + "expose-loader": "^0.7.5", + "extract-loader": "^3.2.0", + "extract-text-webpack-plugin": "^4.0.0-beta.0", + "fast-text-encoding": "^1.0.3", + "file-loader": "^6.2.0", + "git-rev-sync": "^3.0.2", + "html-loader": "^0.5.5", + "http_ece": "^1.1.0", + "husky": "^3.0.9", + "intl-pluralrules": "^1.3.1", + "lint-staged": "^9.4.2", + "mocha": "^10.1.0", + "morgan": "^1.9.1", + "nanobus": "^4.5.0", + "nanohtml": "^1.9.0", + "nanotiming": "^7.3.1", + "npm-run-all": "^4.1.5", + "nyc": "^14.1.1", + "postcss": "^8.4.14", + "postcss-loader": "^4.2.0", + "postcss-preset-env": "^7.7.2", + "prettier": "^1.19.1", + "proxyquire": "^2.1.3", + "puppeteer": "^2.0.0", + "raw-loader": "^3.1.0", + "rimraf": "^3.0.0", + "script-loader": "^0.7.2", + "sinon": "^7.5.0", "string-hash": "^1.1.3", - "stylelint-config-standard": "^17.0.0", - "stylelint-no-unsupported-browser-features": "^1.0.1", - "supertest": "^3.0.0", - "testpilot-ga": "^0.3.0", - "val-loader": "^1.0.2", - "webpack": "^3.8.1", - "webpack-dev-server": "2.9.1", - "webpack-manifest-plugin": "^1.3.2", + "stylelint": "^14.9.1", + "stylelint-config-standard": "^26.0.0", + "stylelint-no-unsupported-browser-features": "^5.0.3", + "svgo": "^2.8.0", + "svgo-loader": "^3.0.1", + "tailwindcss": "^2", + "val-loader": "^2.1.2", + "webpack": "4.38.0", + "webpack-cli": "^3.3.12", + "webpack-dev-middleware": "^3.7.3", + "webpack-dev-server": "^3.11.3", + "webpack-manifest-plugin": "^2.2.0", "webpack-unassert-loader": "^1.2.0" }, "dependencies": { - "aws-sdk": "^2.149.0", - "body-parser": "^1.18.2", - "choo": "^6.5.1", - "cldr-core": "^32.0.0", - "connect-busboy": "0.0.2", - "convict": "^4.0.1", - "express": "^4.16.2", - "fluent": "^0.4.1", - "fluent-langneg": "^0.1.0", - "helmet": "^3.9.0", - "mkdirp": "^0.5.1", - "mozlog": "^2.1.1", - "raven": "^2.2.1", - "redis": "^2.8.0" + "@dannycoates/express-ws": "^5.0.3", + "@fluent/bundle": "^0.17.1", + "@fluent/langneg": "^0.6.2", + "@google-cloud/storage": "^6.2.3", + "@sentry/node": "^7.7.0", + "aws-sdk": "^2.1109.0", + "body-parser": "^1.20.0", + "choo": "^7.0.0", + "cldr-core": "^35.1.0", + "configstore": "github:dannycoates/configstore#master", + "convict": "^6.2.4", + "convict-format-with-validator": "^6.2.0", + "double-ended-queue": "^2.1.0-0", + "express": "^4.17.3", + "helmet": "^3.23.3", + "mozlog": "^3.0.1", + "node-fetch": "^2.6.7", + "redis": "^3.1.1", + "redis-mock": "^0.47.0", + "selenium-standalone": "^6.24.0", + "ua-parser-js": "^0.7.31" }, "availableLanguages": [ "en-US", + "an", + "ar", "ast", - "az", - "bs", + "azz", + "be", + "bn", + "br", "ca", "cak", "cs", "cy", + "da", "de", "dsb", "el", + "en-CA", + "en-GB", "es-AR", "es-CL", "es-ES", "es-MX", "et", + "eu", "fa", + "fi", "fr", "fy-NL", + "gn", + "he", + "hr", "hsb", "hu", + "hus", + "hy-AM", + "ia", "id", "it", "ja", "ka", "kab", "ko", - "ms", + "lt", + "meh", + "mix", + "ml", "nb-NO", "nl", "nn-NO", + "oc", + "pa-IN", + "pl", + "ppl", "pt-BR", "pt-PT", + "quc", + "ro", "ru", "sk", "sl", + "sq", "sr", + "su", "sv-SE", - "tl", + "te", + "th", "tr", "uk", "vi", + "zgh", "zh-CN", "zh-TW" ] diff --git a/postcss.config.js b/postcss.config.js index 86125684..de493b4f 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,15 +1,38 @@ -const autoprefixer = require('autoprefixer'); -const cssnano = require('cssnano'); -const mqpacker = require('css-mqpacker'); - -const config = require('./server/config'); - -const options = { - plugins: [autoprefixer, mqpacker, cssnano] +const TailwindExtractor = content => { + return content.match(/[A-Za-z0-9-_:/]+/g) || []; }; -if (config.env === 'development') { +const options = { + plugins: [ + require('tailwindcss')('./tailwind.config.js'), + require('postcss-preset-env') + ] +}; + +if (process.env.NODE_ENV === 'development') { options.map = { inline: true }; +} else { + options.plugins.push( + require('@fullhuman/postcss-purgecss')({ + content: [ + './app/*.js', + './app/ui/*.js', + './android/*.js', + './android/pages/*.js' + ], + extractors: [ + { + extractor: TailwindExtractor, + extensions: ['js'] + } + ] + }) + ); + options.plugins.push( + require('cssnano')({ + preset: 'default' + }) + ); } module.exports = options; diff --git a/public/Inter-Black.woff b/public/Inter-Black.woff new file mode 100644 index 00000000..b2c4e27c Binary files /dev/null and b/public/Inter-Black.woff differ diff --git a/public/Inter-Black.woff2 b/public/Inter-Black.woff2 new file mode 100644 index 00000000..5e7bd9f1 Binary files /dev/null and b/public/Inter-Black.woff2 differ diff --git a/public/Inter-BlackItalic.woff b/public/Inter-BlackItalic.woff new file mode 100644 index 00000000..ff10955e Binary files /dev/null and b/public/Inter-BlackItalic.woff differ diff --git a/public/Inter-BlackItalic.woff2 b/public/Inter-BlackItalic.woff2 new file mode 100644 index 00000000..97f3c0b3 Binary files /dev/null and b/public/Inter-BlackItalic.woff2 differ diff --git a/public/Inter-Bold.woff b/public/Inter-Bold.woff new file mode 100644 index 00000000..43dfb67f Binary files /dev/null and b/public/Inter-Bold.woff differ diff --git a/public/Inter-Bold.woff2 b/public/Inter-Bold.woff2 new file mode 100644 index 00000000..b26180b1 Binary files /dev/null and b/public/Inter-Bold.woff2 differ diff --git a/public/Inter-BoldItalic.woff b/public/Inter-BoldItalic.woff new file mode 100644 index 00000000..0aa33d06 Binary files /dev/null and b/public/Inter-BoldItalic.woff differ diff --git a/public/Inter-BoldItalic.woff2 b/public/Inter-BoldItalic.woff2 new file mode 100644 index 00000000..07ad99d9 Binary files /dev/null and b/public/Inter-BoldItalic.woff2 differ diff --git a/public/Inter-ExtraBold.woff b/public/Inter-ExtraBold.woff new file mode 100644 index 00000000..a814de5c Binary files /dev/null and b/public/Inter-ExtraBold.woff differ diff --git a/public/Inter-ExtraBold.woff2 b/public/Inter-ExtraBold.woff2 new file mode 100644 index 00000000..fc1e3e2a Binary files /dev/null and b/public/Inter-ExtraBold.woff2 differ diff --git a/public/Inter-ExtraBoldItalic.woff b/public/Inter-ExtraBoldItalic.woff new file mode 100644 index 00000000..6eaf0b23 Binary files /dev/null and b/public/Inter-ExtraBoldItalic.woff differ diff --git a/public/Inter-ExtraBoldItalic.woff2 b/public/Inter-ExtraBoldItalic.woff2 new file mode 100644 index 00000000..79a24528 Binary files /dev/null and b/public/Inter-ExtraBoldItalic.woff2 differ diff --git a/public/Inter-ExtraLight.woff b/public/Inter-ExtraLight.woff new file mode 100644 index 00000000..131a66fc Binary files /dev/null and b/public/Inter-ExtraLight.woff differ diff --git a/public/Inter-ExtraLight.woff2 b/public/Inter-ExtraLight.woff2 new file mode 100644 index 00000000..e080a70e Binary files /dev/null and b/public/Inter-ExtraLight.woff2 differ diff --git a/public/Inter-ExtraLightItalic.woff b/public/Inter-ExtraLightItalic.woff new file mode 100644 index 00000000..257b53a1 Binary files /dev/null and b/public/Inter-ExtraLightItalic.woff differ diff --git a/public/Inter-ExtraLightItalic.woff2 b/public/Inter-ExtraLightItalic.woff2 new file mode 100644 index 00000000..0ccb9b64 Binary files /dev/null and b/public/Inter-ExtraLightItalic.woff2 differ diff --git a/public/Inter-Italic.woff b/public/Inter-Italic.woff new file mode 100644 index 00000000..7e07d71e Binary files /dev/null and b/public/Inter-Italic.woff differ diff --git a/public/Inter-Italic.woff2 b/public/Inter-Italic.woff2 new file mode 100644 index 00000000..435fe822 Binary files /dev/null and b/public/Inter-Italic.woff2 differ diff --git a/public/Inter-Light.woff b/public/Inter-Light.woff new file mode 100644 index 00000000..0b46abc0 Binary files /dev/null and b/public/Inter-Light.woff differ diff --git a/public/Inter-Light.woff2 b/public/Inter-Light.woff2 new file mode 100644 index 00000000..c5fcddd3 Binary files /dev/null and b/public/Inter-Light.woff2 differ diff --git a/public/Inter-LightItalic.woff b/public/Inter-LightItalic.woff new file mode 100644 index 00000000..d1101cfe Binary files /dev/null and b/public/Inter-LightItalic.woff differ diff --git a/public/Inter-LightItalic.woff2 b/public/Inter-LightItalic.woff2 new file mode 100644 index 00000000..fafad9a5 Binary files /dev/null and b/public/Inter-LightItalic.woff2 differ diff --git a/public/Inter-Medium.woff b/public/Inter-Medium.woff new file mode 100644 index 00000000..15079dcf Binary files /dev/null and b/public/Inter-Medium.woff differ diff --git a/public/Inter-Medium.woff2 b/public/Inter-Medium.woff2 new file mode 100644 index 00000000..7d0fbe9e Binary files /dev/null and b/public/Inter-Medium.woff2 differ diff --git a/public/Inter-MediumItalic.woff b/public/Inter-MediumItalic.woff new file mode 100644 index 00000000..7d8c1222 Binary files /dev/null and b/public/Inter-MediumItalic.woff differ diff --git a/public/Inter-MediumItalic.woff2 b/public/Inter-MediumItalic.woff2 new file mode 100644 index 00000000..fa86742c Binary files /dev/null and b/public/Inter-MediumItalic.woff2 differ diff --git a/public/Inter-Regular.woff b/public/Inter-Regular.woff new file mode 100644 index 00000000..e8587fd8 Binary files /dev/null and b/public/Inter-Regular.woff differ diff --git a/public/Inter-Regular.woff2 b/public/Inter-Regular.woff2 new file mode 100644 index 00000000..46568fdc Binary files /dev/null and b/public/Inter-Regular.woff2 differ diff --git a/public/Inter-SemiBold.woff b/public/Inter-SemiBold.woff new file mode 100644 index 00000000..de40b73e Binary files /dev/null and b/public/Inter-SemiBold.woff differ diff --git a/public/Inter-SemiBold.woff2 b/public/Inter-SemiBold.woff2 new file mode 100644 index 00000000..6bb8bee1 Binary files /dev/null and b/public/Inter-SemiBold.woff2 differ diff --git a/public/Inter-SemiBoldItalic.woff b/public/Inter-SemiBoldItalic.woff new file mode 100644 index 00000000..47b0df3a Binary files /dev/null and b/public/Inter-SemiBoldItalic.woff differ diff --git a/public/Inter-SemiBoldItalic.woff2 b/public/Inter-SemiBoldItalic.woff2 new file mode 100644 index 00000000..9bfbdb84 Binary files /dev/null and b/public/Inter-SemiBoldItalic.woff2 differ diff --git a/public/Inter-Thin.woff b/public/Inter-Thin.woff new file mode 100644 index 00000000..46d14727 Binary files /dev/null and b/public/Inter-Thin.woff differ diff --git a/public/Inter-Thin.woff2 b/public/Inter-Thin.woff2 new file mode 100644 index 00000000..382a4645 Binary files /dev/null and b/public/Inter-Thin.woff2 differ diff --git a/public/Inter-ThinItalic.woff b/public/Inter-ThinItalic.woff new file mode 100644 index 00000000..6c284f34 Binary files /dev/null and b/public/Inter-ThinItalic.woff differ diff --git a/public/Inter-ThinItalic.woff2 b/public/Inter-ThinItalic.woff2 new file mode 100644 index 00000000..f9471a08 Binary files /dev/null and b/public/Inter-ThinItalic.woff2 differ diff --git a/public/Inter-italic.var.woff2 b/public/Inter-italic.var.woff2 new file mode 100644 index 00000000..83fb6314 Binary files /dev/null and b/public/Inter-italic.var.woff2 differ diff --git a/public/Inter-upright.var.woff2 b/public/Inter-upright.var.woff2 new file mode 100644 index 00000000..db2b70cc Binary files /dev/null and b/public/Inter-upright.var.woff2 differ diff --git a/public/Inter.var.woff2 b/public/Inter.var.woff2 new file mode 100644 index 00000000..e8d43091 Binary files /dev/null and b/public/Inter.var.woff2 differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml new file mode 100644 index 00000000..b3930d0f --- /dev/null +++ b/public/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/public/contribute.json b/public/contribute.json index db85d7a2..df405da9 100644 --- a/public/contribute.json +++ b/public/contribute.json @@ -1,23 +1,18 @@ { - "name": "firefox-send", + "name": "send", "description": "File Sharing Experiment", "repository": { - "url": "https://github.com/mozilla/send/", + "url": "https://github.com/timvisee/send/", "license": "MPL-2.0" }, - "participate": { - "home": "https://github.com/mozilla/send/blob/master/README.md", - "docs": "https://github.com/mozilla/send/blob/master/README.md" - }, - "bugs": { - "list": "https://github.com/mozilla/send/issues", - "report": "https://github.com/mozilla/send/issues/new" - }, - "urls": { - "prod": "https://send.firefox.com/", - "stage": "https://send.stage.mozaws.net/", - "dev": "https://send.dev.mozaws.net/" - }, + "participate": { + "home": "https://github.om/timvisee/send/blob/master/README.md", + "docs": "https://github.com/timvisee/send/blob/master/README.md" + }, + "bugs": { + "list": "https://github.com/timvisee/send/issues", + "report": "https://github.com/timvisee/send/issues/new" + }, "keywords": [ "JavaScript", "jQuery", diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 00000000..65da6b67 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/inter.css b/public/inter.css new file mode 100644 index 00000000..3ad9e2f8 --- /dev/null +++ b/public/inter.css @@ -0,0 +1,161 @@ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100; + font-display: optional; + src: url('Inter-Thin.woff2') format('woff2'), + url('Inter-Thin.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100; + font-display: optional; + src: url('Inter-ThinItalic.woff2') format('woff2'), + url('Inter-ThinItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 200; + font-display: optional; + src: url('Inter-ExtraLight.woff2') format('woff2'), + url('Inter-ExtraLight.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 200; + font-display: optional; + src: url('Inter-ExtraLightItalic.woff2') format('woff2'), + url('Inter-ExtraLightItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 300; + font-display: optional; + src: url('Inter-Light.woff2') format('woff2'), + url('Inter-Light.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 300; + font-display: optional; + src: url('Inter-LightItalic.woff2') format('woff2'), + url('Inter-LightItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-display: optional; + src: url('Inter-Regular.woff2') format('woff2'), + url('Inter-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 400; + font-display: optional; + src: url('Inter-Italic.woff2') format('woff2'), + url('Inter-Italic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 500; + font-display: optional; + src: url('Inter-Medium.woff2') format('woff2'), + url('Inter-Medium.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 500; + font-display: optional; + src: url('Inter-MediumItalic.woff2') format('woff2'), + url('Inter-MediumItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 600; + font-display: optional; + src: url('Inter-SemiBold.woff2') format('woff2'), + url('Inter-SemiBold.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 600; + font-display: optional; + src: url('Inter-SemiBoldItalic.woff2') format('woff2'), + url('Inter-SemiBoldItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-display: optional; + src: url('Inter-Bold.woff2') format('woff2'), + url('Inter-Bold.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 700; + font-display: optional; + src: url('Inter-BoldItalic.woff2') format('woff2'), + url('Inter-BoldItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 800; + font-display: optional; + src: url('Inter-ExtraBold.woff2') format('woff2'), + url('Inter-ExtraBold.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 800; + font-display: optional; + src: url('Inter-ExtraBoldItalic.woff2') format('woff2'), + url('Inter-ExtraBoldItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 900; + font-display: optional; + src: url('Inter-Black.woff2') format('woff2'), + url('Inter-Black.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 900; + font-display: optional; + src: url('Inter-BlackItalic.woff2') format('woff2'), + url('Inter-BlackItalic.woff') format('woff'); +} diff --git a/public/locales/an/send.ftl b/public/locales/an/send.ftl new file mode 100644 index 00000000..27934998 --- /dev/null +++ b/public/locales/an/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Se ye importando… +encryptingFile = Se ye cifrando… +decryptingFile = Se ye descifrando… +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargas + } +timespanHours = + { $num -> + [one] hora + *[other] { $num } horas + } +copiedUrl = Copiau! +unlockInputPlaceholder = Clau +unlockButtonLabel = Desblocar +downloadButtonLabel = Descargar +downloadFinish = Descarga completa +fileSizeProgress = ({ $partialSize } de { $totalSize }) +sendYourFilesLink = Preba Send +errorPageHeader = I ha habiu bell problema! +fileTooBig = Ixe fichero ye masiau gran pa cargar-lo. Ha de tener menos de { $size } +linkExpiredAlt = Lo vinclo ye caducau +notSupportedHeader = Lo suyo navegador no ye compatible +notSupportedLink = Per qué no ye compatible lo mío navegador? +notSupportedOutdatedDetail = Esta versión de Firefox no admite la tecnolochía web con que funciona lo Send. Habrás d'esviellar lo navegador. +updateFirefox = Esviellar Firefox +deletePopupCancel = Cancelar +deleteButtonHover = Borrar +passwordTryAgain = La contrasenya ye incorrecta. Torne-lo a intentar. +javascriptRequired = Send necesita JavaScript +whyJavascript = Per qué Send necesita JavaScript? +enableJavascript = Activa JavaScript y torna-lo a intentar. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Maxima lonchitut d'a clau: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No s'ha puesto definir la clau + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartición de fichers simpla y privada +introDescription = { -send-brand } te permite de compartir fichers cifraus de cabo a cabo, y tamién un vinclo que expira automaticament. Asinas, puetz mantener en privau lo que compartes y asegurar-te de que los tuyos contenius no se quedan pa cutio en linia. +notifyUploadEncryptDone = Lo fichero s'ha cifrau y ye presto pa ninviar-se +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca dimpués de { $downloadCount } u { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 fichero + *[other] { $num } fichers + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Mida total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar lo vinclo que quiers compartir +copyLinkButton = Copiar lo vinclo +downloadTitle = Descargar los fichers +downloadDescription = Este fichero s'ha compartiu per medio de { -send-brand } con cifrau de cabo a cabo y un vinclo que caduca automaticament. +trySendDescription = Preba { -send-brand } pa una compartición de fichers simpla y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Nomás se puet puyar 1 fitxer de vez. + *[other] Nomás se pueden puyar { $count } fichers de vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Nomás se permite 1 ficher. + *[other] Nomás se permiten { $count } fichers. + } +expiredTitle = Este vinclo ye caducau. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona millor con a zaguera versión de { -firefox } y funcionará con a versión mas recient d'a mayor parte de navegadors. +downloadFirefox = Descargar { -firefox } +legalTitle = Aviso de privacidat de { -send-short-brand } +legalDateStamp = Versió 1.0, con data d'o 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min +addFilesButton = Triar los fichers a cargar +uploadButton = Cargar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrociega y suelta los fichers +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = u fes clic aquí pa ninviar dica { $size } +addPassword = Protecher con una clau +emailPlaceholder = Escribe la tuya adreza de correu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Inicia una sesión pa ninviar dica { $size } +signInOnlyButton = Iniciar la sesión +accountBenefitTitle = Crea una cuenta de { -firefox } u dentra-ie +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir fichers dica { $size } +accountBenefitDownloadCount = Compartir fichers con mas chent +accountBenefitTimeLimit = + { $count -> + [one] Mantiene los vinclos activos dica 1 dia + *[other] Mantiene los vinclos activos dica { $count } días + } +accountBenefitSync = Chestiona los fichers compartius dende qualsequier dispositivo +accountBenefitMoz = Descubre mas cosas sobre los atros servicios de { -mozilla } +signOut = Zarrar la sesión +okButton = Vale +downloadingTitle = Se ye descargando +noStreamsWarning = Este navegador talment no pueda descifrar un fichero tant gran. +noStreamsOptionCopy = Copia lo vinclo pa ubrir-lo en belatro navegador +noStreamsOptionFirefox = Preba lo nuestro navegador favorito +noStreamsOptionDownload = Continar con este navegador +downloadFirefoxPromo = Lo nuevo { -firefox } t'ofreix { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Comparte lo vinclo enta lo tuyo fichero: +shareLinkButton = Compartir lo vinclo +# $name is the name of the file +shareMessage = Baixa-te «{ $name }» con { -send-brand }: compartición de fiches simpla y segura +trailheadPromo = I hai una manera de protecher la tuya privacidat. Une-te a Firefox. +learnMore = Mas información diff --git a/public/locales/ar/send.ftl b/public/locales/ar/send.ftl index 0959886b..61506aef 100644 --- a/public/locales/ar/send.ftl +++ b/public/locales/ar/send.ftl @@ -1,80 +1,185 @@ -// Firefox Send is a brand name and should not be localized. title = فَيَرفُكس سِنْد -siteSubtitle = تجربة وِبّيّة -siteFeedback = الانطباعات -uploadPageHeader = شارِك ملفاتك بخصوصية وتعمية -uploadPageExplainer = أرسل الملفات عبر رابط آمن خاص ومعمّى تنتهي صلاحيته تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد. -uploadPageLearnMore = اطّلع على المزيد -uploadPageDropMessage = أسقِط ملفّك هنا لبدء الرفع -uploadPageSizeMessage = لتتحصل على أفضل تجربة، من المستحسن أن يكون الملف أصغر من 1 غ.بايت -uploadPageBrowseButton = اختر ملفّا على حاسوبك - .title = اختر ملفّا على حاسوبك -uploadPageBrowseButton1 = اختر ملفّا لرفعه -uploadPageMultipleFilesAlert = رفع عدة ملفات (أو رفع مجلد) ليس مدعوما حاليا. importingFile = يستورد… encryptingFile = يعمّي… decryptingFile = يفك التعمية… -notifyUploadDone = انتهى الرفع. -uploadingPageMessage = ما إن يُرفع الملف سيُتاح ضبط خيارات انتهاء صلاحيته. -uploadingPageCancel = ألغِ الرفع - .title = ألغِ الرفع -uploadCancelNotification = أُلغي الرفع. -uploadingPageLargeFileMessage = هذا الملف كبير الحجم وسيأخذ رفعه وقتا. انتظر رجاءً. -uploadingFileNotification = أعلِمني عندما يكتمل الرفع. -uploadSvgAlt - .alt = ارفع -copyUrlFormLabelWithName = انسخ الرابط وشاركه لإرسال الملف: { $filename } -copyUrlFormButton = انسخ إلى الحافظة - .title = انسخ إلى الحافظة +downloadCount = + { $num -> + [zero] لا تنزيلات + [one] تنزيل واحد + [two] تنزيلين + [few] { $num } تنزيلات + [many] { $num } تنزيلًا + *[other] { $num } تنزيل + } +timespanHours = + { $num -> + [zero] أقل من ساعة + [one] ساعة + [two] ساعتين + [few] { $num } ساعات + [many] { $num } ساعة + *[other] { $num } ساعة + } copiedUrl = نُسخ! -deleteFileButton = احذف الملف - .title = احذف الملف -sendAnotherFileLink = أرسل ملفّا آخر - .title = أرسل ملفّا آخر -// Alternative text used on the download link/button (indicates an action). -downloadAltText - .alt = نزّل -downloadFileName = نزّل { $filename } -unlockInputLabel = أدخل كلمة السر unlockInputPlaceholder = كلمة السر -downloadFileTitle = نزِّل الملف المعمّى -// Firefox Send is a brand name and should not be localized. -downloadMessage = يُرسل إليك صديقك ملفا عبر «فَيَرفُكس سِنْد»، وهي خدمة تتيح لك مشاركة الملفات عبر رابط آمن وخاص ومعمّى، حيث تنتهي صلاحياتها تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد. -// Text and title used on the download link/button (indicates an action). +unlockButtonLabel = افتح القفل downloadButtonLabel = نزّل - .title = نزّل -downloadNotification = لقد اكتمل التنزيل. downloadFinish = اكتمل التنزيل -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } من أصل { $totalSize }) -// Firefox Send is a brand name and should not be localized. sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد» -downloadingPageMessage = رجاء أبقِ هذا اللسان مفتوحا حتى نجلب الملف ونفك تعميته. -errorAltText - .alt = خطأ أثناء الرفع errorPageHeader = حدث خطب ما. -errorPageMessage = حدث خطب ما أثناء رفع الملف. -errorPageLink = أرسل ملفا آخر fileTooBig = حجم الملف كبير للغاية لرفعه. يجب أن يكون أصغر من { $size }. +linkExpiredAlt = انتهت صلاحية الرابط notSupportedHeader = متصفحك غير مدعوم. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = للأسف فإن متصفحك لا يدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تجربة متصفح آخر، ونحن ننصحك بِفَيَرفُكس! notSupportedLink = لماذا متصفحي غير مدعوم؟ notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك. updateFirefox = حدّث فَيَرفُكس -copyFileList = انسخ الرابط -deleteFileList = احذف -legalHeader = الشروط والخصوصية -deletePopupText = أأحذف هذا الملف؟ -deletePopupYes = نعم deletePopupCancel = ألغِ -deleteButtonHover - .title = احذف -copyUrlHover - .title = انسخ الرابط -footerLinkTerms = الشروط -footerLinkCookies = الكعكات -requirePasswordCheckbox = اطلب كلمة سر لتنزيل هذا الملف -addPasswordButton = أضِف كلمة سر -// This label is followed by the password needed to download a file -passwordResult = كلمة السر: { $password } +deleteButtonHover = احذف +passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة. +javascriptRequired = يتطلب فَيَرفُكس سِنْد جافاسكربت +whyJavascript = لماذا يتطلب فَيَرفُكس سِنْد جافاسكربت؟ +enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاولة. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }س { $minutes }د +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }د +# A short status message shown when the user enters a long password +maxPasswordLength = أقصر طول لكلمة السر: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = يجب ألا تُضبط كلمة السر هذه + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة +introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر. +notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = ينقضي بعد { $downloadCount } أو { $timespan } +timespanMinutes = + { $num -> + [zero] أقل من دقيقة + [one] دقيقة واحدة + [two] دقيقتين اثنتين + [few] { $num } دقائق + [many] { $num } دقيقة + *[other] { $num } دقيقة + } +timespanDays = + { $num -> + [zero] أقل من يوم + [one] يوم واحد + [two] يومين اثنين + [few] { $num } أيام + [many] { $num } يومًا + *[other] { $num } يوم + } +timespanWeeks = + { $num -> + [zero] أقل من أسبوع + [one] أسبوع واحد + [two] أسبوعين اثنين + [few] { $num } أسابيع + [many] { $num } أسبوعًا + *[other] { $num } أسبوع + } +fileCount = + { $num -> + [zero] { $num } ملف + [one] ملف واحد + [two] ملفان اثنان + [few] { $num } ملفات + [many] { $num } ملفًا + *[other] { $num } ملف + } +# byte abbreviation +bytes = بايت +# kibibyte abbreviation +kb = ك.بايت +# mebibyte abbreviation +mb = م.بايت +# gibibyte abbreviation +gb = ج.بايت +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = إجمالي الحجم: { $size } +# the next line after the colon contains a file name +copyLinkDescription = انسخ هذا الرابط لتُشارك الملف: +copyLinkButton = انسخ الرابط +downloadTitle = نزّل الملفات +downloadDescription = شارك أحد هذا الملف معك عبر { -send-brand } وعمّاه بتعمية من الطرفين وبرابط ينقضي أجله تلقائيا. +trySendDescription = جرِّب { -send-brand } وشارِك ملفاتك بلا عناء وبخصوصية تامة. +# count will always be > 10 +tooManyFiles = + { $count -> + [zero] لا يمكنك تنزيل أي ملف في آن واحد. + [one] لا يمكنك تنزيل ما يزيد على ملف واحد في آن واحد. + [two] لا يمكنك تنزيل ما يزيد على ملفين اثنين في آن واحد. + [few] لا يمكنك تنزيل ما يزيد على { $count } ملفات في آن واحد. + [many] لا يمكنك تنزيل ما يزيد على { $count } ملفًا في آن واحد. + *[other] لا يمكنك تنزيل ما يزيد على { $count } ملف في آن واحد. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [zero] الأرشيفات ممنوعة. + [one] لا يُسمح إلا بأرشيف واحد. + [two] لا يُسمح إلا بأرشيفين اثنين. + [few] لا يُسمح إلا ب‍ { $count } أرشيفات. + [many] لا يُسمح إلا ب‍ { $count } أرشيفًا. + *[other] لا يُسمح إلا ب‍ { $count } أرشيف. + } +expiredTitle = انقضى وقت الرابط. +notSupportedDescription = لن يعمل { -send-brand } في هذا المتصفح. أفضل المتصفحات التي يعمل معها { -send-short-brand } هو { -firefox } بآخر إصدارة، كما وأحدث إصدارة من أغلب المتصفحات الموجودة. +downloadFirefox = نزِّل { -firefox } +legalTitle = تنويه خصوصية { -send-short-brand } +legalDateStamp = الإصدارة ١٫٠ بتاريخ ١٢ مارس ٢٠١٩ +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }يوم { $hours }سا { $minutes }دق +addFilesButton = حدّد الملفات التي تريد رفعها +uploadButton = ارفع +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = اسحب الملفات وأفلِتها هنا +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = أو انقر لإرسال ملفات يصل حجمها { $size } +addPassword = احمِه بكلمة سر +emailPlaceholder = أدخل بريدك الإلكتروني +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = لِج وأرسِل ملفات يصل حجمها { $size } +signInOnlyButton = لِج +accountBenefitTitle = أنشِئ حساب { -firefox } أو لِج إلى حسابك +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = شارِك ملفات يصل حجمها { $size } +accountBenefitDownloadCount = شارِك الملفات مع أناس أكثر وأكثر +accountBenefitTimeLimit = + { $count -> + [zero] لا تُبقِ أي روابط نشطة + [one] أبقِ الروابط نشطة لمدة تصل إلى يوم واحد + [two] أبقِ الروابط نشطة لمدة تصل إلى يومين اثنين + [few] أبقِ الروابط نشطة لمدة تصل إلى { $count } أيام + [many] أبقِ الروابط نشطة لمدة تصل إلى { $count } يومًا + *[other] أبقِ الروابط نشطة لمدة تصل إلى { $count } يوم + } +accountBenefitSync = أدِر ملفاتك التي شاركتها من أيّ جهاز تريد +accountBenefitMoz = اطّلع على المزيد حول خدمات { -mozilla } +signOut = اخرج +okButton = حسنًا +downloadingTitle = يجري التنزيل +noStreamsWarning = هناك احتمال بألا يقدر هذا المتصفح على فكّ تعمية الملفات الكبيرة كهذا. +noStreamsOptionCopy = انسخ الرابط لتفتحه في متصفح آخر +noStreamsOptionFirefox = جرّب متصفّحنا المفضل +noStreamsOptionDownload = واصِل بهذا المتصفح +downloadFirefoxPromo = ‏{ -send-short-brand } تقدمة { -firefox } الجديد الأنيق. +# the next line after the colon contains a file name +shareLinkDescription = شارِك الرابط الذي يصل إلى الملف: +shareLinkButton = شارِك الرابط +# $name is the name of the file +shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة +trailheadPromo = يمكنك حماية خصوصيتك، طبعا. انضم إلى فَيَرفُكس. +learnMore = اطّلع على المزيد. diff --git a/public/locales/ast/send.ftl b/public/locales/ast/send.ftl index 8f00923e..fb988013 100644 --- a/public/locales/ast/send.ftl +++ b/public/locales/ast/send.ftl @@ -1,91 +1,140 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = esperimentu web -siteFeedback = Feedback -uploadPageHeader = Compartición privada y cifrada de ficheros -uploadPageExplainer = Unvia ficheros pente un enllaz seguru, priváu y cifráu que caduca automáticamente p'asegurar que les tos coses nun queden siempres na rede. -uploadPageLearnMore = Deprendi más -uploadPageDropMessage = Suelta equí'l to ficheru p'aniciar la xuba -uploadPageSizeMessage = Pal meyor funcionamientu, lo meyor ye que'l to ficheru seya menor de 1GB -uploadPageBrowseButton = Esbilla un ficheru nel to ordenador -uploadPageBrowseButton1 = Esbilla un ficheru pa unviar -uploadPageMultipleFilesAlert = Anguaño nun se sofita la xuba múltiple de ficheros o carpetes. -uploadPageBrowseButtonTitle = Xubir ficheru -uploadingPageProgress = Xubiendo { $filename } ({ $size }) +title = Send importingFile = Importando... -verifyingFile = Verificando... encryptingFile = Cifrando... decryptingFile = Descifrando... -notifyUploadDone = Finó la to xuba. -uploadingPageMessage = Namái que'l ficheru xuba, sedrás a afitar les opciones de caducidá. -uploadingPageCancel = Encaboxar xuba -uploadCancelNotification = Encaboxóse la to xuba. -uploadingPageLargeFileMessage = Esti ficheru ye grande y pue entardar daqué en xubir. ¡Paciencia! -uploadingFileNotification = Avísame cuando se complete la xuba. -uploadSuccessConfirmHeader = Preparáu pa unviar -uploadSvgAlt = Xubir -uploadSuccessTimingHeader = L'enllaz del to ficheru caducará dempués d'una descarga o en 24 hores. -copyUrlFormLabelWithName = Copia y comparti l'enllaz pa unviar el to ficheru: { $filename } -copyUrlFormButton = Copiar al cartafueyu +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargues + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } hores + } copiedUrl = ¡Copióse! -deleteFileButton = Desaniciar ficheru -sendAnotherFileLink = Unviar otru ficheru -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Baxar -downloadFileName = Baxar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Introducir contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquiar -downloadFileTitle = Baxar ficheru cifráu -// Firefox Send is a brand name and should not be localized. -downloadMessage = El to collaciu unvióte un ficheru usando Firefox Send, un serviciu que te permite compartir ficheros con un enllaz seguru, priváu y cifráu que caduca automáticamente p'asegurar que les to coses nun queden siempres na rede. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Baxar -downloadNotification = Completóse la to descarga. -downloadFinish = Descarga completada -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Completóse la descarga fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prueba Firefox Send -downloadingPageProgress = Baxando { $filename } ({ $size }) -downloadingPageMessage = Dexa esta llingüeta abierta entrín vamos en cata del to ficheru y lu desciframos, por favor. -errorAltText = Fallu de xuba -errorPageHeader = ¡Daqué foi mal! -errorPageMessage = Hebo un fallu xubiendo'l ficheru. -errorPageLink = Unviar otru ficheru +sendYourFilesLink = Probar Send +errorPageHeader = ¡Asocedió daqué malo! fileTooBig = Esti ficheru ye mui grande como pa xubilu. Debería tener menos de { $size }. -linkExpiredAlt = Enllaz caducáu -expiredPageHeader = ¡Esti enllaz caducó o enxamás nun esistó! +linkExpiredAlt = Caducó l'enllaz notSupportedHeader = El to restolador nun ta sofitáu. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Desafortunadamente esti restolador nun sofita la teunoloxía web qu'usa Firefox Send. Precisarás d'usar otru restolador. ¡Aconseyámoste Firefox! notSupportedLink = ¿Por qué'l mio restolador nun ta sofitáu? -notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox nun sofita la teunoloxía web qu'usa Firefox Send. Precisarás d'anovar Firefox. +notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox nun sofita la teunoloxía web qu'usa Send. Vas precisar anovar el restolador. updateFirefox = Anovar Firefox -downloadFirefoxButtonSub = Descarga de baldre -uploadedFile = Ficheru -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Caduca en -deleteFileList = Desaniciar -nevermindButton = Nun m'importa -legalHeader = Términos y privacidá -legalNoticeTestPilot = Anguaño Firefox Send ye un esperimentu de Test Pilot y ta suxetu a los Términos de serviciu y l'Avisu de privacidá de Test Pilot. Equí pues deprender más tocante a esti esperimentu y la so recoyida de datos. -legalNoticeMozilla = L'usu de Firefox Send tamién ta suxetu al Avisu de privacidá y a los Términos d'usu de la páxina web de Mozilla. -deletePopupText = ¿Desaniciar esti ficheru? -deletePopupYes = Sí deletePopupCancel = Encaboxar deleteButtonHover = Desaniciar -copyUrlHover = Copiar URL -footerLinkLegal = Llegal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Tocante a Test Pilot -footerLinkPrivacy = Privacidá -footerLinkTerms = Términos -footerLinkCookies = Cookies -requirePasswordCheckbox = Riquir una contraseña pa baxar esti ficheru -addPasswordButton = Amestar contraseña -passwordTryAgain = Contraseña incorreuta. Volvi tentalo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } +passwordTryAgain = La contraseña ye incorreuta. Volvi tentalo. +javascriptRequired = Send rique JavaScript +whyJavascript = ¿Por qué Send rique JavaScript? +enableJavascript = Activa JavaScript y volvi tentalo, por favor. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Llargor máximu de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nun pudo afitase esta contraseña + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartición de ficheros privada y cenciella +introDescription = { -send-brand } déxate compartir ficheros con cifráu puntu a puntu y un enllaz que caduca automáticamente. D'esti mou, asegúreste de que lo que compartes ye privao y nun va tar siempres en llinia. +notifyUploadEncryptDone = El ficheru ta cifráu y preparáu pa unviase +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca dempués de { $downloadCount } ó { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutu + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } díes + } +timespanWeeks = + { $num -> + [one] 1 selmana + *[other] { $num } selmanes + } +fileCount = + { $num -> + [one] 1 ficheru + *[other] { $num } ficheros + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamañu total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copia l'enllaz pa compartir el ficheru: +copyLinkButton = Copiar l'enllaz +downloadTitle = Descarga de ficheros +downloadDescription = Esti ficheru compartióse per { -send-brand } con cifráu puntu a puntu y un enllaz que caduca automáticamente. +trySendDescription = Prueba { -send-brand } pa una compartición de ficheros cenciella y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Namái pue xubise 1 ficheru al empar. + *[other] Namái puen xubise { $count } ficheros al empar. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Namái se permite 1 archivu + *[other] Namái se permiten { $count } archivos + } +expiredTitle = Esti enllaz caducó. +notSupportedDescription = { -send-brand } nun va funcionar con esti restolador. { -send-short-brand } funciona meyor cola última versión de { -firefox } y l'actual de la mayoría de restoladores. +downloadFirefox = Baxar { -firefox } +legalTitle = Avisu de privacidá de { -send-short-brand } +legalDateStamp = Versión 1.0, con data del 12 de marzu de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Esbillar los ficheros a unviar +uploadButton = Xubir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastra y suelta ficheros +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o calca pa unviar hasta { $size } +addPassword = Protexer con una contraseña +emailPlaceholder = Introduz el to corréu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Anicia sesión pa unviar hasta { $size } +signInOnlyButton = Aniciar sesión +accountBenefitTitle = Creación d'una cuenta de { -firefox } o aniciu de sesión nella +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Comparti ficheros d'hasta { $size } +accountBenefitDownloadCount = Comparti ficheros con más xente +accountBenefitTimeLimit = + { $count -> + [one] Caltién activos los enllaces demientres 1 día + *[other] Caltién activos los enllaces demientres { $count } díes + } +accountBenefitSync = Xestiona los ficheros compartíos dende cualesquier preséu +accountBenefitMoz = Deprendi más tocante a otros servicios de { -mozilla } +signOut = Zarrar sesión +okButton = Aceutar +downloadingTitle = Baxando +noStreamsWarning = Esti restolador quiciabes nun seya a descifrar un ficheru d'esti tamañu. +trailheadPromo = Hai un mou de protexer la to privacidá. Xúnite a Firefox. +learnMore = Deprender más. diff --git a/public/locales/az/send.ftl b/public/locales/az/send.ftl index 2b2b8bc3..459cc165 100644 --- a/public/locales/az/send.ftl +++ b/public/locales/az/send.ftl @@ -1,89 +1,66 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = web eksperiment -siteFeedback = Geri dönüş -uploadPageHeader = Məxfi, Şifrələnmiş Fayl Paylaşma -uploadPageExplainer = Fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silinən keçidlə göndərin. -uploadPageLearnMore = Ətraflı öyrən -uploadPageDropMessage = Yükləmək üçün faylınızı buraya daşıyın -uploadPageSizeMessage = Xidmətin daha yaxşı işləməsi üçün faylınız 1 GB-dan az olmalıdır -uploadPageBrowseButton = Kompüterinizdən fayl seçin -uploadPageBrowseButton1 = Yüklənəcək faylı seçin -uploadPageMultipleFilesAlert = Birdən çox fayl və ya qovluq yükləmə hələlik dəstəklənmir. -uploadPageBrowseButtonTitle = Fayl yüklə -uploadingPageProgress = { $filename } ({ $size }) yüklənir +title = Send importingFile = İdxal edilir… -verifyingFile = Təsdiqlənir… encryptingFile = Şifrələnir... decryptingFile = Şifrə açılır... -notifyUploadDone = Yükləməniz hazırdır. -uploadingPageMessage = Faylınız yükləndikdən sonra vaxtı çıxma seçimlərini qura biləcəksiz. -uploadingPageCancel = Yükləməni ləğv et -uploadCancelNotification = Yükləməniz ləğv edildi. -uploadingPageLargeFileMessage = Fayl böyükdür və yükləmək çox vaxt ala bilər. Səbirli olun! -uploadingFileNotification = Yükləmə bitdiyində xəbər ver. -uploadSuccessConfirmHeader = Göndərməyə hazır -uploadSvgAlt = Yüklə -uploadSuccessTimingHeader = Faylınızın keçidinin 1 endirmədən və ya 24 saatdan sonra vaxtı çıxacaq. -copyUrlFormLabelWithName = Faylınızı göndərmək üçün keçidi köçürün: { $filename } -copyUrlFormButton = Buferə köçür +downloadCount = + { $num -> + [one] 1 endirmə + *[other] { $num } endirmə + } +timespanHours = + { $num -> + [one] 1 saat + *[other] { $num } saat + } copiedUrl = Köçürüldü! -deleteFileButton = Faylı sil -sendAnotherFileLink = Başqa fayl göndər -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Endir -downloadFileName = { $filename } faylını endir -downloadFileSize = ({ $size }) -unlockInputLabel = Parol daxil edin unlockInputPlaceholder = Parol unlockButtonLabel = Aç -downloadFileTitle = Şifrələnmiş Faylı Endir -// Firefox Send is a brand name and should not be localized. -downloadMessage = Yoldaşınız Firefox Send ilə sizə fayl göndərir, fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silən fayl göndərmə xidməti. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Endir -downloadNotification = Endirməniz tamamlandı. downloadFinish = Endirmə Tamamlandı -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send Yoxla -downloadingPageProgress = { $filename } faylı ({ $size }) endirilir -downloadingPageMessage = Lütfən faylı endirib şifrəsini açarkən vərəqi açıq buraxın. -errorAltText = Yükləmə xətası +sendYourFilesLink = Send Yoxla errorPageHeader = Nəsə səhv getdi! -errorPageMessage = Faylı yüklərkən xəta baş verdi. -errorPageLink = Başqa fayl göndər fileTooBig = Fayl yükləmək üçün çox böyükdür. Fayl { $size }-dan az olmalıdır. linkExpiredAlt = Keçidin vaxtı çıxıb -expiredPageHeader = Keçidin vaxtı çıxıb və ya heç vaxt olmayıb! notSupportedHeader = Səyyahınız dəstəklənmir. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Heyf ki, bu səyyah Firefox Send-ə güc verən web texnologiyalarını dəstəkləmir. Fərqli bir səyyah yoxlamalısınız. Biz Firefox məsləhət görürük! notSupportedLink = Səyyahım niyə dəstəklənmir? -notSupportedOutdatedDetail = Heyf ki, Firefox səyyahının bu versiyası Firefox Send-ə güc verən web texnologiyalarını dəstəkləmir. Səyyahınızı yeniləməlisiniz. +notSupportedOutdatedDetail = Heyf ki, Firefox səyyahının bu versiyası Send-ə güc verən web texnologiyalarını dəstəkləmir. Səyyahınızı yeniləməlisiniz. updateFirefox = Firefox-u Yenilə -downloadFirefoxButtonSub = Pulsuz Endir -uploadedFile = Fayl -copyFileList = Keçidi Köçürt -// expiryFileList is used as a column header -expiryFileList = Vaxtı çıxma tarixi -deleteFileList = Sil -nevermindButton = Vacib deyil -legalHeader = Şərtlər və Məxfilik -legalNoticeTestPilot = Firefox Send Test Pilot eksperimentidir, Test Pilot Xidmət ŞərtləriMəxfilik Bildirişi-nə tabedir. Bu eksperiment və məlumat yığma haqqında buradan öyrənə bilərsiz. -legalNoticeMozilla = Firefox Send saytının istifadəsi həmçinin Mozilla-nın Saytlar üçün Məxfilik BildirişiSayt İstifadə Şərtləri-nə tabedir. -deletePopupText = Fayl silinsin? -deletePopupYes = Bəli deletePopupCancel = Ləğv et deleteButtonHover = Sil -copyUrlHover = Keçidi Köçürt -footerLinkLegal = Hüquqi -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot Haqqında -footerLinkPrivacy = Məxfilik -footerLinkTerms = Şərtlər -footerLinkCookies = Çərəzlər -requirePasswordCheckbox = Bu faylı endirmək üçün parol tələb et -addPasswordButton = Parol əlavə et -incorrectPassword = Xətalı parol. Təkrar yoxlayın. +passwordTryAgain = Səhv parol. Təkrar yoxlayın. +javascriptRequired = Send üçün JavaScript lazımdır +whyJavascript = Send niyə JavaScript tələb edir? +enableJavascript = Lütfən JavaScript-i aktiv edib təkrar yoxlayın. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } saat { $minutes } dəq +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } dəq +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum parol uzunluğu: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Parol qurula bilmədi + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +copyLinkButton = Keçidi köçür +uploadButton = Yüklə +signInOnlyButton = Daxil ol +signOut = Çıx +okButton = Tamam +downloadingTitle = Endirilir +shareLinkButton = Keçidi paylaş diff --git a/public/locales/azz/send.ftl b/public/locales/azz/send.ftl new file mode 100644 index 00000000..3241135c --- /dev/null +++ b/public/locales/azz/send.ftl @@ -0,0 +1,140 @@ +title = Send +importingFile = Mokalakijtok… +encryptingFile = Motatijtok… +decryptingFile = Kichiujtok se uelis kiixtajtoltis ya… +downloadCount = + { $num -> + *[undefined] 1 kitemouijtok / { $num } kintemouijtok + } +timespanHours = + { $num -> + *[undefined] 1 hora / { $num } hora + } +copiedUrl = ¡Moixkopinak! +unlockInputPlaceholder = Ichtakatajtol +unlockButtonLabel = Xikajchiua tein amo kikaua maj tekiti +downloadButtonLabel = Xiktemoui +downloadFinish = Nochi motemouij ya +fileSizeProgress = ({ $partialSize } itech { $totalSize }) +sendYourFilesLink = Xikejeko Send +errorPageHeader = ¡Tensa amo kuali kisak! +fileTooBig = Nejin tajkuilol semi ueyi. Moneki amo panos { $size } +linkExpiredAlt = Nejin tein tikpatskilij amo tekititok ya +notSupportedHeader = Monavegador amo kualtia. +notSupportedLink = ¿Keyej nonavegador amo kualtia? +notSupportedOutdatedDetail = Tetayokoltij, Firefox tein tikuitok amo kiselia tepostekitilis tecnología web tein ika tekiti Send. Moneki tikyankuilis monavegador. +updateFirefox = Maj Firefox moyankuili +deletePopupCancel = Maj motsakuili uan amo tami tein kichiujtok +deleteButtonHover = Maj majchiua +passwordTryAgain = Amo yektik ichtakatajtol. Oksepa xikijkuilo. +javascriptRequired = Send kineki maj moajsi JavaScript +whyJavascript = ¿Keyej Send kineki maj moajsi JavaScript? +enableJavascript = Se kualtakayot, xikaua maj peua tekiti JavaScript uan oksepa xikejeko. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Keniuj ueyak ichtakatajtol, maj amo pano: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nejin ichtakatajtol amo uel kiixtaliani + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Xiktitani +-firefox = Firefox +-mozilla = Mozilla +introTitle = Amo ouij uan ichtaka xikinpanoltili oksekin motajkuiloluan archivos +introDescription = { -send-brand } mitspaleuia uan ijkon tikinpanoltilis oksekin motajkuiloluan archivos ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no kitemaka kampa se kipatskilis tein niman ixpoliui. Ijkuin uelis tikichtakaeuas tein tikintitanilis oksekin uan tikyekmatis tein moaxka amo nochipaya mokauas itech Internet. +notifyUploadEncryptDone = Moarchivo moijkuiloj ya kemej amo akin uelis kiixtajtoltis uan se uelis kititanis ya +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Poliui ijkuak tiajsis { $downloadCount } oso { $timespan } +timespanMinutes = + { $num -> + *[undefined] 1 minuto / { $num } minuto + } +timespanDays = + { $num -> + *[undefined] 1 tonal / { $num } tonalmej + } +timespanWeeks = + { $num -> + *[undefined] 1 semana / { $num } semana + } +fileCount = + { $num -> + *[undefined] 1 archivo / { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Nochi tamachiua: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Xikixkopina tein se kipatskilis uan xikinpanoltili oksekin moarchivo: +copyLinkButton = Xikixkopina tein se kipatskilis +downloadTitle = Xiktemoui tajkuilolmej archivos +downloadDescription = Nejin archivo mopanoltij itechkopa { -send-brand } ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no tein ika se kipatskilis tein niman ixpoliui. +trySendDescription = Xikejeko { -send-brand } ijkon amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] Sayoj { $count } tajkuilolmej archivos uelis tikolochtejkoltis saj. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] Sayoj { $count } tajkuilolmej archivos uelis moajsiskej saj. + } +expiredTitle = Nejin tein tikpatskilij amo tekititos ok. +notSupportedDescription = { -send-brand } amo tekiti ika nejin navegador. { -send-short-brand } okachi kuali tekiti tein ika okachi yankuik { -firefox }, uan no tekitis tein ika okachi yankuikej tel miak navegadores. +downloadFirefox = Xiktemoui { -firefox } +legalTitle = { -send-short-brand } tanauatia ika yekpialis tein moaxka itech tepos +legalDateStamp = Versión 1.0 tein kikixtijkej 12 tonal metsti marzo 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }t { $hours }h { $minutes }m +addFilesButton = Xikinixpejpena tajkuilolmej archivos tein tikintejkoltis +uploadButton = Xiktejkolti +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Xikintilana uan xikinkajkaua tajkuilolmej archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = oso xikpatskili uan tiktitanis, sayoj tein amo panoua { $size } +addPassword = Xikyekpia ika se ichtakatajtol +emailPlaceholder = Xikijkuilo mocorreo itech tepos +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Xikalakteua uan uelis tiktitanis tein amo panos { $size } +signInOnlyButton = Kampa se kalakteua +accountBenefitTitle = Ximochiuili se cuenta itech { -firefox } oso xikalakteua +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Xikintitani tajkuilolmej archivos tein amo panouaj { $size } +accountBenefitDownloadCount = Xikintitanili tajkuilolmej archivos oksekin +accountBenefitTimeLimit = + { $count -> + *[undefined] Kampa se kipatskilis maj kisentokakan kualtiakan se tonal ok / { $count } tonalmej ok + } +accountBenefitSync = Itech tein yeski tepos xikixyekana motajkuiloluan archivos tein tikinpanoltilij oksekin +accountBenefitMoz = Okachi tikmatis okseki tapaleuilmej tein kitemaka { -mozilla } +signOut = Kampa se kisa +okButton = Kuali yetok +downloadingTitle = Kitemouijtok +noStreamsWarning = Xa navegador amo uelis kitalij nejin tajkuilol archivo tein tel ueyi kemej se uelis kiyekixtajtoltis ya. +noStreamsOptionCopy = Xikixkopina tein se kipatskilis uan ijkon se uelis kitatapos itech okse navegador +noStreamsOptionFirefox = Xikejeko navegador tein semi techuelita +noStreamsOptionDownload = Maj niksentoka niktatekiujti nejin navegador +downloadFirefoxPromo = Yankuik { -firefox } mitsixpantilia { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Xikinpanoltili oksekin tein se kipatskilis uan teuika motajkuilol archivo: +shareLinkButton = Kampa se kipatskilis tein uelis tikinpanoltilis oksekin +# $name is the name of the file +shareMessage = Xiktemoui “{ $name }” ika { -send-brand }: amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos +trailheadPromo = Kemaj, uelis tikyekpias tein moaxka itech tepos. Xipoui Firefox. +learnMore = Xiktemoui tajkuilolmej archivos. diff --git a/public/locales/be/send.ftl b/public/locales/be/send.ftl new file mode 100644 index 00000000..20f5b66d --- /dev/null +++ b/public/locales/be/send.ftl @@ -0,0 +1,158 @@ +title = Send +importingFile = Імпартаванне... +encryptingFile = Зашыфроўка... +decryptingFile = Расшыфроўка... +downloadCount = + { $num -> + [one] { $num } сцягванне + [few] { $num } сцягванні + *[many] { $num } сцягванняў + } +timespanHours = + { $num -> + [one] { $num } гадзіна + [few] { $num } гадзіны + *[many] { $num } гадзін + } +copiedUrl = Скапіявана! +unlockInputPlaceholder = Пароль +unlockButtonLabel = Разблакаваць +downloadButtonLabel = Сцягнуць +downloadFinish = Сцягванне скончана +fileSizeProgress = ({ $partialSize } з { $totalSize }) +sendYourFilesLink = Паспрабуйце Send +errorPageHeader = Нешта пайшло не так! +fileTooBig = Гэты файл надта вялікі. Ён мусіць быць меншым за { $size } +linkExpiredAlt = Тэрмін дзеяння спасылкі сышоў +notSupportedHeader = Ваш браўзер не падтрымліваецца. +notSupportedLink = Чаму мой браўзер не падтрымліваецца? +notSupportedOutdatedDetail = На жаль, гэтая версія Firefox не падтрымлівае вэб-тэхналогію, што забяспечвае працу Send. Вам трэба абнавіць свой браўзер. +updateFirefox = Абнавіць Firefox +deletePopupCancel = Скасаваць +deleteButtonHover = Выдаліць +passwordTryAgain = Некарэктны пароль. Паспрабуйце зноў. +javascriptRequired = Для Send неабходны JavaScript +whyJavascript = Чаму для Send неабходны JavaScript? +enableJavascript = Калі ласка, уключыце JavaScript і паспрабуйце зноў. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } г. { $minutes } хв. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } хв. +# A short status message shown when the user enters a long password +maxPasswordLength = Максімальная даўжыня пароля: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Гэты пароль немагчыма паставіць + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Просты і прыватны абмен файламі +introDescription = { -send-brand } дазваляе вам абменьвацца файламі са скразным шыфраваннем і спасылкамі з абмежаваным тэрмінам дзеяння. Такім чынам, вы можаце дзяліцца файламі прыватна і быць упэўненым, што яны не застануцца ў сеціве назаўжды. +notifyUploadEncryptDone = Ваш файл зашыфраваны і гатовы да адпраўкі +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Тэрмін дзеяння сыдзе праз { $downloadCount } або { $timespan } +timespanMinutes = + { $num -> + [one] { $num } хвіліна + [few] { $num } хвіліны + *[many] { $num } хвілін + } +timespanDays = + { $num -> + [one] { $num } дзень + [few] { $num } дні + *[many] { $num } дзён + } +timespanWeeks = + { $num -> + [one] { $num } тыдзень + [few] { $num } тыдні + *[many] { $num } тыдняў + } +fileCount = + { $num -> + [one] { $num } файл + [few] { $num } файлы + *[many] { $num } файлаў + } +# byte abbreviation +bytes = Б +# kibibyte abbreviation +kb = КБ +# mebibyte abbreviation +mb = МБ +# gibibyte abbreviation +gb = ГБ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Агульны памер: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Скапіруйце спасылку, каб падзяліцца сваім файлам: +copyLinkButton = Скапіраваць спасылку +downloadTitle = Сцягнуць файлы +downloadDescription = Гэтым файлам падзяліліся праз { -send-brand } са скразным шыфраваннем і спасылкай з абмежаваным тэрмінам дзеяння. +trySendDescription = Паспрабуйце { -send-brand } для простага і бяспечнага абмену файламі. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Толькі { $count } файл можна загрузіць за раз. + [few] Толькі { $count } файлы можна загрузіць за раз. + *[many] Толькі { $count } файлаў можна загрузіць за раз. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Толькі { $count } архіў дазволены. + [few] Толькі { $count } архівы дазволены. + *[many] Толькі { $count } архіваў дазволена. + } +expiredTitle = Тэрмін дзеяння гэтай спасылкі сышоў. +notSupportedDescription = { -send-brand } не будзе працаваць у гэтым браўзеры. Лепей за ўсё { -send-short-brand } працуе з апошняй версіяй { -firefox } і будзе працаваць з бягучай версіяй большасці браўзераў. +downloadFirefox = Сцягнуць { -firefox } +legalTitle = Палітыка прыватнасці { -send-short-brand } +legalDateStamp = Версія 1.0 ад 12 сакавіка 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } д. { $hours } г. { $minutes } хв. +addFilesButton = Выберыце файлы для загрузкі +uploadButton = Загрузіць +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Перацягніце файлы сюды +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = або клікніце, каб адправіць да { $size }: +addPassword = Абараніць паролем +emailPlaceholder = Увядзіце сваю электронную пошту +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Увайдзіце, каб адпраўляць да { $size } +signInOnlyButton = Увайсці +accountBenefitTitle = Стварыце ўліковы запіс { -firefox } або ўвайдзіце +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Дзяліцеся файламі да { $size } +accountBenefitDownloadCount = Дзяліцеся файламі з большай колькасцю людзей +accountBenefitTimeLimit = + { $count -> + [one] Трымайце спасылкі актыўнымі да { $count } дня + [few] Трымайце спасылкі актыўнымі да { $count } дзён + *[many] Трымайце спасылкі актыўнымі да { $count } дзён + } +accountBenefitSync = Кіруйце адпраўленымі файламі з любой прылады +accountBenefitMoz = Даведайцеся пра іншыя сэрвісы { -mozilla } +signOut = Выйсці +okButton = ОК +downloadingTitle = Сцягваецца +noStreamsWarning = Гэты браўзер не мае магчымасці расшыфраваць такі вялікі файл. +noStreamsOptionCopy = Скапіруйце спасылку, каб адкрыць у іншым браўзеры +noStreamsOptionFirefox = Паспрабуйце наш любімы браўзер +noStreamsOptionDownload = Працягнуць з гэтым браўзерам +downloadFirefoxPromo = { -send-short-brand } прыйшоў да вас з цалкам новага { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Падзяліцеся спасылкай на свой файл: +shareLinkButton = Падзяліцца спасылкай +# $name is the name of the file +shareMessage = Сцягніце «{ $name }» з { -send-brand }: простага і бяспечнага файлаабменніка +trailheadPromo = Ёсць спосаб абараніць вашу прыватнасць. Далучайцеся да Firefox. +learnMore = Падрабязней. diff --git a/public/locales/bn-BD/send.ftl b/public/locales/bn-BD/send.ftl deleted file mode 100644 index c27b3537..00000000 --- a/public/locales/bn-BD/send.ftl +++ /dev/null @@ -1,51 +0,0 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ওয়েব গবেষণা -siteFeedback = প্রতিক্রিয়া -uploadPageLearnMore = আরও জানুন -uploadPageBrowseButton = আপনার কম্পিউটারে ফাইল নির্বাচন করুন -uploadPageBrowseButtonTitle = ফাইল আপলোড -importingFile = ইম্পোর্ট হচ্ছে... -verifyingFile = যাচাই হচ্ছে... -encryptingFile = ইনক্রিপট হচ্ছে... -decryptingFile = ডিক্রিপট হচ্ছে... -notifyUploadDone = আপনার আপলোড সম্পন্ন হয়েছে। -uploadingPageCancel = আপলোড বাতিল করুন -uploadCancelNotification = আপনার অাপলোড বাতিল করা হয়েছে। -uploadSuccessConfirmHeader = পাঠানোর জন্য প্রস্তুত -uploadSvgAlt = আপলোড -copyUrlFormButton = ক্লিপবোর্ডে কপি করুন -copiedUrl = কপি করা হয়েছে! -deleteFileButton = ফাইল মুছুন -sendAnotherFileLink = আরেকটি ফাইল পাঠান -// Alternative text used on the download link/button (indicates an action). -downloadAltText = ডাউনলোড -downloadFileName = ডাউনলোড { $filename } -downloadFileSize = ({ $size }) -// Text and title used on the download link/button (indicates an action). -downloadButtonLabel = ডাউনলোড -downloadNotification = আপনার ডাউনলোড সম্পন্ন হয়েছে। -downloadFinish = ডাউনলোড সম্পন্ন -errorAltText = আপালোডে ত্রুটি -errorPageHeader = কোন সমস্যা হয়েছে! -errorPageLink = আরেকটি ফাইল পাঠান -updateFirefox = Firefox হালনাগাদ করুন -downloadFirefoxButtonSub = বিনামূল্যে ডাউনলোড -uploadedFile = ফাইল -copyFileList = URL অনুলিপি করুন -// expiryFileList is used as a column header -expiryFileList = মেয়াদোত্তীর্ণ তারিখ -deleteFileList = মুছে ফেলুন -nevermindButton = কিছু মনে করবেন না -legalHeader = শর্তাবলী এবং গোপনীয়তা -deletePopupText = ফাইলটি মুছতে চান? -deletePopupYes = হ্যাঁ -deletePopupCancel = বাতিল -deleteButtonHover = মুছে ফেলুন -copyUrlHover = URL অনুলিপি করুন -footerLinkLegal = আইনগত -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot পরিচিতি -footerLinkPrivacy = গোপনীয়তা -footerLinkTerms = শর্তাবলী -footerLinkCookies = কুকি diff --git a/public/locales/bn/send.ftl b/public/locales/bn/send.ftl new file mode 100644 index 00000000..9c37a038 --- /dev/null +++ b/public/locales/bn/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = ইম্পোর্ট হচ্ছে... +encryptingFile = ইনক্রিপট হচ্ছে... +decryptingFile = ডিক্রিপট হচ্ছে... +downloadCount = + { $num -> + [one] 1 ডাউনলোড + *[other] { $num } ডাউনলোডগুলো + } +timespanHours = + { $num -> + [one] 1 ঘন্টা + *[other] { $num } ঘন্টা + } +copiedUrl = কপি করা হয়েছে! +unlockInputPlaceholder = পাসওয়ার্ড +unlockButtonLabel = আনলক করুন +downloadButtonLabel = ডাউনলোড +downloadFinish = ডাউনলোড সম্পন্ন +fileSizeProgress = ({ $totalSize } এর { $partialSize }) +sendYourFilesLink = Send পরখ করে দেখুন +errorPageHeader = কোন সমস্যা হয়েছে! +fileTooBig = ফাইলটি আপলোড করার জন্যে খুব বড়। এটি { $size } এর চেয়ে কম হওয়া উচিত। +linkExpiredAlt = লিঙ্ক মেয়াদউত্তীর্ণ হয়েছে +notSupportedHeader = আপনার ব্রাউজার সমর্থিত নয়। +notSupportedLink = আমার ব্রাউজার কেন সমর্থিত নয়? +notSupportedOutdatedDetail = দুর্ভাগ্যবশত Firefox এই সংস্করণটি ওয়েব প্রযুক্তিকে সমর্থন করে না যা Send কে সমর্থন করে। আপনাকে আপনার ব্রাউজারটি আপডেট করতে হবে। +updateFirefox = Firefox হালনাগাদ করুন +deletePopupCancel = বাতিল +deleteButtonHover = মুছে ফেলুন +passwordTryAgain = ভুল পাসওয়ার্ড। আবার চেষ্টা করুন। +javascriptRequired = Send এর জাভাস্ক্রিপ্ট প্রয়োজন। +whyJavascript = কেন Send এর জাভাস্ক্রিপ্ট প্রয়োজন? +enableJavascript = জাভাস্ক্রিপ্ট সক্রিয় করুন এবং আবার চেষ্টা করুন। +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ঘ { $minutes }মি +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }মি +# A short status message shown when the user enters a long password +maxPasswordLength = সর্বোচ্চ পাসওয়ার্ড দৈর্ঘ্য:{ $length } +# A short status message shown when there was an error setting the password +passwordSetError = এই পাসওয়ার্ড সেট করা যাবে না + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = প্রেরণ +-firefox = Firefox +-mozilla = Mozilla +introTitle = সহজ, ব্যক্তিগত ফাইল শেয়ার +introDescription = { -send-brand } ফাইল এনক্রিপশন ও স্বয়ংক্রিয়ভাবে মেয়াদ শেষ হবে এমন একটি লিঙ্কের মাধ্যমে শুরু-থেকে-শেষ পর্যন্ত শেয়ার করতে দেয়। একারণে আপনি যা শেয়ার করেন তা গোপন রাখতে এবং আপনার জিনিস চিরদিনের জন্য অনলাইনে থাকবে না তা নিশ্চিত করতে পারেন। +notifyUploadEncryptDone = আপনার ফাইল এনক্রিপ্ট করা হয়েছে এবং প্রেরণ করতে প্রস্তুত +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } বা { $timespan } পরে মেয়াদ শেষ হবে +timespanMinutes = + { $num -> + [one] ১ মিনিট + *[other] { $num } মিনিট + } +timespanDays = + { $num -> + [one] ১ দিন + *[other] { $num } দিন + } +timespanWeeks = + { $num -> + [one] ১ সপ্তাহ + *[other] { $num } সপ্তাহ + } +fileCount = + { $num -> + [one] ১টি ফাইল + *[other] { $num }টি ফাইল + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = মোট আকার: { $size } +# the next line after the colon contains a file name +copyLinkDescription = আপনার ফাইল শেয়ার করতে লিঙ্ক অনুলিপি করুন: +copyLinkButton = লিঙ্ক অনুলিপি +downloadTitle = ফাইল ডাউনলোড +downloadDescription = ফাইলটি { -send-brand } এর মাধ্যমে এনক্রিপশন ও স্বয়ংক্রিয় মেয়াদ শেষ হবে এমন একটি লিঙ্কের মাধ্যমে শুরু-থেকে-শেষ পর্যন্ত শেয়ার করা হয়েছে। +trySendDescription = সহজ ও নিরাপদ ফাইল শেয়ারের জন্য { -send-brand } ব্যবহার করুন। +# count will always be > 10 +tooManyFiles = + { $count -> + [one] একবারে কেবল ১টি ফাইল আপলোড করা যাবে। + *[other] একবারে কেবল { $count }টি ফাইল আপলোড করা যাবে। + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] কেবল ১টি আর্কাইভ অনুমোদিত। + *[other] কেবল { $count } আর্কাইভ অনুমোদিত। + } +expiredTitle = এই লিঙ্কের মেয়াদ শেষ হয়ে গেছে। +notSupportedDescription = { -send-brand } এই ব্রাউজারের সাথে কাজ করবে না। { -firefox } এর সাম্প্রতিকতম সংস্করণে { -send-short-brand } সর্বোত্তমভাবে কাজ করবে, এবং এটি বেশিরভাগ ব্রাউজারের বর্তমান সংস্করণে কাজ করবে। +downloadFirefox = { -firefox } ডাউনলোড করুন +legalTitle = { -send-short-brand } গোপনীয়তা নোটিশ +legalDateStamp = সংস্করণ ১.০, ১২ মার্চ, ২০১৯ তারিখ +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }দি { $hours }ঘ { $minutes }মি +addFilesButton = আপলোডের জন্য ফাইল নির্বাচন করুন +uploadButton = আপলোড +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ফাইল টেনে এনে ছাড়ুন +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = বা সর্বোচ্চ { $size } আকারের ফাইল পাঠাতে ক্লিক করুন +addPassword = পাসওয়ার্ড দ্বারা সুরক্ষিত রাখুন +emailPlaceholder = আপনার ইমেইল দিন +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন +signInOnlyButton = সাইন ইন +accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন +accountBenefitDownloadCount = আরও মানুষের সাথে ফাইল শেয়ার করুন +accountBenefitTimeLimit = + { $count -> + [one] ১ দিন পর্যন্ত লিঙ্ক সক্রিয় রাখুন + *[other] { $count } দিন পর্যন্ত লিঙ্ক সক্রিয় রাখুন + } +accountBenefitSync = যেকোন ডিভাইস থেকে শেয়ার করা ফাইল পরিচালনা করুন +accountBenefitMoz = অন্যান্য { -mozilla } সেবা সম্পর্কে জানুন +signOut = সাইন আউট +okButton = ঠিক আছে +downloadingTitle = ডাউনলোড হচ্ছে +noStreamsWarning = এই ব্রাউজার এতো বড় একটি ফাইল ডিক্রিপ্ট করতে সক্ষম নয়। +noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন +noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন +noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন +downloadFirefoxPromo = { -send-short-brand } আপনারদের জন্য নিয়ে এসেছে একেবারে নতুন { -firefox }। +# the next line after the colon contains a file name +shareLinkDescription = আপনার ফাইলে লিঙ্ক শেয়ার করুন: +shareLinkButton = লিঙ্ক শেয়ার করুন +# $name is the name of the file +shareMessage = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং +trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন। +learnMore = আরও জানুন। diff --git a/public/locales/br/send.ftl b/public/locales/br/send.ftl new file mode 100644 index 00000000..85c44ffe --- /dev/null +++ b/public/locales/br/send.ftl @@ -0,0 +1,176 @@ +title = Send +importingFile = Oc'h enporzhiañ … +encryptingFile = Oc'h enrinegañ.. +decryptingFile = Oc'h ezrinegañ... +downloadCount = + { $num -> + [one] { $num } bellgargadenn + [two] { $num } bellgargadenn + [few] { $num } fellgargadenn + [many] { $num } a bellgargadennoù + *[other] { $num } pellgargadenn + } +timespanHours = + { $num -> + [one] { $num } eur + [two] { $num } eur + [few] { $num } eur + [many] { $num } a eurioù + *[other] { $num } eur + } +copiedUrl = Eilet! +unlockInputPlaceholder = Ger-tremen +unlockButtonLabel = Dibrennañ +downloadButtonLabel = Pellgargañ +downloadFinish = Pellgargadur echu +fileSizeProgress = ({ $partialSize } war { $totalSize }) +sendYourFilesLink = Esaeit Send +errorPageHeader = Degouezhet ez eus bet ur fazi! +fileTooBig = Re vras eo ar restr-mañ evit e pellgas. Rankout a ra bezañ nebeutoc'h eget { $size } +linkExpiredAlt = Ere diamzeret +notSupportedHeader = N'eo ket skoret ho merdeer. +notSupportedLink = Perak n'eo ket skoret ma merdeer? +notSupportedOutdatedDetail = Siwazh n'eo ket skoret ar c'halvezerezhioù implijet evit Send gant an handelv-mañ eus Firefox. Ret e vo deoc'h hizivaat ho merdeer. +updateFirefox = Hizivaat Firefox +deletePopupCancel = Nullañ +deleteButtonHover = Dilemel +passwordTryAgain = Ger-tremen direizh. Klaskit en-dro. +javascriptRequired = Send a azgoulenn Javascript +whyJavascript = Perak e azgoulenn Send Javascript? +enableJavascript = Gweredekait Javascript ha klaskit en-dro. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }e { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Hirder brasañ aotreet evit ar ger-tremen: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = N'haller ket despizañ ar ger-tremen + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Rannañ restroù en un doare eeun ha prevez +introDescription = A-drugarez da { -send-brand } a c'hallit rannañ restroù gant un enrinegañ penn-ouzh-penn hag un ere a ziamzero ent emgefreek. Evel-se e c'hallit mirout ar pezh a rannit prevez ha bezañ sur ne chomo ket ho traoù enlinenn da viken. +notifyUploadEncryptDone = Enrineget eo ho restr ha prest eo da vezañ kaset +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Diamzeriñ a raio goude { $downloadCount } pe { $timespan } +timespanMinutes = + { $num -> + [one] { $num } vunutenn + [two] { $num } vunutenn + [few] { $num } munutenn + [many] { $num } a vunutennoù + *[other] { $num } munutenn + } +timespanDays = + { $num -> + [one] { $num } devezh + [two] { $num } zevezh + [few] { $num } devezh + [many] { $num } a zevezhioù + *[other] { $num } devezh + } +timespanWeeks = + { $num -> + [one] { $num } sizhun + [two] { $num } sizhun + [few] { $num } sizhun + [many] { $num } a sizhunioù + *[other] { $num } sizhun + } +fileCount = + { $num -> + [one] { $num } restr + [two] { $num } restr + [few] { $num } restr + [many] { $num } a restroù + *[other] { $num } restr + } +# byte abbreviation +bytes = e +# kibibyte abbreviation +kb = Ke +# mebibyte abbreviation +mb = Me +# gibibyte abbreviation +gb = Ge +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ment hollek: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Eilit an ere evit rannañ ho restr +copyLinkButton = Eilañ an ere +downloadTitle = Pellgargañ ar restroù +downloadDescription = Dre { -send-brand } eo bet rannet ar restr-mañ, gant un enrinegañ penn-ouzh-penn hag un ere a ziamzer ent emgefreek. +trySendDescription = Esaeit { -send-brand } evit rannañ restroù en un doare eeun ha prevez. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] N'haller pellgas nemet { $count } restr er memes mare. + [two] N'haller pellgas nemet { $count } restr er memes mare. + [few] N'haller pellgas nemet { $count } restr er memes mare. + [many] N'haller pellgas nemet { $count } a restroù er memes mare. + *[other] N'haller pellgas nemet { $count } restr er memes mare. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Aotreet eo{ $count } diell nemetken. + [two] Aotreet eo{ $count } ziell nemetken. + [few] Aotreet eo{ $count } diell nemetken. + [many] Aotreet eo{ $count } a zielloù nemetken. + *[other] Aotreet eo{ $count } diell nemetken. + } +expiredTitle = Diamzeret eo an ere. +notSupportedDescription = { -send-brand } n'aio ket en-dro war ar merdeer-mañ. { -send-short-brand } a za en-dro gwelloc'h gant handelv diwezhañ { -firefox }, ha mont a raio en-dro gant handelv bremanel lodenn vrasañ ar merdeerioù. +downloadFirefox = Pellgargañ { -firefox } +legalTitle = Evezhiadenn a fed buhez prevez { -send-short-brand } +legalDateStamp = Handelv 1.0, d'an 12 a viz Meurzh 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }e { $minutes }m +addFilesButton = Diuzit ur restr da bellgas +uploadButton = Pellgas +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Riklit ha laoskit restroù +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = pe klikit evit kas betek { $size } +addPassword = Gwareziñ gant ur ger-tremen +emailPlaceholder = Enankit ho chomlec'h postel +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kennaskit evit kas betek { $size } +signInOnlyButton = Kennaskañ +accountBenefitTitle = Krouit ur gont { -firefox } pe kennaskit +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Rannit restroù betek { $size } +accountBenefitDownloadCount = Rannit restroù gant muioc'h a dud +accountBenefitTimeLimit = + { $count -> + [one] Dalc'hit an ereoù oberiant e-pad { $count } devezh + [two] Dalc'hit an ereoù oberiant e-pad { $count } zevezh + [few] Dalc'hit an ereoù oberiant e-pad { $count } devezh + [many] Dalc'hit an ereoù oberiant e-pad { $count } a zevezhioù + *[other] Dalc'hit an ereoù oberiant e-pad { $count } devezh + } +accountBenefitSync = Merit ar restroù rannet gant forzh peseurt trevnad +accountBenefitMoz = Gouzout hiroc'h a-zivout gwazerezhioù all { -mozilla } +signOut = Digennaskañ +okButton = Mat eo +downloadingTitle = O pellgargañ +noStreamsWarning = Posupl eo ne vefe ket gouest ar merdeer-mañ da ezrinegañ ur restr ken bras. +noStreamsOptionCopy = Eilit an ere evit digeriñ anezhañ en ur merdeer all +noStreamsOptionFirefox = Esaeit hor merdeer karetañ +noStreamsOptionDownload = Kenderc'hel gant ar merdeer-mañ +downloadFirefoxPromo = { -send-short-brand } a zo kinniget deoc'h gant ar { -firefox } nevez-flamm. +# the next line after the colon contains a file name +shareLinkDescription = Rannit an ere etrezek ho restr: +shareLinkButton = Rannañ an ere +# $name is the name of the file +shareMessage = Pellgargañ "{ $name }" gant { -send-brand }: rannañ restroù en un doare eeun ha prevez +trailheadPromo = Un doare a zo da wareziñ ho puhez prevez. Tremenit da Firefox. +learnMore = Gouzout hiroc'h. diff --git a/public/locales/bs/send.ftl b/public/locales/bs/send.ftl index 38247465..2689c2a8 100644 --- a/public/locales/bs/send.ftl +++ b/public/locales/bs/send.ftl @@ -1,7 +1,5 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send +title = Send siteSubtitle = web eksperiment -siteFeedback = Povratne informacije uploadPageHeader = Privatno, šifrovano dijeljenje datoteka uploadPageExplainer = Pošaljite datoteke putem sigurne, privatne i šifrovane veze koja automatski ističe kako bi se osiguralo da vaše stvari ne ostaju na mreži zauvijek. uploadPageLearnMore = Saznajte više @@ -25,29 +23,46 @@ uploadingFileNotification = Obavijesti me kada otpremanje bude gotovo. uploadSuccessConfirmHeader = Spremno za slanje uploadSvgAlt = Otpremi uploadSuccessTimingHeader = Veza prema vašoj datoteci će isteći nakon prvog preuzimanja ili za 24 sata. +expireInfo = Link za vašu datoteku će isteći nakon { $downloadCount } ili { $timespan }. +downloadCount = + { $num -> + [one] 1 preuzimanja + [few] { $num } preuzimanja + *[other] { $num } preuzimanja + } +timespanHours = + { $num -> + [one] 1 sat + [few] { $num } sata + *[other] { $num } sati + } copyUrlFormLabelWithName = Iskopirajte i podijelite vezu da biste poslali datoteku: { $filename } copyUrlFormButton = Kopiraj u međuspremnik copiedUrl = Kopirano! deleteFileButton = Izbriši datoteku sendAnotherFileLink = Pošalji drugu datoteku -// Alternative text used on the download link/button (indicates an action). +# Alternative text used on the download link/button (indicates an action). downloadAltText = Preuzmi +downloadsFileList = Preuzimanja +# Used as header in a column indicating the amount of time left before a +# download link expires (e.g. "10h 5m") +timeFileList = Vrijeme +# Used as header in a column indicating the number of times a file has been +# downloaded downloadFileName = Preuzmi { $filename } downloadFileSize = ({ $size }) unlockInputLabel = Unesite lozinku unlockInputPlaceholder = Lozinka unlockButtonLabel = Otključaj downloadFileTitle = Preuzmi šifrovanu datoteku -// Firefox Send is a brand name and should not be localized. -downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Firefox Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu. -// Text and title used on the download link/button (indicates an action). +downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu. +# Text and title used on the download link/button (indicates an action). downloadButtonLabel = Preuzmi downloadNotification = Vaše preuzimanje je završeno. downloadFinish = Preuzimanje završeno -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } od { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Probajte Firefox Send +sendYourFilesLink = Probajte Send downloadingPageProgress = Preuzimanje { $filename } ({ $size }) downloadingPageMessage = Ostavite ovaj tab otvorenim dok ne dobavimo vašu datoteku i dok je ne dešifrujemo. errorAltText = Greška pri otpremanju @@ -58,34 +73,43 @@ fileTooBig = Ta datoteka je prevelika za otpremanje. Treba biti manja od { $size linkExpiredAlt = Veza istekla expiredPageHeader = Veza je istekla ili nikad nije postojala! notSupportedHeader = Vaš pretraživač nije podržan. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Firefox Send. Trebate probati drugi pretraživač. Preporučujemo Firefox! +notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Send. Trebate probati drugi pretraživač. Preporučujemo Firefox! notSupportedLink = Zašto moj pretraživač nije podržan? -notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Firefox Send. Morate ažurirati vaš pretraživač. +notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Send. Morate ažurirati vaš pretraživač. updateFirefox = Ažuriraj Firefox downloadFirefoxButtonSub = Besplatno preuzimanje uploadedFile = Datoteka copyFileList = Kopiraj URL -// expiryFileList is used as a column header +# expiryFileList is used as a column header expiryFileList = Ističe za deleteFileList = Izbriši nevermindButton = Zanemari legalHeader = Uslovi i privatnost -legalNoticeTestPilot = Firefox Send je trenutno Test Pilot eksperiment i podržan je uslovima korištenja i obavještenjem o privatnosti. Možete saznati više o ovom eksperimentu i o njegovom sakupljanju podataka ovdje. -legalNoticeMozilla = Korištenje Firefox Send web stranice podlaže Mozillinom obavještenju o privatnosti na web stranicama i uslovima korištenja web stranica. +legalNoticeTestPilot = Send je trenutno Test Pilot eksperiment i podržan je uslovima korištenja i obavještenjem o privatnosti. Možete saznati više o ovom eksperimentu i o njegovom sakupljanju podataka ovdje. +legalNoticeMozilla = Korištenje Send web stranice podlaže Mozillinom obavještenju o privatnosti na web stranicama i uslovima korištenja web stranica. deletePopupText = Izbrisati ovu datoteku? deletePopupYes = Da deletePopupCancel = Otkaži deleteButtonHover = Izbriši copyUrlHover = Kopiraj URL -footerLinkLegal = Pravno -// Test Pilot is a proper name and should not be localized. +# Test Pilot is a proper name and should not be localized. footerLinkAbout = O Test Pilotu -footerLinkPrivacy = Privatnost footerLinkTerms = Uslovi -footerLinkCookies = Kolačići requirePasswordCheckbox = Zahtjevaj lozinku za preuzimanje ove datoteke addPasswordButton = Dodaj lozinku +changePasswordButton = Promijeni passwordTryAgain = Netačna lozinka. Pokušajte ponovo. -// This label is followed by the password needed to download a file -passwordResult = Lozinka: { $password } +reportIPInfringement = Prijavite IP prekršaj +javascriptRequired = Send zahtjeva JavaScript +whyJavascript = Zašto Send zahtjeva JavaScript? +enableJavascript = Molimo omogućite JavaScript i pokušajte ponovo. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when a password is successfully set +passwordIsSet = Lozinka postavljena +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna veličina lozinke: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ova lozinka se ne može postaviti diff --git a/public/locales/ca/send.ftl b/public/locales/ca/send.ftl index b5dac5f2..e1e4783a 100644 --- a/public/locales/ca/send.ftl +++ b/public/locales/ca/send.ftl @@ -1,82 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experiment web -siteFeedback = Comentaris -uploadPageHeader = Compartició de fitxers privada i xifrada -uploadPageExplainer = Envieu fitxers mitjançant un enllaç segur, privat i xifrat que caduca automàticament per tal que les vostres dades no es conservin a Internet per sempre. -uploadPageLearnMore = Més informació -uploadPageDropMessage = Arrossegueu el fitxer aquí per començar a pujar-lo -uploadPageSizeMessage = Funciona millor quan els fitxers tenen menys d'1 GB -uploadPageBrowseButton = Trieu un fitxer de l'ordinador -uploadPageBrowseButton1 = Seleccioneu el fitxer que voleu pujar -uploadPageMultipleFilesAlert = Actualment no es permet pujar diversos fitxers ni una carpeta. -uploadPageBrowseButtonTitle = Puja el fitxer -uploadingPageProgress = S'està pujant { $filename } ({ $size }) +title = Send importingFile = S'està important… -verifyingFile = S'està verificant… encryptingFile = S'està xifrant… decryptingFile = S'està desxifrant… -notifyUploadDone = La pujada ha acabat. -uploadingPageMessage = Quan s'hagi acabat de pujat el fitxer, podreu definir les opcions de caducitat. -uploadingPageCancel = Cancel·la la pujada -uploadCancelNotification = La pujada s'ha cancel·lat. -uploadingPageLargeFileMessage = Aquest fitxer és gros i pot trigar una estona a pujar. Espereu assegut… -uploadingFileNotification = Notifica'm quan s'acabi de pujar. -uploadSuccessConfirmHeader = Llest per enviar -uploadSvgAlt = Puja -uploadSuccessTimingHeader = L'enllaç al fitxer caducarà quan es baixi una vegada o d'aquí 24 hores. -copyUrlFormLabelWithName = Copieu l'enllaç i compartiu-lo per enviar el fitxer: { $filename } -copyUrlFormButton = Copia al porta-retalls +downloadCount = + { $num -> + [one] 1 baixada + *[other] { $num } baixades + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } hores + } copiedUrl = Copiat! -deleteFileButton = Suprimeix el fitxer -sendAnotherFileLink = Envieu un altre fitxer -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Baixa -downloadFileName = Baixeu { $filename } -downloadFileSize = ({ $size }) -// Firefox Send is a brand name and should not be localized. -downloadMessage = Un amic us ha enviat un fitxer amb el Firefox Send, un servei que permet compartir fitxers mitjançant un enllaç segur, privat i xifrat que caduca automàticament per tal que les vostres dades no es conservin a Internet per sempre. -// Text and title used on the download link/button (indicates an action). +unlockInputPlaceholder = Contrasenya +unlockButtonLabel = Desbloca downloadButtonLabel = Baixa -downloadNotification = La baixada ha acabat. downloadFinish = Ha acabat la baixada -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Proveu el Firefox Send -downloadingPageProgress = S'està baixant { $filename } ({ $size }) -downloadingPageMessage = Deixeu aquesta pestanya oberta per tal que el fitxer es pugui baixar i desxifrar. -errorAltText = S'ha produït un error en pujar +sendYourFilesLink = Proveu el Send errorPageHeader = Hi ha hagut un problema -errorPageMessage = S'ha produït un error en pujar el fitxer. -errorPageLink = Envieu un altre fitxer fileTooBig = Aquest fitxer és massa gros per pujar-lo. Ha de tenir menys de { $size }. linkExpiredAlt = L'enllaç ha caducat -expiredPageHeader = Aquest enllaç ha caducat o no existeix. notSupportedHeader = El vostre navegador no és compatible. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Aquest navegador no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'utilitzar un altre navegador. Us recomanem el Firefox! notSupportedLink = Per què el meu navegador no és compatible? -notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'actualitzar el navegador. +notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Send. Haureu d'actualitzar el navegador. updateFirefox = Actualitza el Firefox -downloadFirefoxButtonSub = Baixada gratuïta -uploadedFile = Fitxer -copyFileList = Copia l'URL -// expiryFileList is used as a column header -expiryFileList = Caduca d'aquí -deleteFileList = Suprimeix -nevermindButton = No, gràcies -legalHeader = Condicions d'ús i privadesa -legalNoticeTestPilot = Actualment el Firefox Send és un experiment del Test Pilot i està subjecte a les Condicions del servei i a l'Avís de privadesa del Test Pilot. Podeu obtenir més informació sobre aquest experiment i la recollida de dades aquí. -legalNoticeMozilla = L'ús del Firefox Send també està subjecte a l'Avís de privadesa de llocs web i a les Condicions d'ús de llocs web de Mozilla. -deletePopupText = Voleu suprimir aquest fitxer? -deletePopupYes = Sí deletePopupCancel = Cancel·la deleteButtonHover = Suprimeix -copyUrlHover = Copia l'URL -footerLinkLegal = Avís legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Quant al Test Pilot -footerLinkPrivacy = Privadesa -footerLinkTerms = Condicions d'ús -footerLinkCookies = Galetes +passwordTryAgain = La contrasenya és incorrecta. Torneu-ho a provar. +javascriptRequired = El Send necessita JavaScript +whyJavascript = Per què el Send necessita JavaScript? +enableJavascript = Activeu el JavaScript i torneu-ho a provar. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud màxima de la contrasenya: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No s'ha pogut definir la contrasenya + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartició de fitxers senzilla i privada +introDescription = El { -send-brand } permet compartir fitxers amb xifratge d'extrem a extrem mitjançant un enllaç que caduca automàticament. Per tant, us assegureu que tot allò que compartiu és privat i que no es mantindrà a Internet per sempre. +notifyUploadEncryptDone = El fitxer s'ha xifrat i està llest per enviar-se +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca després de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + *[other] { $num } minuts + } +timespanDays = + { $num -> + [one] 1 dia + *[other] { $num } dies + } +timespanWeeks = + { $num -> + [one] 1 setmana + *[other] { $num } setmanes + } +fileCount = + { $num -> + [one] 1 fitxer + *[other] { $num } fitxers + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Mida total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copieu l'enllaç per compartir el fitxer: +copyLinkButton = Copia l'enllaç +downloadTitle = Baixa els fitxers +downloadDescription = Aquest fitxer s'ha compartit mitjançant el { -send-brand } amb xifratge d'extrem a extrem i un enllaç que caduca automàticament. +trySendDescription = Proveu el { -send-brand } per compartir fitxers de forma senzilla i privada. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Només es pot pujar 1 fitxer alhora. + *[other] Només es poden pujar { $count } fitxers alhora. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Només es permet 1 fitxer. + *[other] Només es permeten { $count } fitxers. + } +expiredTitle = Aquest enllaç ha caducat. +notSupportedDescription = El { -send-brand } no funcionarà amb aquest navegador. El { -send-short-brand } funciona millor amb l'última versió del { -firefox } i funcionarà amb la versió més recent de la majoria de navegadors. +downloadFirefox = Baixa el { -firefox } +legalTitle = Avís de privadesa del { -send-short-brand } +legalDateStamp = Versió 1.0, amb data del 12 de març de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min +addFilesButton = Seleccioneu els fitxers que voleu pujar +uploadButton = Puja +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrossegueu i deixeu anar els fitxers +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o feu clic aquí per enviar fins a { $size } +addPassword = Protegeix amb contrasenya +emailPlaceholder = Introduïu la vostra adreça electrònica +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Inicieu la sessió per enviar fins a { $size } +signInOnlyButton = Inicia la sessió +accountBenefitTitle = Creeu un compte del { -firefox } o inicieu la sessió +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartiu fitxers fins a { $size } +accountBenefitDownloadCount = Compartiu fitxers amb més persones +accountBenefitTimeLimit = + { $count -> + [one] Manteniu els enllaços actius fins a 1 dia + *[other] Manteniu els enllaços actius fins a { $count } dies + } +accountBenefitSync = Gestioneu els fitxers compartits des de qualsevol dispositiu +accountBenefitMoz = Descobriu els altres serveis de { -mozilla } +signOut = Tanca la sessió +okButton = D'acord +downloadingTitle = S'està baixant +noStreamsWarning = Pot ser que aquest navegador no pugui desxifrar un fitxer tan gran. +noStreamsOptionCopy = Copieu l'enllaç per obrir-lo en un altre navegador +noStreamsOptionFirefox = Proveu el nostre navegador preferit +noStreamsOptionDownload = Segueix amb aquest navegador +downloadFirefoxPromo = El nou { -firefox } us ofereix el { -send-short-brand } +# the next line after the colon contains a file name +shareLinkDescription = Compartiu l'enllaç al vostre fitxer: +shareLinkButton = Comparteix l'enllaç +# $name is the name of the file +shareMessage = Baixeu «{ $name }» amb el { -send-brand }: compartició de fitxers senzilla i segura +trailheadPromo = Hi ha una manera de protegir la vostra privadesa. Uniu-vos al Firefox. +learnMore = Més informació. diff --git a/public/locales/cak/send.ftl b/public/locales/cak/send.ftl index 47a9906b..b64f0500 100644 --- a/public/locales/cak/send.ftl +++ b/public/locales/cak/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ajk'amaya'l solna'onem -siteFeedback = Rutzijol -uploadPageHeader = Kekomonïx Ichinan chuqa' Ewan Kisik'ixik taq Yakb'äl -uploadPageExplainer = Ketaq taq yakb'äl rik'in jun ewan rusik'ixik, ichinan chuqa' jikon ximonel, ri ruyonil xtikis ruq'ijul richin ke ri' ri taq atzij man e okel ta pa k'amaya'l junelïk. -uploadPageLearnMore = Tetamäx ch'aqa' chik -uploadPageDropMessage = Tajik'a' pe ri ayakb'al wawe' richin nachäp kijotob'axik -uploadPageSizeMessage = Richin chi ütz nel ri samaj, k'o ta chi ri yakb'äl man tik'o chi re ri 1GB -uploadPageBrowseButton = Tacha' jun yakb'äl pan akematz'ib' -uploadPageBrowseButton1 = Tacha' jun yakb'äl richin najotob'a' -uploadPageMultipleFilesAlert = K'a man nuk'öch ta nijotob'äx jalajöj yakb'äl o jun molwuj. -uploadPageBrowseButtonTitle = Tijotob'äx yakb'äl -uploadingPageProgress = Tajin nijotob'äx { $filename } ({ $size }) +title = Send importingFile = Tajin nijik… -verifyingFile = Tajin nijikib'äx... -encryptingFile = Tajin newäx rusik'ixik... +encryptingFile = Tajin newäx rusik'ixik… decryptingFile = Tajin netamäx rusik'ixik... -notifyUploadDone = Xak'is rujotob'axik. -uploadingPageMessage = Toq xtijotob'äx ri yakb'äl xkatikïr xtak'ëx pa taq cha'oj ri ruq'ijul xtik'is. -uploadingPageCancel = Tiq'at jotob'anïk -uploadCancelNotification = Xq'at ri ajotob'anik -uploadingPageLargeFileMessage = Yalan nïm re yakb'äl re' ruma ri' toq xtiyoke' richin xtijote'. ¡Man tik'o ak'u'x! -uploadingFileNotification = Tiya' pe rutzijol chwe toq xtitz'aqät rujotob'axik. -uploadSuccessConfirmHeader = Ütz chik richin Nitaq -uploadSvgAlt = Tijotob'äx -uploadSuccessTimingHeader = Ri ruximonel yakb'äl xtik'is ruq'ijul toq xtiqasäx jumul o pa 24 ramaj. -copyUrlFormLabelWithName = Tiwachib'ëx chuqa' tikomonïx ri ximonel richin nitaq ri ayakb'äl: { $filename } -copyUrlFormButton = Tiwachib'ëx pa molwuj +downloadCount = + { $num -> + [one] 1 qasanïk + *[other] { $num } taq qasanïk + } +timespanHours = + { $num -> + [one] 1 ramaj + *[other] { $num } taq ramaj + } copiedUrl = ¡Xwachib'ëx! -deleteFileButton = Tiyuj yakb'äl -sendAnotherFileLink = Titaq jun chik yakb'äl -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Tiqasäx -downloadFileName = Tiqasäx { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Titz'ib'äx Ewan Tzij unlockInputPlaceholder = Ewan tzij unlockButtonLabel = Titzij chik -downloadFileTitle = Tiqasäx Yakb'äl Ewan Rusik'ixik -// Firefox Send is a brand name and should not be localized. -downloadMessage = Jun awachib'il xutäq jun yakb'äl chawe rik'in ri Firefox Send, jun samaj ri nuya' q'ij chawe ye'akomonij taq yakb'äl rik'in jun jikïl, ichinan chuqa' ewan rusik'ixik ximonel, ri nik'is ruq'ijul pa ruyonil richin chi ri taq awachinaq man junelïk ta e okel pa k'amab'ey. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Tiqasäx -downloadNotification = Xtz'aqät ri aqasanik. downloadFinish = Xtz'aqät qasanïk -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } richin { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Titojtob'ëx Firefox Send -downloadingPageProgress = Tajin niqasäx { $filename } ({ $size }) -downloadingPageMessage = Tijaq kan re ruwi' re' richin niqaqasaj ri yakb'äl chuqa' richin niqetamaj rusik'ixik. -errorAltText = Xsach toq nijotob'äx +sendYourFilesLink = Titojtob'ëx Send errorPageHeader = ¡K'o ri man ütz ta xub'än! -errorPageMessage = Xk'ulwachitäj jun sachoj toq tajin nijotob'äx ri yakb'äl. -errorPageLink = Titaq jun chik yakb'äl fileTooBig = Yalan nïm re yakb'äl re' richin nijotob'äx. K'o ta chi man nik'o ta chi re ri { $size }. linkExpiredAlt = Xk'is ruq'ijul ri ximonel -expiredPageHeader = ¡Xk'is ruq'ijul re ximonel re' o rik'in jub'a' majub'ey xk'oje'! notSupportedHeader = Man koch'el ta ri awokik'amaya'l. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = K'ayew ruma re okik'amaya'l re' man nuköch' ta ajk'amaya'l na'ob'äl nik'atzin chi re ri Firefox Send. K'o chi natojtob'ej jun chik okik'amaya'l. ¡Niqachilab'ej chawe ri Firefox! notSupportedLink = ¿Achike ruma man nikoch' taq ri wokik'amaya'l? -notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Firefox Send. Rajowaxik nak'ëx ri awokik'amaya'l. +notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Send. Rajowaxik nak'ëx ri awokik'amaya'l. updateFirefox = Tik'ex ri Firefox -downloadFirefoxButtonSub = Sipan Ruqasaxik -uploadedFile = Yakb'äl -copyFileList = Tiwachib'ëx URL -// expiryFileList is used as a column header -expiryFileList = Nik'is Ruq'ijul Pa -deleteFileList = Tiyuj -nevermindButton = Junam nub'än -legalHeader = Ojqanem chuqa' Ichinanem -legalNoticeTestPilot = Firefox Send k'a jun rutojtob'enik Test Pilot, chuqa' rutaqen rutzij ri Rojqanem Samaj chuqa' rik'in ri Rutzijol Ichinanem. Yatikïr nawetamaj ch'aq'a' chik chi rij re solna'oj re' chuqa' ri rumolik tzij wawe'. -legalNoticeMozilla = Richin nokisäx ri ruxaq ruk'amaya'l Firefox Send k'o chi nitaqëx ri Rutzijol Richinanem Ajk'amaya'l Ruxaq chuqa' Rojqanem rokisaxik Ajk'amaya'l Ruxaq. -deletePopupText = ¿La niyuj el re yakb'äl re'? -deletePopupYes = Ja' deletePopupCancel = Tiq'at deleteButtonHover = Tiyuj -copyUrlHover = Tiwachib'ëx URL -footerLinkLegal = Taqanel tzijol -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Chi rij Test Pilot -footerLinkPrivacy = Ichinanem -footerLinkTerms = Taq ojqanem -footerLinkCookies = Taq kaxlanwey -requirePasswordCheckbox = Tik'utüx jun ewan tzij richin niqasäx re yakb'äl re' -addPasswordButton = Titz'aqatisäx Ewan Tzij passwordTryAgain = Itzel ri ewan tzij. Tatojtob'ej chik. -// This label is followed by the password needed to download a file -passwordResult = Ewan tzij: { $password } +javascriptRequired = K'atzinel JavaScript chi re ri Send +whyJavascript = ¿Achike ruma toq ri Send nrajo' JavaScript? +enableJavascript = Titz'ij JavaScript richin nitojtob'ëx chik. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }r { $minutes }ch +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ch +# A short status message shown when the user enters a long password +maxPasswordLength = Nïm raqän ewan tzij: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Man tikirel ta ninuk' re ewan tzij re' + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Titaq +-firefox = Firefox +-mozilla = Mozilla +introTitle = Kijunamaxik relik chuqa' ichinan yakb'äl +introDescription = { -send-brand } nuya' q'ij chawe ye'akomonij taq yakb'äl ri ewan kisik'ixik chijun chuqa' jun ximonel ri nik'is ruq'ijul pa ruyonil. Ke ri' nawichinaj ronojel ri nakomonij chuqa' yajike' chi ronojel ri taq awachinaq man jumul ta kek'oje' pa k'amab'ey. +notifyUploadEncryptDone = Ewan chik rusik'ixik ri ayakb'al chuqa' ütz chik richin nitaq +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Nik'is ruq'ij chi rij { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 ch'utiramaj + *[other] { $num } taq ch'utiramaj + } +timespanDays = + { $num -> + [one] 1 q'ij + *[other] { $num } taq q'ij + } +timespanWeeks = + { $num -> + [one] 1 wuqq'ij + *[other] { $num } taq wuqq'ij + } +fileCount = + { $num -> + [one] 1 yakb'äl + *[other] { $num } taq yakb'äl + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ronojel runimilem: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Tawachib'ej ri ximonel richin nakomonij ri ayakb'al: +copyLinkButton = Tiwachib'ëx ximonel +downloadTitle = Keqasäx taq yakb'äl +downloadDescription = Xkomonïx re yakb'äl re' pa { -send-brand } rik'in chijun ewan rusik'ixik chuqa' nik'is ruq'ijul pa ruyonil. +trySendDescription = Tatojtob'ej { -send-brand } richin chanin chuqa' jikïl ye'akomonij taq yakb'äl. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Xa xe 1 yakb'äl tikirel nijotob'äx pa ri ramaj. + *[other] Xa xe { $count } taq yakb'äl tikirel yejotob'äx pa ri ramaj. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Xa xe 1 yakb'äl niya' q'ij chi re. + *[other] Xa xe { $count } taq yakb'äl niya' q'ij chi ke. + } +expiredTitle = Xk'is yan ruq'ij re ximonel re'. +notSupportedDescription = Man xtisamäj ta ri { -send-brand } rik'in re okik'amaya'l re'. Nisamäj ütz ri { -send-short-brand } rik'in ri ruk'isib'äl ruwäch { -firefox }, chuqa' xtisamäj rik'in ri ruwäch k'o wakami pa ronojel okik'amaya'l. +downloadFirefox = Tiqasäx { -firefox } +legalTitle = Rutzijol Richinanem { -send-short-brand } +legalDateStamp = Ruwäch 1.0, ruq'ijul marso 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }q { $hours }r { $minutes }ch' +addFilesButton = Kecha' taq yakb'äl richin yejotob'äx +uploadButton = Tijotob'äx +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Keqirirëx chuqa' ke'osq'opïx taq yakb'äl +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o tapitz'a' richin natäq k'a { $size } +addPassword = Tichajïx rik'in ewan tzij +emailPlaceholder = Tatz'ib'aj ataqoya'l +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Tatikirisaj molojri'ïl richin natäq k'a { $size } +signInOnlyButton = Titikirisäx molojri'ïl +accountBenefitTitle = Tatz'uku' jun { -firefox } Rub'i' Ataqoy'al o Tatikirisaj molojri'ïl +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ke'akomonij taq yakb'äl k'a { $size } +accountBenefitDownloadCount = Ke'akomonij taq yakb'äl kik'in ch'aqa' chik winaqi' +accountBenefitTimeLimit = + { $count -> + [one] Ke' atzija' ri taq ximonel chi 1 q'ij + *[other] Ke'atzija' ri taq ximonel chi { $count } taq q'ij + } +accountBenefitSync = Ke'anuk'samajij komonin taq yakb'äl pa xab'achike okisab'äl +accountBenefitMoz = Tawetamaj chij ch'aqa' chik { -mozilla } taq samaj +signOut = Titz'apïx molojri'ïl +okButton = ÜTZ +downloadingTitle = Niqasäx +noStreamsWarning = Rik'in jub'a' re okik'amaya'l re' man nitikïr ta nretamaj rusik'ixik nima'q taq yakb'äl. +noStreamsOptionCopy = Tiwachib'ëx ri ximonel richin nijaq pa jun chik okik'amaya'l +noStreamsOptionFirefox = Tatojtob'ej ri jeb'ël qokik'amaya'l +noStreamsOptionDownload = Kisamäj na rik'in re okik'amaya'l re' +downloadFirefoxPromo = Ja ri k'ak'a' { -firefox } nusüj ri { -send-short-brand } chawe. +# the next line after the colon contains a file name +shareLinkDescription = Nakomonij ri ximonel rik'in ri awokisab'al: +shareLinkButton = Tikomonïx ximonel +# $name is the name of the file +shareMessage = Tiqasäx "{ $name }" rik'in { -send-brand }: man k'ayew ta chuqa' ütz kikomonik ri yakb'äl +trailheadPromo = K'o jun rub'anikil richin nachajij ri awichinanem. Tatunu' awi' rik'in ri Firefox. +learnMore = Tetamäx ch'aqa' chik. diff --git a/public/locales/ckb/send.ftl b/public/locales/ckb/send.ftl new file mode 100644 index 00000000..c37a4094 --- /dev/null +++ b/public/locales/ckb/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = هاوردەکردن... +encryptingFile = بەهێماکردن... +decryptingFile = هێمالابردن... +downloadCount = + { $num -> + [one] 1 داگرتن + *[other] { $num } داگرتن + } +timespanHours = + { $num -> + [one] 1 کاژێر + *[other] { $num } کاژێر + } +copiedUrl = لەبەرگیرا! +unlockInputPlaceholder = وشەی تێپەڕبوون +unlockButtonLabel = کردنەوە +downloadButtonLabel = داگرتن +downloadFinish = داگرتن تەواو بوو +fileSizeProgress = ({ $partialSize } لە { $totalSize }) +sendYourFilesLink = Firefox ناردن تاقیبکەرەوە +errorPageHeader = هەڵەیەک ڕوویدا +fileTooBig = ئەم پەڕگەیە زۆر گەورەیە بۆ بارکردن. پێویستە لە { $size } بچووک تر بێت +linkExpiredAlt = بەستەر بەسەرچووە +notSupportedHeader = وێبگەڕەکەت پشتگیری ناکرێت +notSupportedLink = بۆ وێبگەڕەکەم پشتگیری ناکرێت؟ +notSupportedOutdatedDetail = بەداخەوە ئەم وەشانەی Firefox پشتگیری ئەو جۆرە تەکنەلۆژییە ناکات کە پێویستە بۆ Send. پێویستە وێبگەڕەکەت نوێبکەیتەوە. +updateFirefox = فاەرفۆکس نوێبکەرەوە +deletePopupCancel = پاشگەزبوونەوە +deleteButtonHover = سڕینەوە +passwordTryAgain = وشەی تێپەڕبوون هەڵەیە. هەوڵ بدەرەوە. +javascriptRequired = فارفۆکسی ناردن پێویستە بە JavaScript هەیە +whyJavascript = بۆچی پێویستی بە JavaScript هەیە؟ +enableJavascript = تکایە JavaScript چالاک بکە وهەوڵ بدەرەوە. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ک { $minutes }خ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }خ +# A short status message shown when the user enters a long password +maxPasswordLength = زۆرترین درێژی وشەی تێپەڕی ڕێگەپێدراو: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ناتوانرێت وشەی تێپەڕ دابنرێت + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = سانا، بڵاوکەرەوەی پەڕگەی تایبەتیی +introDescription = { -send-brand } ڕێگەت دەدات پەڕگەکان بڵاوبکەیتەوە بە شێوەی هێما کردنی کۆتا-بۆ-کۆتا و بەستەرێک کە خۆکارانە بەسەردەچێت. بۆیە دەتوانیت ئاگاداری ئەوە بیت کە چ پەڕگەیەک بە تایبەتی بڵاودەکەیتەوە و دڵنیادەبیتەوە کە شتەکانت بە سەرهێڵی نامێننەوە هەتا کۆتایی. +notifyUploadEncryptDone = پەڕگەیە بەهێماکراوە ئێستا ئامادەیە بۆ ناردن +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = بەسەردەچێت دووای { $downloadCount } یان { $timespan } +timespanMinutes = + { $num -> + [one] 1 خولەک + *[other] { $num } خولەک + } +timespanDays = + { $num -> + [one] 1 ڕؤژ + *[other] { $num } ڕۆژ + } +timespanWeeks = + { $num -> + [one] 1 هەفتە + *[other] { $num } هەفتە + } +fileCount = + { $num -> + [one] 1 پەڕگە + *[other] { $num } پەڕگە + } +# byte abbreviation +bytes = بایت +# kibibyte abbreviation +kb = ک.بایت +# mebibyte abbreviation +mb = م.بایت +# gibibyte abbreviation +gb = گ.بایت +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = قەبارەی گشتی: { $size } +# the next line after the colon contains a file name +copyLinkDescription = بەستەر لەبەربگرەوە بۆ بڵاوکردنەوەی پەڕگە: +copyLinkButton = بەستەر لەبەربگرەوە +downloadTitle = پەڕگەکان دابگرە +downloadDescription = ئەم پەڕگەیە لە لایەن { -send-brand } بلاوکراوەتەوە کە بەهێماکراوە بە شێوەی کۆتا-بۆ-کۆتا بە بەستەرێک کە خۆکارانە بەسەردەچێت. +trySendDescription = { -send-brand } تاقیبکەرەوە بۆ سانایی، پارێزراو لە بڵاوکردنەوەی پەڕگە. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] تەنها 1 پەڕگە دەتوانیت باربکەیت لەم کاتەدا. + *[other] تەنها { $count } پەڕگە دەتوانی باربکەیت لەم کاتەدا. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] تەنها 1 ئەرشیف ڕێپێدراوە. + *[other] تەنها { $count } ئەرشیف ڕێپێدراوە. + } +expiredTitle = بەستەر بەسەرچووە. +notSupportedDescription = { -send-brand } کارنکات لەگەڵ ئەم وێبگەڕە. { -send-short-brand } باش کاردەکات لەگەڵ کۆتا وەشانی { -firefox }، وکاردەکات لەگەڵ زۆربەی وەشانی ئێستای وێبگەڕەکان. +downloadFirefox = { -firefox } دابگرە +legalTitle = تێبینی تایبەتیی { -send-short-brand } +legalDateStamp = وەشان 1.0، بەروار کراو لە 12 ئازار، 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ڕ { $hours } ک{ $minutes } خ +addFilesButton = پەڕگەکان هەڵبژێرە بۆ بارکردن +uploadButton = بارکردن +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ڕاکێشان و دانانی پەڕگەکان +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = یان کرتە بکە بۆ ناردنی قەبارەی تاوەکوو { $size } +addPassword = بپارێزە لەگەڵ وشەی تێپەڕ +emailPlaceholder = پۆستی ئەلکترۆنی بنووسە +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = بچۆژوورەوە بۆ ناردنی قەبارەی تاوەکوو { $size } +signInOnlyButton = بچۆژوورەوە +accountBenefitTitle = هەژماری { -firefox } درووست بکە یان بچۆژوورەوە +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = پەڕگە بڵاوبکەرەوە تاوەکوو قەبارەی { $size } +accountBenefitDownloadCount = پەڕگەکان لەگەڵ خەڵکی زیاتر بڵاوبکەرەوە +accountBenefitTimeLimit = + { $count -> + [one] بەستەرەکان بەکارایی بهێڵەوە تا 1 ڕۆژ + *[other] بەستەرەکان بەکارایی بهێڵەوە تا { $count } ڕۆژ + } +accountBenefitSync = پەڕگە بڵآوکراوەکان بەڕێوەبەرە لەهەر ئامێرێکەوە +accountBenefitMoz = زیاتر بزانە دەربارەی خزمەتگوزارییەکانی تری { -mozilla } +signOut = بچۆ دەرەوە +okButton = باشە +downloadingTitle = دادەگیرێت... +noStreamsWarning = لەوانەیە ئەم وێبگەڕە نەتوانێت پەڕگەی وا گەورە بە هێما بکات. +noStreamsOptionCopy = بەستەر لەبەربگرەوە بۆ کردنەوەی لە وێبگەڕێکی تر +noStreamsOptionFirefox = وێبگەڕی دڵخوازی ئێمە تاقیبکەرەوە +noStreamsOptionDownload = بەردەوام بە لەگەڵ ئەم وێبگەڕە +downloadFirefoxPromo = { -send-short-brand } پیشکەش کراوە بە تۆ لە لایەن { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = بەستەر بڵاوبکەرەوە بۆ پەڕگەکەت: +shareLinkButton = بەستەر بڵاوبکەرەوە +# $name is the name of the file +shareMessage = “{ $name }” دابگرە لەگەڵ { -send-brand }: سانا، پاریزراو لە بڵاوکردنەوەی پەڕگە +trailheadPromo = ڕێگەیەک هەیە بۆ پارێزگاریکردنی تایبەتێتی خۆت. بەشدار بە لە فایەرفۆکس. +learnMore = زیاتر بزانە diff --git a/public/locales/cs/send.ftl b/public/locales/cs/send.ftl index d6005b1c..1b9b5d6b 100644 --- a/public/locales/cs/send.ftl +++ b/public/locales/cs/send.ftl @@ -1,91 +1,194 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webový experiment -siteFeedback = Zpětná vazba -uploadPageHeader = Soukromé a šifrované sdílení souborů -uploadPageExplainer = Posílejte soubory přes bezpečné, soukromé a šifrované odkazy, které automaticky soubor smažou, aby nezůstal na internetu navěky. -uploadPageLearnMore = Zjistit více -uploadPageDropMessage = Přesunutím souboru sem spustíte jeho nahrávání -uploadPageSizeMessage = Nahrávání funguje nejlépe pro soubory do velikosti 1 GB. -uploadPageBrowseButton = Vybrat soubor z počítače -uploadPageBrowseButton1 = Zvolte soubor k nahrání -uploadPageMultipleFilesAlert = Nahrávání více souborů najednou nebo celých složek zatím není podporováno. -uploadPageBrowseButtonTitle = Nahrát soubor -uploadingPageProgress = Nahrávání souboru { $filename } ({ $size }) +title = Send importingFile = Probíhá import… -verifyingFile = Probíhá ověřování… encryptingFile = Probíhá šifrování… decryptingFile = Probíhá dešifrování… -notifyUploadDone = Nahrávání vašeho souboru bylo dokončeno. -uploadingPageMessage = Po dokončení nahrávání můžete nastavit dobu expirace souboru. -uploadingPageCancel = Zrušit nahrávání -uploadCancelNotification = Nahrávání vašeho souboru bylo zrušeno. -uploadingPageLargeFileMessage = Tento soubor je veliký a jeho nahrávání může chvíli trvat. Posaďte se na chvilku. -uploadingFileNotification = Upozornit, až bude nahrávání dokončeno. -uploadSuccessConfirmHeader = Připraveno k odeslání -uploadSvgAlt = Nahrát -uploadSuccessTimingHeader = Platnost odkazu na váš soubor vyprší po jeho prvním stažení, nebo po 24 hodinách. -copyUrlFormLabelWithName = Zkopírujte a sdílejte odkaz na váš soubor: { $filename } -copyUrlFormButton = Zkopírovat do schránky +downloadCount = + { $num -> + [one] jednom stažení + [few] { $num } staženích + *[other] { $num } staženích + } +timespanHours = + { $num -> + [one] hodinu + [few] { $num } hodiny + *[other] { $num } hodin + } copiedUrl = Zkopírováno! -deleteFileButton = Smazat soubor -sendAnotherFileLink = Poslat další soubor -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Stáhnout -downloadFileName = Stáhnout { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Zadejte heslo unlockInputPlaceholder = Heslo unlockButtonLabel = Odemknout -downloadFileTitle = Stáhnout šifrovaný soubor -// Firefox Send is a brand name and should not be localized. -downloadMessage = Někdo vám posílá soubor pomocí služby Firefox Send, které umožňuje bezpečné, soukromé a šifrované sdílení souborů, které jsou pak automaticky smazány, aby nezůstaly na internetu navěky. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Stáhnout -downloadNotification = Stahování bylo dokončeno. downloadFinish = Stahování dokončeno -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Vyzkoušejte Firefox Send -downloadingPageProgress = Stahování { $filename } ({ $size }) -downloadingPageMessage = Ponechte prosím tento panel otevřený, dokud nepřipravíme váš soubor a nedešifrujeme ho. -errorAltText = Chyba při nahrávání souboru +sendYourFilesLink = Vyzkoušet Send errorPageHeader = Nastala chyba! -errorPageMessage = Při nahrávání souboru se vyskytl problém. -errorPageLink = Poslat další soubor fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů by neměla překročit { $size }. linkExpiredAlt = Platnost odkazu vypršela -expiredPageHeader = Platnost tohoto odkazu buď vypršela, nebo vůbec nikdy neexistoval. notSupportedHeader = Váš prohlížeč není podporován. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Bohužel tento prohlížeč nepodporuje technologii, kterou Firefox Send používá. Zkuste prosím jiný prohlížeč, doporučujeme Firefox! notSupportedLink = Proč není můj prohlížeč podporovaný? -notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Firefox Send. Musíte aktualizovat svůj prohlížeč. +notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Send. Musíte aktualizovat svůj prohlížeč. updateFirefox = Aktualizovat Firefox -downloadFirefoxButtonSub = Stáhnout zdarma -uploadedFile = Soubor -copyFileList = Kopírovat URL -// expiryFileList is used as a column header -expiryFileList = Platnost vyprší za -deleteFileList = Smazat -nevermindButton = Nevadí -legalHeader = Podmínky a ochrana soukromí -legalNoticeTestPilot = Firefox Send je ve fázi experimentu projektu Test Pilot a platí tak pro něj stejné Podmínky používání a Zásady ochrany soukromí. Více o tomto experimentu a sbíraných datech se dozvíte zde. -legalNoticeMozilla = Používání webové služby Firefox Send se řídí Zásadami ochrany soukromí a Podmínkami používání webových stránek Mozilly. -deletePopupText = Smazat tento soubor? -deletePopupYes = Ano deletePopupCancel = Zrušit deleteButtonHover = Smazat -copyUrlHover = Kopírovat URL -footerLinkLegal = Právní informace -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = O programu Test Pilot -footerLinkPrivacy = Soukromí -footerLinkTerms = Podmínky -footerLinkCookies = Cookies -requirePasswordCheckbox = Vyžadovat heslo pro stažení tohoto souboru -addPasswordButton = Přidat heslo passwordTryAgain = Špatné heslo. Zkuste to znovu. -// This label is followed by the password needed to download a file -passwordResult = Heslo: { $password } +javascriptRequired = Send vyžaduje povolený JavaScript +whyJavascript = Proč Send vyžaduje povolený JavaScript? +enableJavascript = Povolte JavaScript a zkuste to znovu. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximální délka hesla: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Toto heslo nemohlo být nastaveno + +## Send version 2 strings + +-send-brand = + { $case -> + *[nom] Send + [gen] Sendu + [dat] Sendu + [acc] Send + [voc] Sende + [loc] Sendu + [ins] Sendem + } +-send-short-brand = + { $case -> + *[nom] Send + [gen] Sendu + [dat] Sendu + [acc] Send + [voc] Sende + [loc] Sendu + [ins] Sendem + } +-firefox = + { $case -> + *[nom] Firefox + [gen] Firefoxu + [dat] Firefoxu + [acc] Firefox + [voc] Firefoxe + [loc] Firefoxu + [ins] Firefoxem + } +-mozilla = + { $case -> + *[nom] Mozilla + [gen] Mozilly + [dat] Mozille + [acc] Mozillu + [voc] Mozillo + [loc] Mozille + [ins] Mozillou + } +introTitle = Jednoduché a soukromé sdílení souborů +introDescription = Se { -send-brand(case: "ins") } jsou sdílené soubory šifrované end-to-end, takže ani my nevíme, co sdílíte. Platnost odkazů je navíc omezená. Soubory tak můžete sdílet soukromě a s jistotou, že se nezůstanou na internetu válet navždy. +notifyUploadEncryptDone = Váš soubor je zašifrovaný a připraven k odeslání +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Platnost vyprší po { $downloadCount } nebo za { $timespan } +timespanMinutes = + { $num -> + [one] jednu minutu + [few] { $num } minuty + *[other] { $num } minut + } +timespanDays = + { $num -> + [one] jeden den + [few] { $num } dny + *[other] { $num } dní + } +timespanWeeks = + { $num -> + [one] týden + [few] { $num } týdny + *[other] { $num } týdnů + } +fileCount = + { $num -> + [one] jeden soubor + [few] { $num } soubory + *[other] { $num } souborů + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Celková velikost: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Soubor můžete sdílet tímto odkazem: +copyLinkButton = Zkopírovat odkaz +downloadTitle = Stáhnout soubory +downloadDescription = Tento soubor byl sdílen přes { -send-brand(case: "acc") } s end-to-end šifrováním a odkazem s omezenou platností. +trySendDescription = Vyzkoušejte jednoduché a bezpečné sdílení souborů se { -send-brand(case: "ins") } +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Najednou lze nahrávat jen jeden soubor. + [few] Najednou lze nahrávat jen { $count } soubory. + *[other] Najednou lze nahrávat jen { $count } souborů. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Povolen je nejvýše jeden archiv. + [few] Povoleny jsou nejvýše { $count } archivy. + *[other] Povoleno je nejvýše { $count } archivů. + } +expiredTitle = Platnost tohoto odkazu vypršela. +notSupportedDescription = { -send-brand } nebude v tomto prohlížeči fungovat. Nejlépe { -send-short-brand } funguje v nejnovějším { -firefox(case: "gen") } nebo aktuálních verzích nejpoužívanějších prohlížečů. +downloadFirefox = Stáhnout { -firefox(case: "acc") } +legalTitle = Zásady { -send-short-brand(case: "acc") } pro ochranu osobních údajů +legalDateStamp = Verze 1.0, 12. března 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Vyberte soubory k nahrání +uploadButton = Nahrát +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Přetažením myší nebo kliknutím sem +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = můžete poslat až { $size } +addPassword = Ochránit heslem +emailPlaceholder = Zadejte svoji e-mailovou adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Pro odesílání souborů o velikosti až { $size } se prosím přihlaste +signInOnlyButton = Přihlásit se +accountBenefitTitle = Vytvořte si účet { -firefox(case: "gen") } nebo se přihlaste +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Sdílejte soubory o velikosti až { $size } +accountBenefitDownloadCount = Sdílejte soubory s více lidmi +accountBenefitTimeLimit = + { $count -> + [one] Odkazy platné až jeden den + [few] Odkazy platné až { $count } dny + *[other] Odkazy platné až { $count } dní + } +accountBenefitSync = Správa sdílených souborů z jakéhokoliv zařízení +accountBenefitMoz = Více informací o dalších službách od { -mozilla(case: "gen") } +signOut = Odhlásit se +okButton = OK +downloadingTitle = Stahování +noStreamsWarning = Dešifrování tak velikého souboru se v tomto prohlížeči nemusí podařit. +noStreamsOptionCopy = Zkopírujte odkaz pro otevření v jiném prohlížeči +noStreamsOptionFirefox = Vyzkoušejte náš oblíbený prohlížeč +noStreamsOptionDownload = Pokračovat v tomto prohlížeči +downloadFirefoxPromo = { -send-short-brand } od aplikace { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Sdílet odkaz na soubor: +shareLinkButton = Sdílet odkaz +# $name is the name of the file +shareMessage = Stáhněte si soubor „{ $name }“ se { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů +trailheadPromo = Existuje způsob, jak ochránit své soukromí. Používejte Firefox. +learnMore = Zjistit více. diff --git a/public/locales/cy/send.ftl b/public/locales/cy/send.ftl index 8639e354..1a6fda11 100644 --- a/public/locales/cy/send.ftl +++ b/public/locales/cy/send.ftl @@ -1,91 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = arbrawf gwe -siteFeedback = Adborth -uploadPageHeader = Rhannu Ffeiliau wedi eu Hamgryptio yn Breifat -uploadPageExplainer = Anfon ffeiliau drwy ddolen diogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich pethau'n bodoli ar lein am byth. -uploadPageLearnMore = Dysgu rhagor -uploadPageDropMessage = Gollyngwch eich ffeiliau yma i gychwyn llwytho i fyny -uploadPageSizeMessage = Mae'n well cadw maint y ffeiliau o dan 1GB er mwyn iddo weithio ar ei orau. -uploadPageBrowseButton = Dewiswch ffeil ar eich cyfrifiadur -uploadPageBrowseButton1 = Dewiswch ffeil i'w llwytho i fyny -uploadPageMultipleFilesAlert = Nid yw llwytho nifer lluosog o ffeiliau neu ffolder yn cael ei gynnal ar hyn o bryd. -uploadPageBrowseButtonTitle = Llwytho ffeil i fyny -uploadingPageProgress = Llwytho $filename} i fyny ({ $size }) +title = Send importingFile = Mewnforio… -verifyingFile = Wrthi'n gwirio… encryptingFile = Wrthi'n amgryptio… decryptingFile = Wrthi'n dadgryptio… -notifyUploadDone = Mae eich llwytho wedi gorffen. -uploadingPageMessage = Unwaith y bydd eich ffeil wedi llwytho bydd modd gosod y manylion dod i ben. -uploadingPageCancel = Diddymu'r llwytho -uploadCancelNotification = Cafodd eich llwytho ei ddiddymu. -uploadingPageLargeFileMessage = Mae'r ffeil yn fawr a gall gymryd peth amser i'w llwytho. Amynedd! -uploadingFileNotification = Dweud pan fydd y llwytho wedi gorffen. -uploadSuccessConfirmHeader = Yn Barod i Anfon -uploadSvgAlt = Llwytho i Fyny -uploadSuccessTimingHeader = Bydd y ddolen i'ch ffeil y dod i ben ar ôl 1 llwytho neu o fewn 24 awr. -copyUrlFormLabelWithName = Copïo a rhannu'r ddolen i anfon eich ffeil: { $filename } -copyUrlFormButton = Copïo i'r clipfwrdd +downloadCount = + { $num -> + [zero] Dim llwythi i lawr + [one] 1 llwyth i lawr + [two] { $num } llwyth i lawr + [few] { $num } llwyth i lawr + [many] { $num } llwyth i lawr + *[other] { $num } llwyth i lawr + } +timespanHours = + { $num -> + [zero] awr + [one] 1 awr + [two] { $num } awr + [few] { $num } awr + [many] { $num } awr + *[other] { $num } awr + } copiedUrl = Wedi eu copïo! -deleteFileButton = Dileu ffeil -sendAnotherFileLink = Anfon ffeil arall -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Llwytho i lawr -downloadFileName = Llwytho i lawr { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Rhowch Gyfrinair unlockInputPlaceholder = Cyfrinair unlockButtonLabel = Datgloi -downloadFileTitle = Llwythwch Ffeil wedi ei Hamgryptio i Lawr -// Firefox Send is a brand name and should not be localized. -downloadMessage = Mae ffrind i chi yn anfon ffeil atoch drwy Firefox Send, gwasanaeth sy'n caniatáu i chi rannu ffeiliau drwy ddolen ddiogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich deunydd yn aros ar-lein am byth. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Llwytho i Lawr -downloadNotification = Mae eich llwytho wedi gorffen downloadFinish = Llwytho wedi Gorffen -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } o { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Rhowch gynnig ar Firefox Send -downloadingPageProgress = Llwytho i lawr { $filename } ({ $size }) -downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio. -errorAltText = Gwall llwytho +sendYourFilesLink = Rhowch gynnig ar Send errorPageHeader = Aeth rhywbeth o'i le! -errorPageMessage = Bu gwall wrth lwytho'r ffeil. -errorPageLink = Anfon ffeil arall fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }. linkExpiredAlt = Mae'r ddolen wedi dod i ben -expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed! notSupportedHeader = Nid yw eich porwr yn cael ei gynnal. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Yn anffodus, nid yw'r porwr hwn yn cynnal y technoleg gwe sy'n cynnal Firefox Send. Bydd angen i chi ddefnyddio porwr arall. Rydym ni'n argymell Firefox! notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal? -notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Firefox Send. Bydd angen i chi ddiweddaru eich porwr. +notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Send. Bydd angen i chi ddiweddaru eich porwr. updateFirefox = Diweddaru Firefox -downloadFirefoxButtonSub = Llwytho i Lawr am Ddim -uploadedFile = Ffeil -copyFileList = Copïo URL -// expiryFileList is used as a column header -expiryFileList = Daw i ben ymhen -deleteFileList = Dileu -nevermindButton = Dim ots -legalHeader = Amodau a Phreifatrwydd -legalNoticeTestPilot = Ar hyn o mae Firefox Send yn arbrawf o fewn rhaglen Test Pilot ac yn destun Amodau Gwasanaeth a Hysbysiad Preifatrwydd Test Pilot . Gallwch ddysgu rhagor am yr arbrawf a'r data mae'n ei gasglu yma. -legalNoticeMozilla = Mae'r defnydd o wefan Firefox Send hefyd yn destun Hysbysiad Preifatrwydd Gwefannau ac Amodau Defnydd Gwefannau Mozilla. -deletePopupText = Dileu'r ffeil? -deletePopupYes = Iawn deletePopupCancel = Diddymu deleteButtonHover = Dileu -copyUrlHover = Copïo'r URL -footerLinkLegal = Cyfreithiol -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Ynghylch Test Pilot -footerLinkPrivacy = Preifatrwydd -footerLinkTerms = Amodau -footerLinkCookies = Cwcis -requirePasswordCheckbox = Gosod angen cyfrinair i lwytho'r ffeil hon i lawr -addPasswordButton = Ychwanegu Cyfrinair passwordTryAgain = Cyfrinair anghywir. Ceisiwch eto. -// This label is followed by the password needed to download a file -passwordResult = Cyfrinair: { $password } +javascriptRequired = Mae Send angen JavaScript +whyJavascript = Pam fod Send angen JavaScript? +enableJavascript = Galluogwch JavaScript a cheisio eto. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }a { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Hyd mwyaf cyfrinair: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nid oedd modd gosod y cyfrinair hwn + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Anfon +-firefox = Firefox +-mozilla = Mozilla +introTitle = Rhannu ffeiliau syml a phreifat +introDescription = Mae { -send-brand } yn gadael i chi rannu ffeiliau gydag amgryptio o'r dechrau i'r diwedd a dolen sy'n dod i ben yn awtomatig. Felly gallwch chi gadw'r hyn rydych chi'n ei rannu'n breifat a sicrhau nad yw'ch pethau'n aros ar-lein am byth. +notifyUploadEncryptDone = Mae eich ffeil wedi'i hamgryptio ac yn barod i'w hanfon +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Yn dod i ben ar ôl { $downloadCount } neu { $timespan } +timespanMinutes = + { $num -> + [zero] 0 munud + [one] 1 munud + [two] { $num } munud + [few] { $num } munud + [many] { $num } munud + *[other] { $num } munud + } +timespanDays = + { $num -> + [zero] 0 diwrnod + [one] 1 diwrnod + [two] { $num } diwrnod + [few] { $num } diwrnod + [many] { $num } diwrnod + *[other] { $num } diwrnod + } +timespanWeeks = + { $num -> + [zero] 0 wythnos + [one] 1 wythnos + [two] { $num } wythnos + [few] { $num } wythnos + [many] { $num } wythnos + *[other] { $num } wythnos + } +fileCount = + { $num -> + [zero] 0 ffeil + [one] 1 ffeil + [two] { $num } ffeil + [few] { $num } ffeil + [many] { $num } ffeil + *[other] { $num } ffeil + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Cyfanswm maint: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copïwch y ddolen i rannu eich ffeil: +copyLinkButton = Copïo'r ddolen +downloadTitle = Llwytho ffeiliau i lawr +downloadDescription = Rhannwyd y ffeil hon trwy { -send-brand } gydag amgryptiad o'r dechrau i'r diwedd a dolen sy'n dod i ben yn awtomatig. +trySendDescription = Rhowch gynnig ar { -send-brand } ar gyfer rhannu ffeiliau syml a diogel. +# count will always be > 10 +tooManyFiles = + { $count -> + [zero] Nid oes modd llwytho ffeiliau i fyny. + [one] Dim ond 1 ffeil y mae modd ei llwytho i fyny ar y tro. + [two] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + [few] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + [many] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + *[other] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [zero] Dim caniatâd i archifau. + [one] Dim ond 1 archif y'n cael ei ganiatáu. + [two] Dim ond { $count } archif sy'n cael eu caniatáu. + [few] Dim ond { $count } archif sy'n cael eu caniatáu. + [many] Dim ond { $count } archif sy'n cael eu caniatáu. + *[other] Dim ond { $count } archif sy'n cael eu caniatáu. + } +expiredTitle = Mae'r ddolen hon wedi dod i ben. +notSupportedDescription = Ni fydd { -send-brand } yn gweithio gyda'r porwr hwn. Mae { -send-short-brand } yn gweithio orau gyda'r fersiwn ddiweddaraf o { -firefox }, a bydd yn gweithio gyda'r fersiwn gyfredol o'r rhan fwyaf o borwyr. +downloadFirefox = Llwytho { -firefox } i Lawr +legalTitle = Hysbysiad Preifatrwydd { -send-short-brand } +legalDateStamp = Fersiwn 1.0, dyddiedig Mawrth 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } a { $minutes } m +addFilesButton = Dewis ffeiliau i'w llwytho i fyny +uploadButton = Llwytho i fyny +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Llusgo a gollwng ffeiliau +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = neu glicio i anfon hyd at { $size } +addPassword = Diogelu gyda chyfrinair +emailPlaceholder = Rhowch eich e-bost +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Mewngofnodi i anfon hyd at { $size } +signInOnlyButton = Mewngofnodi +accountBenefitTitle = Creu Cyfrif { -firefox } neu fewngofnodi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Rhannu ffeiliau hyd at { $size } +accountBenefitDownloadCount = Rhannu ffeiliau gyda mwy o bobl +accountBenefitTimeLimit = + { $count -> + [zero] Cadw dolenni'n weithredol am hyd at 0 diwrnod + [one] Cadw dolenni'n weithredol am hyd at 1 diwrnod + [two] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + [few] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + [many] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + *[other] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + } +accountBenefitSync = Rheoli ffeiliau sy'n cael eu rhannu o unrhyw ddyfais +accountBenefitMoz = Dysgu am wasanaethau eraill { -mozilla } +signOut = Allgofnodi +okButton = Iawn +downloadingTitle = Llwytho i Lawr +noStreamsWarning = Efallai na fydd y porwr hwn yn gallu dadgryptio ffeil mor fawr a hon. +noStreamsOptionCopy = Copïwch y ddolen i'w agor mewn porwr arall +noStreamsOptionFirefox = Rhowch gynnig ar ein hoff porwr +noStreamsOptionDownload = Parhau gyda'r porwr hwn +downloadFirefoxPromo = Mae { -send-short-brand } yn cael ei gynnig i ci gan y { -firefox } newydd. +# the next line after the colon contains a file name +shareLinkDescription = Rhannu'r ddolen i'ch ffeil: +shareLinkButton = Rhannu'r ddolen +# $name is the name of the file +shareMessage = Llwytho i lawr “{ $name }” gyda { -send-brand }: rhannu ffeiliau syml a diogel +trailheadPromo = Mae ffordd o ddiogelu eich preifatrwydd. Ymunwch â Firefox. +learnMore = Dysgu rhagor. diff --git a/public/locales/da/send.ftl b/public/locales/da/send.ftl new file mode 100644 index 00000000..d0ee9378 --- /dev/null +++ b/public/locales/da/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Importerer… +encryptingFile = Krypterer… +decryptingFile = Dekrypterer… +downloadCount = + { $num -> + [one] 1 hentning + *[other] { $num } hentninger + } +timespanHours = + { $num -> + [one] 1 time + *[other] { $num } timer + } +copiedUrl = Kopieret! +unlockInputPlaceholder = Adgangskode +unlockButtonLabel = Lås op +downloadButtonLabel = Hent +downloadFinish = Hentning fuldført +fileSizeProgress = ({ $partialSize } af { $totalSize }) +sendYourFilesLink = Prøv Send +errorPageHeader = Der gik noget galt! +fileTooBig = Den fil er for stor at uploade. Den skal være mindre end { $size }. +linkExpiredAlt = Link er udløbet +notSupportedHeader = Din browser understøttes ikke. +notSupportedLink = Hvorfor understøttes min browser ikke? +notSupportedOutdatedDetail = Desværre understøtter denne version af Firefox ikke den webteknologi, som driver Send. Du skal opdatere din browser. +updateFirefox = Opdater Firefox +deletePopupCancel = Annuller +deleteButtonHover = Slet +passwordTryAgain = Forkert adgangskode. Prøv igen. +javascriptRequired = Send kræver JavaScript +whyJavascript = Hvorfor kræver Send JavaScript? +enableJavascript = Aktiver JavaScript og prøv igen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } t { $minutes } m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum længde af adgangskode: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Adgangskoden kunne ikke sættes + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildeling +introDescription = { -send-brand } gør det muligt at dele filer via et tidsbegrænset link og med end to end-kryptering. På den måde kan du dele filer privat og samtidig være sikker på, at det delte ikke forbliver online for evigt. +notifyUploadEncryptDone = Din fil er krypteret og klar til at blive sendt +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Udløber efter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + *[other] { $num } minutter + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dage + } +timespanWeeks = + { $num -> + [one] 1 uge + *[other] { $num } uger + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Samlet størrelse: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopier linket for at dele din fil: +copyLinkButton = Kopier link +downloadTitle = Hent filer +downloadDescription = Denne fil blev delt via { -send-brand } med end to end-kryptering og et link, der automatisk udløber. +trySendDescription = Prøv { -send-brand } for enkel og sikker fildeling. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Du kan kun uploade 1 fil ad gangen. + *[other] Du kan kun uploade { $count } filer ad gangen. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Kun 1 arkiv er tilladt. + *[other] Kun { $count } arkiver er tilladt. + } +expiredTitle = Dette link er udløbet. +notSupportedDescription = { -send-brand } virker ikke med denne browser. { -send-short-brand } virker bedst med den nyeste version af { -firefox } og med de fleste andre nye browsere. +downloadFirefox = Hent { -firefox } +legalTitle = { -send-short-brand }, om privatlivspolitik +legalDateStamp = Version 1.0, udsendt d. 12. marts 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d. { $hours } t. { $minutes } m. +addFilesButton = Vælg filer, der skal uploades +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Træk og slip filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klik for at sende filer på op til { $size } +addPassword = Beskyt med adgangskode +emailPlaceholder = Indtast din mailadresse +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Log ind for at sende filer på op til { $size } +signInOnlyButton = Log ind +accountBenefitTitle = Opret en { -firefox }-konto eller log ind +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Del filer på op til { $size } +accountBenefitDownloadCount = Del filer med flere personer +accountBenefitTimeLimit = + { $count -> + [one] Bevar links aktive i op til 1 dag + *[other] Bevar links aktive i op til { $count } dage + } +accountBenefitSync = Håndter delte filer på enhver enhed +accountBenefitMoz = Læs om andre tjenester fra { -mozilla } +signOut = Log ud +okButton = OK +downloadingTitle = Henter +noStreamsWarning = Denne browser kan muligvis ikke dekryptere en fil, der er så stor. +noStreamsOptionCopy = Kopier linket for at åbne det i en anden browser +noStreamsOptionFirefox = Prøv vores favorit-browser +noStreamsOptionDownload = Fortsæt med denne browser +downloadFirefoxPromo = { -send-short-brand } præsenteres af den nye { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Del linket til din fil: +shareLinkButton = Del link +# $name is the name of the file +shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling +trailheadPromo = Beskyt dine digitale rettigheder. Slut dig til Firefox. +learnMore = Læs mere. diff --git a/public/locales/de/send.ftl b/public/locales/de/send.ftl index 2e30e2b5..44e00177 100644 --- a/public/locales/de/send.ftl +++ b/public/locales/de/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Web-Experiment -siteFeedback = Feedback -uploadPageHeader = Privates, verschlüsseltes Austauschen von Dateien -uploadPageExplainer = Senden Sie Dateien über einen sicheren, privaten und verschlüsselten Link, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben. -uploadPageLearnMore = Mehr erfahren -uploadPageDropMessage = Ziehen Sie eine Datei zum Hochladen hierher -uploadPageSizeMessage = Dateien unter 1 GB sorgen für erhöhte Zuverlässigkeit des Betriebs -uploadPageBrowseButton = Wählen Sie eine Datei auf Ihrem Computer aus -uploadPageBrowseButton1 = Datei zum Hochladen auswählen -uploadPageMultipleFilesAlert = Hochladen mehrerer Dateien oder eines Ordners wird derzeit nicht unterstützt. -uploadPageBrowseButtonTitle = Datei hochladen -uploadingPageProgress = { $filename } ({ $size }) wird hochgeladen +title = Send importingFile = Wird importiert… -verifyingFile = Wird überprüft… encryptingFile = Wird verschlüsselt… decryptingFile = Wird entschlüsselt… -notifyUploadDone = Ihr Upload ist abgeschlossen. -uploadingPageMessage = Sobald Ihre Datei hochgeladen wird, können Sie die Optionen zum Ablaufdatum auswählen. -uploadingPageCancel = Hochladen abbrechen -uploadCancelNotification = Ihr Upload wurde abgebrochen. -uploadingPageLargeFileMessage = Diese Datei ist groß, sodass das hochladen einige Zeit dauern könnte. Haben Sie Geduld! -uploadingFileNotification = Mich benachrichtigen, wenn der Upload abgeschlossen ist. -uploadSuccessConfirmHeader = Bereit zum Senden -uploadSvgAlt = Hochladen -uploadSuccessTimingHeader = Der Link zu Ihrer Datei läuft nach einem Download oder in 24 Stunden ab. -copyUrlFormLabelWithName = Kopieren und teilen Sie den Link, um Ihre Datei zu senden: { $filename } -copyUrlFormButton = In Zwischenablage kopieren +downloadCount = + { $num -> + [one] einem Download + *[other] { $num } Downloads + } +timespanHours = + { $num -> + [one] einer Stunde + *[other] { $num } Stunden + } copiedUrl = Kopiert! -deleteFileButton = Datei löschen -sendAnotherFileLink = Eine weitere Datei senden -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Herunterladen -downloadFileName = { $filename } herunterladen -downloadFileSize = ({ $size }) -unlockInputLabel = Passwort eingeben unlockInputPlaceholder = Passwort unlockButtonLabel = Entsperren -downloadFileTitle = Verschlüsselte Datei herunterladen -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ihr Freund schickt Ihnen eine Datei mit Firefox Send, einem Dienst, mit dem Sie Dateien über einen sicheren, privaten und verschlüsselten Link teilen können, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Herunterladen -downloadNotification = Der Download wurde abgeschlossen. downloadFinish = Download abgeschlossen -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } von { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send ausprobieren -downloadingPageProgress = { $filename } ({ $size }) wird heruntergeladen -downloadingPageMessage = Bitte lassen Sie diesen Tab geöffnet, während Ihre Datei heruntergeladen und entschlüsselt wird. -errorAltText = Fehler beim Hochladen +sendYourFilesLink = Send ausprobieren errorPageHeader = Ein Fehler ist aufgetreten! -errorPageMessage = Beim Hochladen der Datei ist ein Fehler aufgetreten. -errorPageLink = Eine weitere Datei senden fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size } groß sein. linkExpiredAlt = Link abgelaufen -expiredPageHeader = Dieser Link ist abgelaufen oder hat nie existiert! -notSupportedHeader = Ihr Browser wird nicht unterstützt. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Leider unterstützt dieser Browser die Web-Technologie nicht, auf der Firefox Send basiert. Sie benötigen einen anderen Browser. Wir empfehlen Firefox! +notSupportedHeader = Dein Browser wird nicht unterstützt. notSupportedLink = Warum wird mein Browser nicht unterstützt? -notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Firefox Send basiert. Sie müssen Ihren Browser aktualisieren. +notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Send basiert. Du musst deinen Browser aktualisieren. updateFirefox = Firefox aktualisieren -downloadFirefoxButtonSub = Kostenloser Download -uploadedFile = Datei -copyFileList = Adresse kopieren -// expiryFileList is used as a column header -expiryFileList = Läuft ab in -deleteFileList = Löschen -nevermindButton = Egal -legalHeader = Nutzungsbedingungen und Datenschutz -legalNoticeTestPilot = Firefox Send ist aktuell ein Test-Pilot-Experiment und unterliegt den Nutzungsbedingungen und dem Datenschutzhinweis von Test Pilot. Mehr über diese Experiment und die Daten, die es sammelt, erfahren Sie hier. -legalNoticeMozilla = Die Nutzung der Website von Firefox Send unterliegt außerdem Mozillas Datenschutzhinweis für Websites und Nutzungsbedingungen für Websites. -deletePopupText = Diese Datei löschen? -deletePopupYes = Ja deletePopupCancel = Abbrechen deleteButtonHover = Löschen -copyUrlHover = Adresse kopieren -footerLinkLegal = Rechtliches -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Über Test Pilot -footerLinkPrivacy = Datenschutz -footerLinkTerms = Nutzungsbedingungen -footerLinkCookies = Cookies -requirePasswordCheckbox = Zum Herunterladen dieser Datei soll ein Passwort erforderlich sein -addPasswordButton = Passwort hinzufügen -passwordTryAgain = Falsches Passwort. Versuchen Sie es erneut. -// This label is followed by the password needed to download a file -passwordResult = Passwort: { $password } +passwordTryAgain = Falsches Passwort. Versuche es nochmal. +javascriptRequired = Send benötigt JavaScript +whyJavascript = Warum benötigt Send JavaScript? +enableJavascript = Bitte aktiviere JavaScript und versuche es erneut. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximale Passwortlänge: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dieses Passwort konnte nicht eingerichtet werden + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Einfach und privat Dateien versenden +introDescription = Mit { -send-brand } kannst du Dateien sicher mit anderen teilen – mit End-to-End-Verschlüsselung und einem Freigabe-Link, der automatisch abläuft. So bleiben deine geteilten Inhalte privat und du kannst sicherstellen, dass deine Daten nicht für immer im Web herumschwirren. +notifyUploadEncryptDone = Deine Datei ist verschlüsselt und zum Senden bereit +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Läuft ab nach { $downloadCount } oder { $timespan } +timespanMinutes = + { $num -> + [one] 1 Minute + *[other] { $num } Minuten + } +timespanDays = + { $num -> + [one] 1 Tag + *[other] { $num } Tage + } +timespanWeeks = + { $num -> + [one] 1 Woche + *[other] { $num } Wochen + } +fileCount = + { $num -> + [one] 1 Datei + *[other] { $num } Dateien + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Gesamtgröße: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiere den Link, um deine Datei zu teilen: +copyLinkButton = Link kopieren +downloadTitle = Dateien herunterladen +downloadDescription = Diese Datei wurde über { -send-brand } mit End-to-End-Verschlüsselung und einem automatisch ablaufenden Link geteilt. +trySendDescription = Probiere { -send-brand } aus, um einfach und sicher Dateien zu versenden. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Es kann maximal eine Datei auf einmal hochgeladen werden. + *[other] Es können maximal { $count } Dateien auf einmal hochgeladen werden. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Es ist nur ein Archiv erlaubt. + *[other] Es sind nur { $count } Archive erlaubt. + } +expiredTitle = Dieser Link ist abgelaufen. +notSupportedDescription = { -send-brand } funktioniert nicht mit diesem Browser. { -send-short-brand } funktioniert am besten mit der neuesten Version von { -firefox } und funktioniert mit der aktuellen Version der meisten Browser. +downloadFirefox = { -firefox } herunterladen +legalTitle = Datenschutzerklärung zu { -send-short-brand } +legalDateStamp = Version 1.0, Stand 12. März 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Dateien zum Hochladen auswählen +uploadButton = Hochladen +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dateien per Drag & Drop einfügen +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = oder klicken, um bis zu { $size } zu senden +addPassword = Mit Passwort schützen +emailPlaceholder = E-Mail-Adresse eingeben +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Melde dich an, um Dateien bis { $size } zu senden +signInOnlyButton = Anmelden +accountBenefitTitle = Erstelle ein { -firefox }-Konto oder melde dich an +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dateien bis zu { $size } teilen +accountBenefitDownloadCount = Teile Dateien mit weiteren Leuten +accountBenefitTimeLimit = + { $count -> + [one] Link bis zu einen Tag lang aktiv halten + *[other] Link bis zu { $count } Tage lang aktiv halten + } +accountBenefitSync = Geteilte Dateien von anderen Geräten aus verwalten +accountBenefitMoz = Erfahre mehr über andere { -mozilla }-Dienste +signOut = Abmelden +okButton = OK +downloadingTitle = Wird heruntergeladen… +noStreamsWarning = Dieser Browser kann eine so große Datei möglicherweise nicht entschlüsseln. +noStreamsOptionCopy = Kopiere den Link, um ihn in einem anderen Browser zu öffnen +noStreamsOptionFirefox = Probiere unseren Lieblingsbrowser aus +noStreamsOptionDownload = Mit diesem Browser weitermachen +downloadFirefoxPromo = { -send-short-brand } wird Ihnen präsentiert vom brandneuen { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Teilen Sie den Link zu Ihrer Datei: +shareLinkButton = Link teilen +# $name is the name of the file +shareMessage = Laden Sie „{ $name }“ mit { -send-brand } herunter: einfaches, sicheres Teilen von Dateien +trailheadPromo = Es gibt einen Weg, deine Privatsphäre zu schützen. Komm zu Firefox. +learnMore = Mehr erfahren. diff --git a/public/locales/dsb/send.ftl b/public/locales/dsb/send.ftl index 4762ccd7..87900988 100644 --- a/public/locales/dsb/send.ftl +++ b/public/locales/dsb/send.ftl @@ -1,91 +1,167 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webeksperiment -siteFeedback = Komentar -uploadPageHeader = Priwatne, skoděrowane źělenje datajow -uploadPageExplainer = Pósćelśo dataje pśez wěsty, priwatny a skoděrowany wótkaz, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali. -uploadPageLearnMore = Dalšne informacije -uploadPageDropMessage = Śěgniśo swóju dataju sem, aby ju nagrał -uploadPageSizeMessage = Wužywajśo nejlěpje dataje, kótarež su mjeńše ako 1 GB za lěpšu spušćobnosć. -uploadPageBrowseButton = Wubjeŕśo dataju na swójom licadle -uploadPageBrowseButton1 = Wubjeŕśo dataju za nagraśe -uploadPageMultipleFilesAlert = Nagrawanje někotarych datajow abo zarědnika se tuchylu njepódpěra. -uploadPageBrowseButtonTitle = Dataju nagraś -uploadingPageProgress = { $filename } ({ $size }) se nagrawa +title = Send importingFile = Importěrujo se... -verifyingFile = Pśespytujo se... encryptingFile = Koděrujo se... decryptingFile = Dešifrěrujo se... -notifyUploadDone = Wašo nagraśe jo dokóńcone. -uploadingPageMessage = Gaž se waša dataja nagrawa, móžośo nastajenja spadnjenja póstajiś. -uploadingPageCancel = Nagraśe pśetergnus -uploadCancelNotification = Wašo nagraśe jo se pśetergnuło. -uploadingPageLargeFileMessage = Toś ta dataja jo wjelika a nagrawanje mógło chylku traś. Buźćo sćerpliwy! -uploadingFileNotification = K wěsći daś, gaž nagraśe jo dokóńcone. -uploadSuccessConfirmHeader = Gótowy za słanje -uploadSvgAlt = Nagraś -uploadSuccessTimingHeader = Wótkaz k wašej dataji pó 1 ześěgnjenju abo 24 góźinach spadnjo. -copyUrlFormLabelWithName = Kopěrujśo a źělśo wótkaz, aby swóju dataju pósłał: { $filename } -copyUrlFormButton = Do mjazywótkłada kopěrowaś +downloadCount = + { $num -> + [one] 1 ześěgnjenje + [two] { $num } ześěgnjeni + [few] { $num } ześěgnjenja + *[other] { $num } ześěgnjenjow + } +timespanHours = + { $num -> + [one] 1 góźina + [two] { $num } góźinje + [few] { $num } góźiny + *[other] { $num } góźin + } copiedUrl = Kopěrowany! -deleteFileButton = Dataju wulašowaś -sendAnotherFileLink = Drugu dataju pósłaś -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Ześěgnuś -downloadFileName = { $filename } ześěgnuś -downloadFileSize = ({ $size }) -unlockInputLabel = Gronidło zapódaś unlockInputPlaceholder = Gronidło unlockButtonLabel = Wótwóriś -downloadFileTitle = Skoděrowanu dataju ześěgnuś -// Firefox Send is a brand name and should not be localized. -downloadMessage = Waš pśijaśel wam dataju z Firefox Send sćelo, słužba, kótaraž wam zmóžnja, dataje pśez wěsty, priwatny a skoděrowany wótkaz źěliś, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Ześěgnuś -downloadNotification = Wašo ześěgnjenje jo dokóńcone. downloadFinish = Ześěgnjenje dokóńcone -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send wopytaś -downloadingPageProgress = { $filename } ({ $size }) se ześěgujo -downloadingPageMessage = Pšosym wóstajśo toś ten rejtark wócynjony, mjaztym až wašu dataju ześěgujomy a dešifrěrujomy. -errorAltText = Nagrawańska zmólka +sendYourFilesLink = Send wopytaś errorPageHeader = Něco njejo se raźiło! -errorPageMessage = Pśi nagrawanju dataje jo zmólka nastała. -errorPageLink = Drugu dataju pósłaś fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $size } byś. linkExpiredAlt = Wótkaz spadnjony -expiredPageHeader = Toś ten wótkaz jo spadnjony abo njejo nigda eksistěrował! notSupportedHeader = Waš wobglědowak se njepódpěra. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Bóžko toś ten wobglědowak webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo drugi wobglědowak wužywaś. My Firefox dopórucujomy! notSupportedLink = Cogodla se mój wobglědowak njepódpěra? -notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś. +notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś. updateFirefox = Firefox aktualizěrowaś -downloadFirefoxButtonSub = Dermotne ześěgnjenje -uploadedFile = Dataja -copyFileList = URL kopěrowaś -// expiryFileList is used as a column header -expiryFileList = Spadnjo za -deleteFileList = Wulašowaś -nevermindButton = Wšojadno -legalHeader = Wuměnjenja a priwatnosć -legalNoticeTestPilot = Firefox jo tuchylu eksperiment Test Pilot, a pódlažy wužywańskim wuměnjenjam a pokazce priwatnosći Test Pilot. Wěcej wó toś tom eksperimenśe a daty, kótarež gromaźi, how zgónijośo. -legalNoticeMozilla = Teke wužywanje websedła Firefox Send pokazce priwatnosći za websedła a wužywańskim wuměnjenjam za websedła Mozilla pódlažy. -deletePopupText = Toś tu dataju lašowaś? -deletePopupYes = Jo deletePopupCancel = Pśetergnuś deleteButtonHover = Wulašowaś -copyUrlHover = URL kopěrowaś -footerLinkLegal = Pšawniske -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Wó Test Pilot -footerLinkPrivacy = Priwatnosć -footerLinkTerms = Wuměnjenja -footerLinkCookies = Cookieje -requirePasswordCheckbox = Gronidło za ześěgnjenje toś teje dataje pominaś -addPasswordButton = Gronidło pśidaś passwordTryAgain = Wopacne gronidło. Wopytajśo hyšći raz. -// This label is followed by the password needed to download a file -passwordResult = Gronidło: { $password } +javascriptRequired = Send JavaScript trjeba +whyJavascript = Cogodla Send JavaScript trjeba? +enableJavascript = Pšosym zmóžniśo JavaScript a wopytajśo hyšći raz. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } góź. { $minutes } min. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min. +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna dłujkosć gronidła: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Toś to gronidło njedajo se nastajiś + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jadnore, priwatne datajowe źělenje +introDescription = { -send-brand } wam zmóžnja, dataje z koděrowanim kóńc do kóńca a wótkazom źěliś, kótaryž awtomatiski spadnjo. Tak móžośo źělone wopśimjeśe priwatne źaržaś a zawěsćiś, až waše daty online na pśecej njewóstanu. +notifyUploadEncryptDone = Waša dataja jo skoděrowana za słanje +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Spadnjo pó { $downloadCount } abo { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minuta + [two] { $num } minuśe + [few] { $num } minuty + *[other] { $num } minutow + } +timespanDays = + { $num -> + [one] { $num } źeń + [two] { $num } dnja + [few] { $num } dny + *[other] { $num } dnjow + } +timespanWeeks = + { $num -> + [one] { $num } tyźeń + [two] { $num } tyźenja + [few] { $num } tyźenje + *[other] { $num } tyźenjow + } +fileCount = + { $num -> + [one] { $num } dataja + [two] { $num } dataji + [few] { $num } dataje + *[other] { $num } datajow + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Cełkowna wjelikosć: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopěrujśo wótkaz, aby swóju dataju źělił: +copyLinkButton = Wótkaz kopěrowaś +downloadTitle = Dataje ześěgnuś +downloadDescription = Toś ta dataja jo se pśez { -send-brand } z koděrowanim kóńc do kóńca a wótkazom źěliła, kótaryž awtomatiski spadnjo. +trySendDescription = Wopytajśo { -send-brand } za jadnore, wěste datajowe źělenje. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Jano { $count } dataja dajo se naraz nagraś. + [two] Jano { $count } dataji dajotej se naraz nagraś. + [few] Jano { $count } dataje daju se naraz nagraś. + *[other] Jano { $count } datajow dajo se naraz nagraś. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Jano { $count } archiw jo dowólony. + [two] Jano { $count } archiwa stej dowólonej. + [few] Jano { $count } archiwy su dowólone. + *[other] Jano { $count } archiwow jo dowólone. + } +expiredTitle = Toś ten wótkaz jo spadnjony. +notSupportedDescription = { -send-brand } z toś tym wobglědowakom njefunkcioněrujo. { -send-short-brand } nejlěpjej z nejnowšeju wersiju { -firefox } funkcioněrujo, a funkcioněrujo z aktualneju wersiju nejwěcej wobglědowakow. +downloadFirefox = { -firefox } ześěgnuś +legalTitle = Powěźeńka priwatnosći { -send-short-brand } +legalDateStamp = Wersija 1.0 wót 12. měrca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }ź { $hours }g { $minutes }m +addFilesButton = Dataje za nagrawanje wubraś +uploadButton = Nagraś +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Śěgniśo a wótpołožćo dataje +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = abo klikniśo, aby do { $size } pósłał +addPassword = Z gronidłom šćitaś +emailPlaceholder = Zapódajśo swóju e-mailowu adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Pśizjawśo se, aby do { $size } pósłał +signInOnlyButton = Pśizjawiś +accountBenefitTitle = Załožćo konto { -firefox } abo pśizjawśo se +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dataje do { $size } źěliś +accountBenefitDownloadCount = Dataje z wěcej luźimi źěliś +accountBenefitTimeLimit = + { $count -> + [one] Wótkaze do { $count } dnja aktiwne źaržaś + [two] Wótkaze do { $count } dnjowu aktiwne źaržaś + [few] Wótkaze do { $count } dnjow aktiwne źaržaś + *[other] Wótkaze do { $count } dnjow aktiwne źaržaś + } +accountBenefitSync = Źělone dataje z někakego rěda zastojaś +accountBenefitMoz = Zgóńśo wěcej wó drugich słužbach { -mozilla } +signOut = Wótzjawiś +okButton = W pórěźe +downloadingTitle = Ześěgujo se +noStreamsWarning = Toś ten wobglědowak njamógał taku wjeliku dataju dešifrěrowaś. +noStreamsOptionCopy = Kopěrujśo wótkaz, aby jen w drugim wobglědowaku wócynił +noStreamsOptionFirefox = Wopytajśo naš nejlubšy wobglědowak +noStreamsOptionDownload = Z toś tym wobglědowakom pókšacowaś +downloadFirefoxPromo = { -send-short-brand } se wam pśez cele nowy { -firefox } pśinjaso. +# the next line after the colon contains a file name +shareLinkDescription = Źělśo wótkaz k swójej dataji: +shareLinkButton = Wótkaz źěliś +# $name is the name of the file +shareMessage = Ześěgniśo „{ $name }“ z { -send-brand }: jadnore, wěste źělenje datajow +trailheadPromo = Jo móžnosć, wašu priwatnosć šćitaś. Pśiźćo k Firefox. +learnMore = Dalšne informacije. diff --git a/public/locales/el/send.ftl b/public/locales/el/send.ftl index 2984721f..c08cbb3d 100644 --- a/public/locales/el/send.ftl +++ b/public/locales/el/send.ftl @@ -1,89 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = πείραμα διαδικτύου -siteFeedback = Σχόλια -uploadPageHeader = Ιδιωτική, κρυπτογραφημένη κοινή χρήση αρχείων -uploadPageExplainer = Στείλτε αρχεία μέσω ασφαλούς, ιδιωτικού και κρυπτογραφημένου συνδέσμου που λήγει αυτόματα ώστε να διασφαλίσετε ότι τα περιεχόμενά σας δεν θα παραμείνουν στο διαδίκτυο για πάντα. -uploadPageLearnMore = Μάθετε περισσότερα -uploadPageDropMessage = Εναποθέστε το αρχείο σας εδώ για έναρξη μεταφόρτωσης -uploadPageSizeMessage = Για περισσότερο αξιόπιστη λειτουργία, προτείνεται να διατηρήσετε το αρχείο κάτω από 1GB -uploadPageBrowseButton = Επιλέξτε αρχείο από τον υπολογιστή σας -uploadPageBrowseButton1 = Επιλέξτε ένα αρχείο για μεταφόρτωση -uploadPageMultipleFilesAlert = Η μεταφόρτωση πολλαπλών αρχείων ή φακέλου δεν υποστηρίζεται αυτή τη στιγμή. -uploadPageBrowseButtonTitle = Μεταφόρτωση αρχείου -uploadingPageProgress = Μεταφόρτωση του { $filename } ({ $size }) +title = Send importingFile = Εισαγωγή… -verifyingFile = Επαλήθευση... encryptingFile = Κρυπτογράφηση… decryptingFile = Αποκρυπτογράφηση… -notifyUploadDone = Η μεταφόρτωσή σας ολοκληρώθηκε. -uploadingPageMessage = Αφού μεταφορτωθούν τα αρχεία σας, θα μπορείτε να ορίσετε επιλογές λήξης. -uploadingPageCancel = Ακύρωση μεταφόρτωσης -uploadCancelNotification = Η μεταφόρτωσή σας ακυρώθηκε. -uploadingPageLargeFileMessage = Αυτό το αρχείο είναι μεγάλο και ίσως χρειαστεί λίγος αρκετός χρόνος για μεταφόρτωση. Χαλαρώστε! -uploadingFileNotification = Ειδοποίηση όταν ολοκληρωθεί η μεταφόρτωση. -uploadSuccessConfirmHeader = Έτοιμο για αποστολή -uploadSvgAlt = Μεταφόρτωση -uploadSuccessTimingHeader = Ο σύνδεσμος του αρχείου σας θα λήξει έπειτα από 1 λήψη ή 24 ώρες. -copyUrlFormLabelWithName = Αντιγράψτε και μοιραστείτε τον σύνδεσμο για αποστολή του αρχείου σας : { $filename } -copyUrlFormButton = Αντιγραφή στο πρόχειρο +downloadCount = + { $num -> + [one] 1 λήψη + *[other] { $num } λήψεις + } +timespanHours = + { $num -> + [one] 1 ώρα + *[other] { $num } ώρες + } copiedUrl = Αντιγράφτηκε! -deleteFileButton = Διαγραφή αρχείου -sendAnotherFileLink = Αποστολή άλλου αρχείου -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Λήψη -downloadFileName = Λήψη του { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Εισαγωγή κωδικού πρόσβασης unlockInputPlaceholder = Κωδικός πρόσβασης unlockButtonLabel = Ξεκλείδωμα -downloadFileTitle = Λήψη κρυπτογραφημένου αρχείου -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ο/Η φίλος/-η σας, σάς στέλνει ένα αρχείο με τη βοήθεια του Firefox Send, μιας υπηρεσίας που επιτρέπει τον διαμοιρασμό αρχείων μέσω ενός ασφαλούς, ιδιωτικού και κρυπτογραφημένου συνδέσμου που λήγει αυτόματα, ώστε να είστε σίγουροι ότι τα αρχεία σας δεν θα παραμείνουν στο διαδίκτυο για πάντα. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Λήψη -downloadNotification = Η λήψη σας ολοκληρώθηκε. downloadFinish = Η λήψη ολοκληρώθηκε -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } από { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Δοκιμάστε το Firefox Send -downloadingPageProgress = Γίνεται λήψη του { $filename } ({ $size }) -downloadingPageMessage = Παρακαλώ αφήστε ανοικτή αυτή την καρτέλα όσο λαμβάνουμε και αποκρυπτογραφούμε το αρχείο σας. -errorAltText = Σφάλμα μεταφόρτωσης +sendYourFilesLink = Δοκιμάστε το Send errorPageHeader = Κάτι πήγε στραβά! -errorPageMessage = Παρουσιάστηκε σφάλμα κατά τη μεταφόρτωση του αρχείου. -errorPageLink = Αποστολή άλλου αρχείου fileTooBig = Αυτό το αρχείο είναι πολύ μεγάλο για μεταφόρτωση. Πρέπει να είναι μικρότερο από { $size }. linkExpiredAlt = Ο σύνδεσμος έληξε -expiredPageHeader = Αυτός ο σύνδεσμος έχει λήξει ή δεν υπήρξε ποτέ! notSupportedHeader = Το πρόγραμμα περιήγησής σας δεν υποστηρίζεται. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Δυστυχώς, αυτό το πρόγραμμα περιήγησης δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Firefox Send. Θα πρέπει να δοκιμάσετε ένα άλλο πρόγραμμα περιήγησης. Προτείνουμε το Firefox! notSupportedLink = Γιατί δεν υποστηρίζεται το πρόγραμμα περιήγησής μου; -notSupportedOutdatedDetail = Δυστυχώς, αυτή η έκδοση του Firefox δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Firefox Send. Πρέπει να ενημερώσετε το πρόγραμμα περιήγησής σας. +notSupportedOutdatedDetail = Δυστυχώς, αυτή η έκδοση του Firefox δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Send. Πρέπει να ενημερώσετε το πρόγραμμα περιήγησής σας. updateFirefox = Ενημέρωση Firefox -downloadFirefoxButtonSub = Δωρεάν λήψη -uploadedFile = Αρχείο -copyFileList = Αντιγραφή URL -// expiryFileList is used as a column header -expiryFileList = Λήγει σε -deleteFileList = Διαγραφή -nevermindButton = Μην ανησυχείτε -legalHeader = Όροι & απόρρητο -legalNoticeTestPilot = Το Firefox Send αποτελεί προς το παρόν ένα πείραμα Test Pilot και υπόκειται στους όρους υπηρεσίας και την πολιτική απορρήτου του Test Pilot. Μπορείτε να μάθετε περισσότερα γι' αυτό το πείραμα και τη συλλογή δεδομένων εδώ. -legalNoticeMozilla = Η χρήση της ιστοσελίδας Firefox Send υπόκειται επίσης στην πολιτική απορρήτου ιστοσελίδων και τους όρους χρήσης ιστοσελίδων της Mozilla. -deletePopupText = Διαγραφή αρχείου; -deletePopupYes = Ναι deletePopupCancel = Ακύρωση deleteButtonHover = Διαγραφή -copyUrlHover = Αντιγραφή URL -footerLinkLegal = Νομικά -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Σχετικά με το Test Pilot -footerLinkPrivacy = Απόρρητο -footerLinkTerms = Όροι -footerLinkCookies = Cookies -requirePasswordCheckbox = Απαίτηση κωδικού πρόσβασης για λήψη του αρχείου -addPasswordButton = Προσθήκη κωδικού πρόσβασης -incorrectPassword = Λάθος κωδικός πρόσβασης. Προσπάθεια ξανά; +passwordTryAgain = Λάθος κωδικός πρόσβασης. Δοκιμάστε ξανά. +javascriptRequired = Το Send απαιτεί JavaScript +whyJavascript = Γιατί το Send απαιτεί JavaScript; +enableJavascript = Παρακαλώ ενεργοποιήστε το JavaScript και δοκιμάστε ξανά. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ώ { $minutes }λ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }λ +# A short status message shown when the user enters a long password +maxPasswordLength = Μέγιστο μήκος κωδικού: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Δεν ήταν δυνατός ο ορισμός αυτού του κωδικού + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Απλή, ιδιωτική κοινή χρήση αρχείων +introDescription = Το { -send-brand } σάς επιτρέπει να μοιράζεστε αρχεία με από άκρη σε άκρη κρυπτογράφηση και ένα σύνδεσμο που λήγει αυτόματα. Έτσι, ό,τι μοιράζεστε παραμένει ιδιωτικό και είστε βέβαιοι πως δεν παραμένει στο διαδίκτυο για πάντα. +notifyUploadEncryptDone = Το αρχείο σας έχει κρυπτογραφηθεί και είναι έτοιμο για αποστολή +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Λήγει μετά από { $downloadCount } ή { $timespan } +timespanMinutes = + { $num -> + [one] 1 λεπτό + *[other] { $num } λεπτά + } +timespanDays = + { $num -> + [one] 1 ημέρα + *[other] { $num } ημέρες + } +timespanWeeks = + { $num -> + [one] 1 εβδομάδα + *[other] { $num } εβδομάδες + } +fileCount = + { $num -> + [one] 1 αρχείο + *[other] { $num } αρχεία + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Συνολικό μέγεθος: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Αντιγράψτε το σύνδεσμο για να μοιραστείτε το αρχείο: +copyLinkButton = Αντιγραφή συνδέσμου +downloadTitle = Λήψη αρχείων +downloadDescription = Αυτό το αρχείο διαμοιράστηκε μέσω του { -send-brand } με κρυπτογράφηση από άκρο σε άκρο και με ένα σύνδεσμο που λήγει αυτόματα. +trySendDescription = Δοκιμάστε το { -send-brand } για απλό, ασφαλή διαμοιρασμό αρχείων. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Μόνο 1 αρχείο μπορεί να μεταφορτωθεί κάθε φορά. + *[other] Μόνο { $count } αρχεία μπορούν να μεταφορτωθούν κάθε φορά. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Μόνο 1 αρχείο επιτρέπεται. + *[other] Μόνο { $count } αρχεία επιτρέπονται. + } +expiredTitle = Αυτός ο σύνδεσμος έχει λήξει. +notSupportedDescription = Το { -send-brand } δεν θα λειτουργήσει με αυτό το πρόγραμμα περιήγησης. Το { -send-short-brand } λειτουργεί καλύτερα με την πιο πρόσφατη έκδοση του { -firefox }, καθώς και με την τρέχουσα έκδοση των περισσότερων προγραμμάτων περιήγησης. +downloadFirefox = Λήψη του { -firefox } +legalTitle = Σημείωση Απορρήτου { -send-short-brand } +legalDateStamp = Έκδοση 1.0, από 12 Μαρτίου 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }η { $hours }ώ { $minutes }λ +addFilesButton = Επιλέξτε αρχεία για μεταφόρτωση +uploadButton = Μεταφόρτωση +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Σύρετε και εναποθέστε αρχεία +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ή κάντε κλικ για να στείλετε μέχρι { $size } +addPassword = Προστασία με κωδικό πρόσβασης +emailPlaceholder = Εισάγετε το email σας +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Συνδεθείτε για να στείλετε μέχρι { $size } +signInOnlyButton = Σύνδεση +accountBenefitTitle = Δημιουργία λογαριασμού { -firefox } ή σύνδεση +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Μοιραστείτε αρχεία έως { $size } +accountBenefitDownloadCount = Μοιραστείτε αρχεία με περισσότερα άτομα +accountBenefitTimeLimit = + { $count -> + [one] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και 1 ημέρα + *[other] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και { $count } ημέρες + } +accountBenefitSync = Διαχειριστείτε τα διαμοιρασμένα αρχεία από οποιαδήποτε συσκευή +accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla } +signOut = Αποσύνδεση +okButton = OK +downloadingTitle = Γίνεται λήψη +noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους. +noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης +noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης +noStreamsOptionDownload = Συνέχεια με αυτό το πρόγραμμα περιήγησης +downloadFirefoxPromo = Το { -send-short-brand } παρέχεται σε εσάς από το ολοκαίνουριο { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Μοιραστείτε το σύνδεσμο του αρχείου σας: +shareLinkButton = Κοινή χρήση συνδέσμου +# $name is the name of the file +shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων +trailheadPromo = Υπάρχει τρόπος να προστατέψετε το απόρρητό σας. Γίνετε μέλος του Firefox. +learnMore = Μάθετε περισσότερα. diff --git a/public/locales/en-CA/send.ftl b/public/locales/en-CA/send.ftl new file mode 100644 index 00000000..a7b71adf --- /dev/null +++ b/public/locales/en-CA/send.ftl @@ -0,0 +1,151 @@ +title = Send +importingFile = Importing… +encryptingFile = Encrypting… +decryptingFile = Decrypting… +downloadCount = + { $num -> + [one] 1 download + *[other] { $num } downloads + } +timespanHours = + { $num -> + [one] 1 hour + *[other] { $num } hours + } +copiedUrl = Copied! +unlockInputPlaceholder = Password +unlockButtonLabel = Unlock +downloadButtonLabel = Download +downloadFinish = Download Complete +fileSizeProgress = ({ $partialSize } of { $totalSize }) +sendYourFilesLink = Try Send +errorPageHeader = Something went wrong! +fileTooBig = That file is too big to upload. It should be less than { $size }. +linkExpiredAlt = Link expired +notSupportedHeader = Your browser is not supported. +notSupportedLink = Why is my browser not supported? +notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. +updateFirefox = Update Firefox +deletePopupCancel = Cancel +deleteButtonHover = Delete +passwordTryAgain = Incorrect password. Try again. +javascriptRequired = Send requires JavaScript +whyJavascript = Why does Send require JavaScript? +enableJavascript = Please enable JavaScript and try again. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximum password length: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = This password could not be set + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simple, private file sharing +introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. +notifyUploadEncryptDone = Your file is encrypted and ready to send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = + { $num -> + [one] 1 day + *[other] { $num } days + } +timespanWeeks = + { $num -> + [one] 1 week + *[other] { $num } weeks + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } files + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total size: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copy the link to share your file: +copyLinkButton = Copy link +downloadTitle = Download files +downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. +trySendDescription = Try { -send-brand } for simple, safe file sharing. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Only 1 file can be uploaded at a time. + *[other] Only { $count } files can be uploaded at a time. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Only 1 archive is allowed. + *[other] Only { $count } archives are allowed. + } +expiredTitle = This link has expired. +notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. +downloadFirefox = Download { -firefox } +legalTitle = { -send-short-brand } Privacy Notice +legalDateStamp = Version 1.0, dated March 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Select files to upload +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Drag and drop files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = or click to send up to { $size } +addPassword = Protect with password +emailPlaceholder = Enter your email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Sign in to send up to { $size } +signInOnlyButton = Sign in +accountBenefitTitle = Create a { -firefox } Account or sign in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Share files up to { $size } +accountBenefitDownloadCount = Share files with more people +accountBenefitTimeLimit = + { $count -> + [one] Keep links active for up to 1 day + *[other] Keep links active for up to { $count } days + } +accountBenefitSync = Manage shared files from any device +accountBenefitMoz = Learn about other { -mozilla } services +signOut = Sign out +okButton = OK +downloadingTitle = Downloading +noStreamsWarning = This browser might not be able to decrypt a file this big. +noStreamsOptionCopy = Copy the link to open in another browser +noStreamsOptionFirefox = Try our favourite browser +noStreamsOptionDownload = Continue with this browser +downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Share the link to your file: +shareLinkButton = Share link +# $name is the name of the file +shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing +trailheadPromo = There is a way to protect your privacy. Join Firefox. +learnMore = Learn more. + +sponsoredByThunderbird = Sponsored by Thunderbird diff --git a/public/locales/en-GB/send.ftl b/public/locales/en-GB/send.ftl new file mode 100644 index 00000000..3b57c4e4 --- /dev/null +++ b/public/locales/en-GB/send.ftl @@ -0,0 +1,156 @@ +title = Send +importingFile = Importing… +encryptingFile = Encrypting… +decryptingFile = Decrypting… +downloadCount = + { $num -> + [one] 1 download + *[other] { $num } downloads + } +timespanHours = + { $num -> + [one] 1 hour + *[other] { $num } hours + } +copiedUrl = Copied! +unlockInputPlaceholder = Password +unlockButtonLabel = Unlock +downloadButtonLabel = Download +downloadFinish = Download Complete +fileSizeProgress = ({ $partialSize } of { $totalSize }) +sendYourFilesLink = Try Send +errorPageHeader = Something went wrong! +fileTooBig = That file is too big to upload. It should be less than { $size }. +linkExpiredAlt = Link expired +notSupportedHeader = Your browser is not supported. +notSupportedLink = Why is my browser not supported? +notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. +updateFirefox = Update Firefox +deletePopupCancel = Cancel +deleteButtonHover = Delete +footerText = Not affiliated with Mozilla or Firefox. +footerLinkDonate = Donate +footerLinkCli = CLI +footerLinkDmca = DMCA +footerLinkSource = Source +passwordTryAgain = Incorrect password. Try again. +javascriptRequired = Send requires JavaScript +whyJavascript = Why does Send require JavaScript? +enableJavascript = Please enable JavaScript and try again. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximum password length: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = This password could not be set + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simple, private file sharing +introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. +notifyUploadEncryptDone = Your file is encrypted and ready to send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = + { $num -> + [one] 1 day + *[other] { $num } days + } +timespanWeeks = + { $num -> + [one] 1 week + *[other] { $num } weeks + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } files + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total size: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copy the link to share your file: +copyLinkButton = Copy link +downloadTitle = Download files +downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. +trySendDescription = Try { -send-brand } for simple, safe file sharing. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Only 1 file can be uploaded at a time. + *[other] Only { $count } files can be uploaded at a time. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Only 1 archive is allowed. + *[other] Only { $count } archives are allowed. + } +expiredTitle = This link has expired. +notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. +downloadFirefox = Download { -firefox } +legalTitle = { -send-short-brand } Privacy Notice +legalDateStamp = Version 1.0, dated March 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Select files to upload +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Drag and drop files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = or click to send up to { $size } +addPassword = Protect with password +emailPlaceholder = Enter your email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Sign in to send up to { $size } +signInOnlyButton = Sign in +accountBenefitTitle = Create a { -firefox } Account or sign in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Share files up to { $size } +accountBenefitDownloadCount = Share files with more people +accountBenefitTimeLimit = + { $count -> + [one] Keep links active for up to 1 day + *[other] Keep links active for up to { $count } days + } +accountBenefitSync = Manage shared files from any device +accountBenefitMoz = Learn about other { -mozilla } services +signOut = Sign out +okButton = OK +downloadingTitle = Downloading +noStreamsWarning = This browser might not be able to decrypt a file this big. +noStreamsOptionCopy = Copy the link to open in another browser +noStreamsOptionFirefox = Try our favourite browser +noStreamsOptionDownload = Continue with this browser +downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Share the link to your file: +shareLinkButton = Share link +# $name is the name of the file +shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing +trailheadPromo = There is a way to protect your privacy. Join Firefox. +learnMore = Learn more. + +sponsoredByThunderbird = Sponsored by Thunderbird diff --git a/public/locales/en-US/send.ftl b/public/locales/en-US/send.ftl index 094908e5..f42090c7 100644 --- a/public/locales/en-US/send.ftl +++ b/public/locales/en-US/send.ftl @@ -1,91 +1,147 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = web experiment -siteFeedback = Feedback -uploadPageHeader = Private, Encrypted File Sharing -uploadPageExplainer = Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever. -uploadPageLearnMore = Learn more -uploadPageDropMessage = Drop your file here to start uploading -uploadPageSizeMessage = For the most reliable operation, it’s best to keep your file under 1GB -uploadPageBrowseButton = Select a file on your computer -uploadPageBrowseButton1 = Select a file to upload -uploadPageMultipleFilesAlert = Uploading multiple files or a folder is currently not supported. -uploadPageBrowseButtonTitle = Upload file -uploadingPageProgress = Uploading { $filename } ({ $size }) +title = Send importingFile = Importing… -verifyingFile = Verifying… encryptingFile = Encrypting… decryptingFile = Decrypting… -notifyUploadDone = Your upload has finished. -uploadingPageMessage = Once your file uploads you will be able to set expiry options. -uploadingPageCancel = Cancel upload -uploadCancelNotification = Your upload was cancelled. -uploadingPageLargeFileMessage = This file is large and may take a while to upload. Sit tight! -uploadingFileNotification = Notify me when the upload is complete. -uploadSuccessConfirmHeader = Ready to Send -uploadSvgAlt = Upload -uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours. -copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename } -copyUrlFormButton = Copy to clipboard +downloadCount = { $num -> + [one] 1 download + *[other] { $num } downloads + } +timespanHours = { $num -> + [one] 1 hour + *[other] { $num } hours + } copiedUrl = Copied! -deleteFileButton = Delete file -sendAnotherFileLink = Send another file -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Download -downloadFileName = Download { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Enter Password unlockInputPlaceholder = Password unlockButtonLabel = Unlock -downloadFileTitle = Download Encrypted File -// Firefox Send is a brand name and should not be localized. -downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Download -downloadNotification = Your download has completed. -downloadFinish = Download Complete -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Download complete fileSizeProgress = ({ $partialSize } of { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Try Firefox Send -downloadingPageProgress = Downloading { $filename } ({ $size }) -downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it. -errorAltText = Upload error +sendYourFilesLink = Try Send errorPageHeader = Something went wrong! -errorPageMessage = There has been an error uploading the file. -errorPageLink = Send another file -fileTooBig = That file is too big to upload. It should be less than { $size }. +fileTooBig = That file is too big to upload. It should be less than { $size } linkExpiredAlt = Link expired -expiredPageHeader = This link has expired or never existed in the first place! notSupportedHeader = Your browser is not supported. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. You’ll need to try another browser. We recommend Firefox! notSupportedLink = Why is my browser not supported? -notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser. +notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. updateFirefox = Update Firefox -downloadFirefoxButtonSub = Free Download -uploadedFile = File -copyFileList = Copy URL -// expiryFileList is used as a column header -expiryFileList = Expires In -deleteFileList = Delete -nevermindButton = Never mind -legalHeader = Terms & Privacy -legalNoticeTestPilot = Firefox Send is currently a Test Pilot experiment, and subject to the Test Pilot Terms of Service and Privacy Notice. You can learn more about this experiment and its data collection here. -legalNoticeMozilla = Use of the Firefox Send website is also subject to Mozilla’s Websites Privacy Notice and Websites Terms of Use. -deletePopupText = Delete this file? -deletePopupYes = Yes deletePopupCancel = Cancel deleteButtonHover = Delete -copyUrlHover = Copy URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = About Test Pilot -footerLinkPrivacy = Privacy -footerLinkTerms = Terms -footerLinkCookies = Cookies -requirePasswordCheckbox = Require a password to download this file -addPasswordButton = Add password +footerText = Not affiliated with Mozilla or Firefox. +footerLinkDonate = Donate +footerLinkCli = CLI +footerLinkDmca = DMCA +footerLinkSource = Source passwordTryAgain = Incorrect password. Try again. -// This label is followed by the password needed to download a file -passwordResult = Password: { $password } \ No newline at end of file +javascriptRequired = Send requires JavaScript +whyJavascript = Why does Send require JavaScript? +enableJavascript = Please enable JavaScript and try again. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximum password length: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = This password could not be set + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla + +introTitle = Simple, private file sharing +introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. +notifyUploadEncryptDone = Your file is encrypted and ready to send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } +timespanMinutes = { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = { $num -> + [one] 1 day + *[other] { $num } days + } +timespanWeeks = { $num -> + [one] 1 week + *[other] { $num } weeks + } +fileCount = { $num -> + [one] 1 file + *[other] { $num } files +} +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total size: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copy the link to share your file: +copyLinkButton = Copy link +downloadTitle = Download files +downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. +trySendDescription = Try { -send-brand } for simple, safe file sharing. +# count will always be > 10 +tooManyFiles = { $count -> + [one] Only 1 file can be uploaded at a time. + *[other] Only { $count } files can be uploaded at a time. +} +# count will always be > 10 +tooManyArchives = { $count -> + [one] Only 1 archive is allowed. + *[other] Only { $count } archives are allowed. +} +expiredTitle = This link has expired. +notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. +downloadFirefox = Download { -firefox } +legalTitle = { -send-short-brand } Privacy Notice +legalDateStamp = Version 1.0, dated March 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Select files to upload +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Drag and drop files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = or click to send up to { $size } +addPassword = Protect with password +emailPlaceholder = Enter your email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Sign in to send up to { $size } +signInOnlyButton = Sign in +accountBenefitTitle = Create a { -firefox } Account or sign in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Share files up to { $size } +accountBenefitDownloadCount = Share files with more people +accountBenefitTimeLimit = { $count -> + [one] Keep links active for up to 1 day + *[other] Keep links active for up to { $count } days +} +accountBenefitSync = Manage shared files from any device +accountBenefitMoz = Learn about other { -mozilla } services +signOut = Sign out +okButton = OK +downloadingTitle = Downloading +noStreamsWarning = This browser might not be able to decrypt a file this big. +noStreamsOptionCopy = Copy the link to open in another browser +noStreamsOptionFirefox = Try our favorite browser +noStreamsOptionDownload = Continue with this browser +downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Share the link to your file: +shareLinkButton = Share link +# $name is the name of the file +shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing +learnMore = Learn more. + +sponsoredByThunderbird = Sponsored by Thunderbird diff --git a/public/locales/es-AR/send.ftl b/public/locales/es-AR/send.ftl index a5090a64..2a78c100 100644 --- a/public/locales/es-AR/send.ftl +++ b/public/locales/es-AR/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Opinión -uploadPageHeader = Compartir archivos cifrados y privados -uploadPageExplainer = Enviá archivos a través de un enlace cifrado, privado y seguro que expirará automáticamente para que tus datos no queden en línea para siempre. -uploadPageLearnMore = Conocer más -uploadPageDropMessage = Arrastrá el archivo hasta acá para empezar a subir -uploadPageSizeMessage = Para una operación más confiable, es mejor que el archivo tenga menos de 1GB -uploadPageBrowseButton = Seleccioná un archivo en tu computadora -uploadPageBrowseButton1 = Seleccioná un archivo para subir -uploadPageMultipleFilesAlert = Cargar múltiples archivos o una carpeta todavía no está soportado. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) +title = Send importingFile = Importando… -verifyingFile = Verificando… encryptingFile = Cifrando… decryptingFile = Descifrando… -notifyUploadDone = La carga ha terminado. -uploadingPageMessage = Una vez que se cargue el archivo podrás modificar las opciones de expiración. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = La subida fue cancelada. -uploadingPageLargeFileMessage = El archivo es grande y puede tardar un rato en subir. ¡Quedate quieto! -uploadingFileNotification = Notificarme cuando la subida se complete. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace al archivo expirará después de 1 descarga o en 24 horas. -copyUrlFormLabelWithName = Copiá y compartí el enlace para enviar tu archivo: { $filename } -copyUrlFormButton = Copiar al portapapeles +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargas + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } copiedUrl = ¡Copiado! -deleteFileButton = Borrar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadFileName = Descargar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ingresar contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Descargar archivo cifrado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que permite compartir archivos con un enlace cifrado, seguro y privado que expira automáticamente para asegurar que tus datos no quedan en línea para siempre. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = La descarga se completó. downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Probá Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Dejá esta pestaña abierta mientras descargamos el archivo y lo desciframos. -errorAltText = Error de subida +sendYourFilesLink = Probá Send errorPageHeader = ¡Algo falló! -errorPageMessage = Hubo un error al subir el archivo. -errorPageLink = Enviar otro archivo fileTooBig = El archivo es demasiado grande para subir. Debería tener menos de { $size }. linkExpiredAlt = Enlace explirado -expiredPageHeader = ¡Este enlace ha expirado o nunca existió en primer lugar! notSupportedHeader = El navegador no está soportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Desafortunadamente este navegador no soporta la tecnología web que necesita Firefox Send. Deberías probar otro navegador. ¡Te recomendamos Firefox! notSupportedLink = ¿Por qué mi navegador no está soportado? -notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox no soporta la tecnología web que necesita Firefox Send. Necesitás actualizar el navegador. +notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox no soporta la tecnología web que necesita Send. Necesitás actualizar el navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira en -deleteFileList = Borrar -nevermindButton = No importa -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send es actualmente un experimento de Test Pilot y está sujeto a los términos de servicio y la nota de privacidad de Test Pilot. Podés conocer más sobre este experimento y su recolección de datos aquí. -legalNoticeMozilla = El uso del sitio web de Firefox Send también está sujeto a la nota de privacidad de sitios web y los términos de uso de sitios web de Mozilla. -deletePopupText = ¿Borrar este archivo? -deletePopupYes = Si deletePopupCancel = Cancelar deleteButtonHover = Borrar -copyUrlHover = Copiar URL -footerLinkLegal = Legales -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca de Test Pilot -footerLinkPrivacy = Privacidad -footerLinkTerms = Términos -footerLinkCookies = Cookies -requirePasswordCheckbox = Requerir contraseña para descargar este archivo -addPasswordButton = Agregar contraseña passwordTryAgain = Contraseña incorrecta. Intentá nuevamente. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } +javascriptRequired = Send requiere JavaScript +whyJavascript = ¿Por qué Send requiere Java Script? +enableJavascript = Por favor habilite JavaScript y pruebe de nuevo. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = h { $hours } m { $minutes } +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = m { $minutes } +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No se pudo establecer la contraseña + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Intercambio de archivos sencillo y privado +introDescription = { -send-brand } le permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así puede mantener privado lo que comparte y asegurarse de que sus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = Su archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Vence después de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir su archivo: +copyLinkButton = Copiar enlace +downloadTitle = Descargar archivos +downloadDescription = Este archivo se compartió a través de { -send-brand } con cifrado de extremo a extremo y un enlace que caduca automáticamente. +trySendDescription = Pruebe { -send-brand } para compartir archivos de forma sencilla y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo se puede subir 1 archivo a la vez. + *[other] Solo se pueden subir archivos { $count } a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo se permite 1 archivo. + *[other] Solo se permiten { $count } archivos. + } +expiredTitle = Este enlace caducó. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox }, y funcionará con la versión actual de la mayoría de los navegadores. +downloadFirefox = Descargue { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0, con fecha 12 de marzo de 2019. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Seleccionar archivos para subir +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastrar y soltar archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o haga clic para enviar hasta { $size } +addPassword = Proteger con contraseña +emailPlaceholder = Ingrese su correo electrónico +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Inicie sesión para enviar hasta { $size } +signInOnlyButton = Iniciar sesión +accountBenefitTitle = Cree una cuenta de { -firefox } o inicie la sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir archivos hasta { $size } +accountBenefitDownloadCount = Compartir archivos con más personas +accountBenefitTimeLimit = + { $count -> + [one] Mantenga los enlaces activos hasta por 1 día + *[other] Mantenga los enlaces activos hasta por { $count } días + } +accountBenefitSync = Administre archivos compartidos desde cualquier dispositivo. +accountBenefitMoz = Conocer sobre otros servicios de { -mozilla } +signOut = Salir +okButton = Aceptar +downloadingTitle = Descargando +noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador. +noStreamsOptionFirefox = Pruebe nuestro navegador favorito +noStreamsOptionDownload = Continuar con este navegador +downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Compartir el enlace con tu dispositivo: +shareLinkButton = Compartir el enlace +# $name is the name of the file +shareMessage = Descargar "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura +trailheadPromo = Hay una forma de proteger tu privacidad. Unite a Firefox. +learnMore = Conocer más. diff --git a/public/locales/es-CL/send.ftl b/public/locales/es-CL/send.ftl index ea7fcf98..adc02eef 100644 --- a/public/locales/es-CL/send.ftl +++ b/public/locales/es-CL/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Comentarios -uploadPageHeader = Compartir archivos de forma privada y cifrada -uploadPageExplainer = Enviar archivos a través de un enlace seguro, privado y cifrado que automáticamente expira para asegurar que tus cosas no permanecerán en línea por la eternidad. -uploadPageLearnMore = Aprender más -uploadPageDropMessage = Suelta tu archivo aquí para empezar a subirlo -uploadPageSizeMessage = Para una operación más confiable, es mejor mantener el tamaño del archivo bajo 1 GB -uploadPageBrowseButton = Selecciona un archivo en tu computador -uploadPageBrowseButton1 = Selecciona un archivo a subir -uploadPageMultipleFilesAlert = Subir múltiples archivos o una carpeta actualmente no es posible. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) +title = Send importingFile = Importando… -verifyingFile = Verificando… encryptingFile = Cifrando… decryptingFile = Descifrando… -notifyUploadDone = Tu subida ha terminado. -uploadingPageMessage = Una vez que tu archivo sea subido podrás ajustar las opciones de expiración. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = Tu subida fue cancelada. -uploadingPageLargeFileMessage = Este archivo es grande y puede tardar un rato en subir. ¡Aprovecha de hacer algo mientras! -uploadingFileNotification = Notificarme cuando la subida sea completada. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace a tu archivo expirará tras 1 descarga o en 24 horas. -copyUrlFormLabelWithName = Copia y comparte el enlace para enviar tu archivo: { $filename } -copyUrlFormButton = Copiar al portapapeles +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargas + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } copiedUrl = ¡Copiado! -deleteFileButton = Eliminar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadFileName = Descargar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ingresar contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Bajar archivo cifrado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que expira automáticamente para asegurar que tus cosas no queden en línea de por vida. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = Tu descarga se completó. downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Probar Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Por favor, deja esta pestaña abierta mientras recibimos tu archivo y lo desciframos. -errorAltText = Error de subida +sendYourFilesLink = Probar Send errorPageHeader = ¡Algo se fue a las pailas! -errorPageMessage = Hubo un error al subir el archivo. -errorPageLink = Enviar otro archivo fileTooBig = Ese archivo es muy grande para ser subido. Debiera tener un tamaño menor a { $size }. linkExpiredAlt = Enlace expirado -expiredPageHeader = ¡Este enlace ha expirado o quizá jamás existió! notSupportedHeader = Tu navegador no está soportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Lamentablemente este navegador no soporta la tecnología web que potencia a Firefox Send. Deberás probar en otro navegador. ¡Recomendamos Firefox! notSupportedLink = ¿Por qué mi navegador no es soportado? -notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador. +notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira en -deleteFileList = Eliminar -nevermindButton = Da lo mismo -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send es actualmente un experimento de Test Pilot, y está sujeto a los Términos del servicio y la Política de privacidad de Test Pilot. Puedes aprender más sobre este experimento y su recolección de datos aquí. -legalNoticeMozilla = El uso del sitio web de Firefox Send también está sujeto a la Política de privacidad de sitios web y los Términos de uso de sitios web de Mozilla. -deletePopupText = ¿Eliminar este archivo? -deletePopupYes = Sí deletePopupCancel = Cancelar deleteButtonHover = Eliminar -copyUrlHover = Copiar URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca de Test Pilot -footerLinkPrivacy = Privacidad -footerLinkTerms = Términos -footerLinkCookies = Cookies -requirePasswordCheckbox = Requerir una contraseña para descargar este archivo -addPasswordButton = Añadir contraseña passwordTryAgain = Contraseña incorrecta. Vuelve a intentarlo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } +javascriptRequired = Send requiere JavaScript. +whyJavascript = ¿Por qué Send requiere JavaScript? +enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Esta contraseña no pudo ser establecida + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Intercambio de archivos simple y privado +introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que expira automáticamente. Así puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira después de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir el archivo: +copyLinkButton = Copiar enlace +downloadTitle = Bajando archivos +downloadDescription = Este archivo fue compartido a través de { -send-brand } con cifrado de punto a punto y un enlace que expira automáticamente. +trySendDescription = Prueba { -send-brand } para compartir archivos de forma simple y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo 1 archivo puede ser subido a la vez. + *[other] Solo { $count } archivos pueden ser subidos a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo 1 archivo está permitido. + *[other] Solo { $count } archivos están permitidos. + } +expiredTitle = Este enlace ha expirado. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox } y con la versión actual de la mayoría de los navegadores. +downloadFirefox = Bajar { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selecciona los archivos a subir +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastra y suelta archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o haz clic para enviar hasta { $size } +addPassword = Protegido con contraseña +emailPlaceholder = Ingresa tu correo +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Conéctate para enviar hasta { $size } +signInOnlyButton = Conectarse +accountBenefitTitle = Crea una cuenta de { -firefox } o conéctate +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Comparte archivos de hasta { $size } +accountBenefitDownloadCount = Comparte archivos con más personas +accountBenefitTimeLimit = + { $count -> + [one] Mantener enlaces activos durante 1 día + *[other] Mantener enlaces activos durante { $count } días + } +accountBenefitSync = Administrar los archivos compartidos desde cualquier dispositivo +accountBenefitMoz = Aprender más acerca de otros servicios de { -mozilla } +signOut = Salir +okButton = Aceptar +downloadingTitle = Bajando +noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador +noStreamsOptionFirefox = Prueba nuestro navegador favorito +noStreamsOptionDownload = Continuar con este navegador +downloadFirefoxPromo = { -send-short-brand } es traído a ti por el renovado { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Comparte el enlace a tu dispositivo: +shareLinkButton = Compartir enlace +# $name is the name of the file +shareMessage = Baja "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura +trailheadPromo = Hay una forma de proteger tu privacidad. Únete a Firefox. +learnMore = Aprender más. diff --git a/public/locales/es-ES/send.ftl b/public/locales/es-ES/send.ftl index bf9e6114..5800bfc8 100644 --- a/public/locales/es-ES/send.ftl +++ b/public/locales/es-ES/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Comentario -uploadPageHeader = Compartir archivos cifrados y privados -uploadPageExplainer = Envía archivos a través de un enlace cifrado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida. -uploadPageLearnMore = Descubre más -uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo -uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB -uploadPageBrowseButton = Seleccionar un archivo en el equipo -uploadPageBrowseButton1 = Seleccionar un archivo para subir -uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) -importingFile = Imporando... -verifyingFile = Comprobando... -encryptingFile = Encriptando... -decryptingFile = Desencriptando... -notifyUploadDone = La subida ha finalizado. -uploadingPageMessage = Cuando se suba tu archivo podrás condigurar las opciones de caducidad. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = Se canceló la subida. -uploadingPageLargeFileMessage = El archivo es grande y puede tardar unos minutos en subirse. ¡Tómatelo con calma! -uploadingFileNotification = Notificarme cuando se complete la subida. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace al archivo caducará tras descargarlo una vez o en 24 horas. -copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: { $filename } -copyUrlFormButton = Copiar en el portapapeles +title = Send +importingFile = Importando... +encryptingFile = Cifrando... +decryptingFile = Descifrando... +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargas + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } copiedUrl = ¡Copiado! -deleteFileButton = Eliminar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadFileName = Descargar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Introducir contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Descargar archivo encriptado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = Se completó la descarga. downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prueba Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos. -errorAltText = Error en la subida -errorPageHeader = ¡Se produjo un error! -errorPageMessage = Se produjo un error al subir el archivo. -errorPageLink = Enviar otro archivo +sendYourFilesLink = Prueba Send +errorPageHeader = ¡Se ha producido un error! fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }. linkExpiredAlt = Enlace caducado -expiredPageHeader = ¡El enlace ha caducado o nunca existió! -notSupportedHeader = Tu navegador no está admitido. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox! -notSupportedLink = ¿Por qué no se admite mi navegador? -notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Firefox Send. Tendrás que actualizar tu navegador. +notSupportedHeader = Tu navegador no es compatible. +notSupportedLink = ¿Por qué mi navegador no es compatible? +notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Send. Tendrás que actualizar tu navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Caduca en -deleteFileList = Eliminar -nevermindButton = Da igual -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send sigue siendo un experimento de Test Pilot y está sujero a las Condiciones del servicio y al Aviso de privacidad de Test Pilot. -legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto al Aviso de privacidad sobre sitios web y a los Términos de uso sobre sitios web. -deletePopupText = ¿Eliminar el archivo? -deletePopupYes = Sí deletePopupCancel = Cancelar deleteButtonHover = Eliminar -copyUrlHover = Copiar URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Sobre Test Pilot -footerLinkPrivacy = Privacidad -footerLinkTerms = Términos -footerLinkCookies = Cookies -requirePasswordCheckbox = Requerir una contraseña para descargar este archivo -addPasswordButton = Añadir contraseña -passwordTryAgain = Contraseña incorrecta. Inténtelo de nuevo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } +passwordTryAgain = Contraseña incorrecta. Inténtalo de nuevo. +javascriptRequired = Send requiere JavaScript +whyJavascript = ¿Por qué Send requiere JavaScript? +enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No se ha podido establecer la contraseña + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Enviar +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartir archivos de forma sencilla y privada +introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así que puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = El archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca tras { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir el archivo: +copyLinkButton = Copiar enlace +downloadTitle = Descargar archivos +downloadDescription = Este archivo se compartió a través de { -send-brand } con cifrado de extremo a extremo y un enlace que caduca automáticamente. +trySendDescription = Prueba { -send-brand } para compartir archivos de forma sencilla y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo se puede subir 1 archivo a la vez. + *[other] Solo se pueden subir { $count } archivos a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo se permite 1 archivo. + *[other] Solo se permiten { $count } archivos. + } +expiredTitle = Este enlace ha expirado. +notSupportedDescription = { -send-brand } no funciona con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox }, y funciona con la última versión de la mayoría de los navegadores. +downloadFirefox = Descargar { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Seleccionar archivos para subir +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastrar y soltar archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o hacer clic para enviar hasta { $size } +addPassword = Proteger con contraseña +emailPlaceholder = Introducir dirección de correo +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Iniciar sesión para enviar hasta { $size } +signInOnlyButton = Iniciar sesión +accountBenefitTitle = Crear una cuenta { -firefox } o iniciar sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir archivos de hasta { $size } +accountBenefitDownloadCount = Compartir archivos con más gente +accountBenefitTimeLimit = + { $count -> + [one] Mantener enlaces activos durante 1 día + *[other] Mantener enlaces activos durante { $count } días + } +accountBenefitSync = Administrar los archivos compartidos desde cualquier dispositivo +accountBenefitMoz = Saber más sobre otros servicios de { -mozilla } +signOut = Cerrar sesión +okButton = Vale +downloadingTitle = Descargando +noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador +noStreamsOptionFirefox = Probar nuestro navegador favorito +noStreamsOptionDownload = Continuar en este navegador +downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Compartir el enlace a tu archivo: +shareLinkButton = Compartir enlace +# $name is the name of the file +shareMessage = Descargar “{ $name }” con { -send-brand }: comparte archivos de forma segura y sencilla +trailheadPromo = Existe la forma de proteger tu privacidad. Únete a Firefox. +learnMore = Saber más. diff --git a/public/locales/es-MX/send.ftl b/public/locales/es-MX/send.ftl index e9fef6a6..50b6e5e3 100644 --- a/public/locales/es-MX/send.ftl +++ b/public/locales/es-MX/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Comentario -uploadPageHeader = Compartir archivos encriptados y privados -uploadPageExplainer = Enviar archivos a través de un enlace encriptado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida. -uploadPageLearnMore = Saber más -uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo -uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB -uploadPageBrowseButton = Selecciona un archivo de tu computadora -uploadPageBrowseButton1 = Seleccionar un archivo para subir -uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) +title = Send importingFile = Importando... -verifyingFile = Verificando... -encryptingFile = Encriptando... -decryptingFile = Desencriptando... -notifyUploadDone = La subida ha terminado. -uploadingPageMessage = Una vez que tu archivo haya subido podrás configurar las opciones de caducidad. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = Se canceló la subida. -uploadingPageLargeFileMessage = Este archivo es grande y puede tomar un rato para que suba. ¡Mantente tranquilo! -uploadingFileNotification = Avísame cuando la subida del archivo esté completa. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace a tu archivo expirará después de una descarga o en 24 horas. -copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: ($filename) -copyUrlFormButton = Copiar a portapapeles +encryptingFile = Encriptando… +decryptingFile = Desencriptando… +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargas + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } copiedUrl = ¡Copiado! -deleteFileButton = Eliminar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadFileName = Descargar ($filename) -downloadFileSize = ({ $size }) -unlockInputLabel = Ingresar contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Descargar archivo encriptado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = Tu descarga se ha completado downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prueba Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos. -errorAltText = Error en la subida +sendYourFilesLink = Prueba Send errorPageHeader = ¡Algo salió mal! -errorPageMessage = Ha ocurrido un error mientras subiamos tu archivo. -errorPageLink = Enviar otro archivo fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }. linkExpiredAlt = Enlace caducado -expiredPageHeader = ¡Este enlace ha caducado o nunca existió en primer lugar! notSupportedHeader = Tu navegador no está soportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox! notSupportedLink = ¿Por qué mi navegador no tiene soporte? -notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador. +notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Caduca en -deleteFileList = Eliminar -nevermindButton = Da igual -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send sigue siendo un experimento de Test Pilot y está sujeto a las Condiciones del servicio y al Aviso de privacidad de Test Pilot. Puedes saber más acerca de este experimento y si recolección de datos aquí. -legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto al Aviso de privacidad sobre sitios web y a los Términos de uso sobre sitios web. -deletePopupText = ¿Eliminar este archivo? -deletePopupYes = Sí deletePopupCancel = Cancelar deleteButtonHover = Eliminar -copyUrlHover = Copiar URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca de Test Pilot -footerLinkPrivacy = Privacidad -footerLinkTerms = Términos -footerLinkCookies = Cookies -requirePasswordCheckbox = Se necesita una contraseña para descargar este archivo -addPasswordButton = Agregar contraseña passwordTryAgain = Contraseña incorrecta. Intenta de nuevo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } +javascriptRequired = Send requiere JavaScript +whyJavascript = ¿Por qué Send requiere JavaScript? +enableJavascript = Por favor, habilita JavaScript e intenta de nuevo. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No se ha podido establecer la contraseña + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Enviar +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartir archivos fácil y privado +introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así puedes mantener en privado lo que compartes y asegurarte de que tus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira después de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir el archivo: +copyLinkButton = Copiar enlace +downloadTitle = Descargar archivos +downloadDescription = Este archivo fue compartido vía { -send-brand } con un cifrado de punto a punto y un enlace que expira automáticamente. +trySendDescription = Intenta con { -send-brand } para compartir fácil y seguro. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo 1 archivo puede ser cargado a la vez. + *[other] Solo { $count } archivos pueden ser cargados a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo 1 archivo está permitido. + *[other] Solo { $count } archivos están permitidos. + } +expiredTitle = Este enlace ha expirado. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } trabaja mejor que la última versión de { -firefox }, y trabajará con la versión actual de la mayoría de la navegadores. +downloadFirefox = Descargar { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Seleccionar archivos para subir +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastrar y soltar archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o hacer clic para enviar hasta { $size } +addPassword = Protegido con contraseña +emailPlaceholder = Ingresa tu correo electrónico +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Iniciar sesión para enviar hasta { $size } +signInOnlyButton = Iniciar sesión +accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir archivos de hasta { $size } +accountBenefitDownloadCount = Compartir archivos con más personas +accountBenefitTimeLimit = + { $count -> + [one] Mantener enlaces activos por 1 día + *[other] Mantener enlaces activos hasta { $count } días + } +accountBenefitSync = Administrar archivos compartidos desde cualquier dispositivo +accountBenefitMoz = Saber más sobre otros servicios de { -mozilla } +signOut = Cerrar sesión +okButton = Aceptar +downloadingTitle = Descargando +noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador +noStreamsOptionFirefox = Prueba nuestro navegador favorito +noStreamsOptionDownload = Continuar con este navegador +downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Comparte el enlace a tu archivo: +shareLinkButton = Enlace para compartir +# $name is the name of the file +shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro +trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox. +learnMore = Saber más. diff --git a/public/locales/et/send.ftl b/public/locales/et/send.ftl index 836dd877..636012e0 100644 --- a/public/locales/et/send.ftl +++ b/public/locales/et/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = veebieksperiment -siteFeedback = Tagasiside -uploadPageHeader = Privaatne ja krüpteeritud failiedastus -uploadPageExplainer = Firefox Send võimaldab saata faile üle ohutu, privaatse ja krüpteeritud kanali. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks. -uploadPageLearnMore = Rohkem teavet -uploadPageDropMessage = Faili üleslaadimiseks lohista see siia -uploadPageSizeMessage = Parima kogemuse saamiseks tasub faili suurus hoida alla 1GB -uploadPageBrowseButton = Vali fail arvutist -uploadPageBrowseButton1 = Vali fail üleslaadimiseks -uploadPageMultipleFilesAlert = Mitme faili või kausta üleslaadimine pole praegu toetatud. -uploadPageBrowseButtonTitle = Laadi fail üles -uploadingPageProgress = Faili { $filename } ({ $size }) üleslaadimine +title = Send importingFile = Importimine... -verifyingFile = Kontrollimine… encryptingFile = Krüptimine… decryptingFile = Dekrüptimine... -notifyUploadDone = Üleslaadimine on lõpetatud. -uploadingPageMessage = Aegumise sätteid saab muuta siis, kui faili üles laaditakse. -uploadingPageCancel = Katkesta üleslaadimine -uploadCancelNotification = Üleslaadimine katkestati -uploadingPageLargeFileMessage = Fail on suur ja selle üleslaadimine võib aega võtta. -uploadingFileNotification = Teavita mind üleslaadimise lõppemisest. -uploadSuccessConfirmHeader = Saatmiseks valmis -uploadSvgAlt = Laadi üles -uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel. -copyUrlFormLabelWithName = Kopeeri ja jaga linki faili allalaadimiseks: { $filename } -copyUrlFormButton = Kopeeri vahemällu +downloadCount = + { $num -> + [one] üht allalaadimist + *[other] { $num } allalaadimist + } +timespanHours = + { $num -> + [one] 1 tunni + *[other] { $num } tunni + } copiedUrl = Kopeeritud! -deleteFileButton = Kustuta fail -sendAnotherFileLink = Saada järgmine fail -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Laadi alla -downloadFileName = Laadi fail { $filename } alla -downloadFileSize = ({ $size }) -unlockInputLabel = Sisesta parool unlockInputPlaceholder = Parool unlockButtonLabel = Ava -downloadFileTitle = Krüptitud faili allalaadimine -// Firefox Send is a brand name and should not be localized. -downloadMessage = Sulle on saadetud fail Firefox Sendiga - teenusega, mis lubab faile ohutult, privaatselt ja krüpteeritult jagada. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Laadi alla -downloadNotification = Allalaadimine on lõpetatud. downloadFinish = Allalaadimine lõpetati -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize }/{ $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Proovi Firefox Sendi -downloadingPageProgress = Faili { $filename } ({ $size }) allalaadimine -downloadingPageMessage = Palun jäta see kaart lahti, kuni fail on alla laaditud ja dekrüptitud. -errorAltText = Viga üleslaadimisel +sendYourFilesLink = Proovi Send'i errorPageHeader = Midagi läks valesti! -errorPageMessage = Faili üleslaadimisel esines viga. -errorPageLink = Saada järgmine fail fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }. linkExpiredAlt = Link on aegunud -expiredPageHeader = See link on aegunud või seda pole kunagi olnudki! notSupportedHeader = Sinu brauser pole toetatud. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Kahjuks ei toeta see brauser veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead proovima teise brauseriga. Me soovitame Firefoxi! notSupportedLink = Miks mu brauser toetatud pole? -notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama. +notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama. updateFirefox = Uuenda Firefox -downloadFirefoxButtonSub = Laadi alla tasuta -uploadedFile = Fail -copyFileList = Kopeeri URL -// expiryFileList is used as a column header -expiryFileList = Aegub -deleteFileList = Kustuta -nevermindButton = Ära pane tähele -legalHeader = Tingimused ja privaatsusreeglid -legalNoticeTestPilot = Firefox Send on praegu Test Piloti eksperiment ja sellele rakenduvad Test Piloti teenusetingimused ning privaatsusreeglid. Rohkem teavet selle eksperimendi ja kogutavate andmete kohta leiab siit. -legalNoticeMozilla = Firefox Sendi veebilehe kasutamisele rakenduvad ka Mozilla veebilehtede privaatsusreeglid ja veebilehtede teenusetingimused. -deletePopupText = Kas kustutada see fail? -deletePopupYes = Jah deletePopupCancel = Loobu deleteButtonHover = Kustuta -copyUrlHover = Kopeeri URL -footerLinkLegal = Õiguslik teave -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilotist -footerLinkPrivacy = Privaatsusest -footerLinkTerms = Teenusetingimused -footerLinkCookies = Küpsistest -requirePasswordCheckbox = Selle faili allalaadimiseks nõutakse parooli -addPasswordButton = Lisa parool passwordTryAgain = Vale parool. Palun proovi uuesti. -// This label is followed by the password needed to download a file -passwordResult = Parool: { $password } +javascriptRequired = Send'i kasutamiseks tuleb JavaScript lubada +whyJavascript = Miks Send JavaScripti vajab? +enableJavascript = Palun luba JavaScript ja proovi uuesti. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }t { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimaalne parooli pikkus: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Parooli muutmine ebaõnnestus + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Lihtne ja privaatne failijagamine +introDescription = { -send-brand } võimaldab sul faile jagada otspunktkrüpteerimise ning automaatselt aeguva lingiga. Nii saad jagatava privaatsena hoida ja kindlustada, et su asjad igavesti internetti vedelema ei jää. +notifyUploadEncryptDone = Sinu fail on krüptitud ja saatmiseks valmis +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Aegub peale { $downloadCount } või { $timespan } järel +timespanMinutes = + { $num -> + [one] 1 minuti + *[other] { $num } minuti + } +timespanDays = + { $num -> + [one] 1 päeva + *[other] { $num } päeva + } +timespanWeeks = + { $num -> + [one] 1 nädala + *[other] { $num } nädala + } +fileCount = + { $num -> + [one] 1 fail + *[other] { $num } faili + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Kogusuurus: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Faili jagamiseks kopeeri link: +copyLinkButton = Kopeeri link +downloadTitle = Failide allalaadimine +downloadDescription = See fail jagati teenuse { -send-brand } kaudu otspunktkrüpteeritult ja automaatselt aeguva lingiga. +trySendDescription = Proovi lihtsaks ja turvaliseks failijagamiseks { -send-brand } teenust. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Korraga saab üles laadida vaid 1 faili. + *[other] Korraga saab üles laadida vaid { $count } faili. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Vaid 1 arhiveerimine on lubatud. + *[other] Vaid { $count } arhiveerimist on lubatud. + } +expiredTitle = Link on aegunud. +notSupportedDescription = { -send-brand } ei tööta selle veebilehitsejaga. Kõige paremini töötab { -send-short-brand } uusima { -firefox }iga ja töötab ka enamikes teistes uuendatud brauserites. +downloadFirefox = Laadi { -firefox } alla +legalTitle = { -send-short-brand } privaatsusteade +legalDateStamp = Versioon 1.0, alates 12. märts 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }p { $hours }t { $minutes }m +addFilesButton = Vali failid üleslaadimiseks +uploadButton = Laadi üles +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Lohista failid siia +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = või klõpsa kuni { $size } suuruste failide saatmiseks +addPassword = Kaitse parooliga +emailPlaceholder = Sisesta e-posti aadress +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logi sisse ning saad saata kuni { $size } suuruseid faile +signInOnlyButton = Logi sisse +accountBenefitTitle = Loo { -firefox }i konto või logi sisse +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Jaga kuni { $size } suuruseid faile +accountBenefitDownloadCount = Jaga faile enamate inimestega +accountBenefitTimeLimit = + { $count -> + [one] Hoia linke aktiivsena 1 päev + *[other] Hoia linke aktiivsena kuni { $count } päeva + } +accountBenefitSync = Jagatud faile saad hallata mis tahes seadmes +accountBenefitMoz = Rohkem teavet teistest { -mozilla } teenustest +signOut = Logi välja +okButton = Olgu +downloadingTitle = Allalaadimine +noStreamsWarning = Sinu veebilehitseja ei pruugi suuta nii suurt faili dekrüptida. +noStreamsOptionCopy = Kopeeri link teises brauseris avamiseks +noStreamsOptionFirefox = Proovi meie lemmikbrauserit +noStreamsOptionDownload = Jätka selle brauseriga +downloadFirefoxPromo = { -send-short-brand } toob sinuni uhiuus { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Jaga linki failile: +shareLinkButton = Jaga linki +# $name is the name of the file +shareMessage = Laadi “{ $name }” alla teenusega { -send-brand }, mis pakub lihtsat ja turvalist failijagamist +trailheadPromo = Oma privaatsust on võimalik kaitsta. Liitu Firefoxiga. +learnMore = Rohkem teavet. diff --git a/public/locales/eu/send.ftl b/public/locales/eu/send.ftl new file mode 100644 index 00000000..cd7dd3df --- /dev/null +++ b/public/locales/eu/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Inportatzen… +encryptingFile = Zifratzen... +decryptingFile = Deszifratzen... +downloadCount = + { $num -> + [one] Deskarga bat + *[other] { $num } deskarga + } +timespanHours = + { $num -> + [one] Ordubete + *[other] { $num } ordu + } +copiedUrl = Kopiatuta! +unlockInputPlaceholder = Pasahitza +unlockButtonLabel = Desblokeatu +downloadButtonLabel = Deskargatu +downloadFinish = Deskarga burututa +fileSizeProgress = ({ $totalSize } / { $partialSize }) +sendYourFilesLink = Probatu Send +errorPageHeader = Zerbait gaizki joan da! +fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du. +linkExpiredAlt = Lotura iraungi da +notSupportedHeader = Zure nabigatzailea ez da onartzen. +notSupportedLink = Zergatik ez da nire nabigatzailea onartzen? +notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu. +updateFirefox = Eguneratu Firefox +deletePopupCancel = Utzi +deleteButtonHover = Ezabatu +passwordTryAgain = Pasahitz okerra. Saiatu berriro. +javascriptRequired = JavaScript beharrezkoa da Send erabiltzeko. +whyJavascript = Zergatik behar du Send-ek JavasScript? +enableJavascript = Gaitu JavaScript eta saiatu berriro. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Pasahitzaren gehienezko luzera: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Pasahitz hau ezin da ezarri + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partekatu fitxategiak modu sinple eta pribatuan +introDescription = { -send-brand } tresna fitxategiak partekatzeko da, muturretik muturrera zifratuta eta automatikoki iraungitzen diren loturekin. Hortaz, partekatzen duzuna pribatua izango da eta ziur egon zaitezke zure fitxategiak ez direla online egongo betirako. +notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } edo { $timespan } ondoren iraungiko da +timespanMinutes = + { $num -> + [one] minutu 1 + *[other] { $num } minutu + } +timespanDays = + { $num -> + [one] egun 1 + *[other] { $num } egun + } +timespanWeeks = + { $num -> + [one] aste 1 + *[other] { $num } aste + } +fileCount = + { $num -> + [one] fitxategi 1 + *[other] { $num } fitxategi + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaina guztira: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiatu fitxategia partekatzeko lotura: +copyLinkButton = Kopiatu lotura +downloadTitle = Deskargatu fitxategiak +downloadDescription = { -send-brand } bidez partekatu da fitxategia muturretik muturrera zifratuta eta automatikoki iraungitzen den lotura batekin. +trySendDescription = Probatu { -send-brand } fitxategiak partekatzeko modu sinple eta segururako. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Soilik fitxategi bakarra igo daiteke aldi berean. + *[other] Soilik { $count } fitxategi igo daitezke aldi berean. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Soilik artxibo bakarra onartzen da. + *[other] Soilik { $count } artxibo onartzen dira. + } +expiredTitle = Lotura hau iraungi da. +notSupportedDescription = { -send-brand } ez da nabigatzaile honetan ibiliko. { -send-short-brand } hobeto dabil { -firefox }(r)en azken bertsioarekin; halaber, nabigatzaile gehienen azken bertsioarekin ibiliko da. +downloadFirefox = Deskargatu { -firefox } +legalTitle = { -send-short-brand } pribatutasun-oharra +legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }e { $hours }h { $minutes }m +addFilesButton = Hautatu igotzeko fitxategiak +uploadButton = Igo +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastatu eta jaregin fitxategiak +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = edo egin klik { $size } arte igotzeko +addPassword = Babestu pasahitzarekin +emailPlaceholder = Idatzi zure helbide elektronikoa +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Hasi saioa { $size } arte bidaltzeko +signInOnlyButton = Hasi saioa +accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak +accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin +accountBenefitTimeLimit = + { $count -> + [one] Utzi loturak erabilgarri egun batez + *[other] Utzi loturak erabilgarri { $count } egunez + } +accountBenefitSync = Kudeatu partekatutako fitxategiak edozein gailutatik +accountBenefitMoz = { -mozilla }ren beste zerbitzuei buruzko argibide gehiago +signOut = Amaitu saioa +okButton = Ados +downloadingTitle = Deskargatzen +noStreamsWarning = Baliteke nabigatzailea gai ez izatea horrelako tamaina handiko fitxategiak deszifratzeko. +noStreamsOptionCopy = Kopiatu lotura beste nabigatzaile batean irekitzeko +noStreamsOptionFirefox = Probatu gure nabigatzaile gogokoena +noStreamsOptionDownload = Jarraitu nabigatzaile honekin +downloadFirefoxPromo = Erabat berritutako { -firefox }(e)k eskaintzen dizu { -send-short-brand } +# the next line after the colon contains a file name +shareLinkDescription = Partekatu zure fitxategirako lotura: +shareLinkButton = Partekatu lotura +# $name is the name of the file +shareMessage = Deskargatu "{ $name }" { -send-brand } erabiliz: fitxategi-partekatze sinple eta segurua +trailheadPromo = Badago zure pribatutasuna babesteko modua. Egizu bat Firefoxekin. +learnMore = Argibide gehiago. diff --git a/public/locales/fa/send.ftl b/public/locales/fa/send.ftl index b6017935..0f597bf2 100644 --- a/public/locales/fa/send.ftl +++ b/public/locales/fa/send.ftl @@ -1,89 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = آزمایش وب -siteFeedback = بازخورد -uploadPageHeader = اشتراک‌گذاری پرونده‌ها، رمزنگاری شده و خصوصی -uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند. -uploadPageLearnMore = بیشتر بدانید -uploadPageDropMessage = برای شروع بارگذاری پرونده‌های خود را اینجا بیاندازید -uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پرونده‌تان کمتر از ۱ گیگابایت باشد -uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید -uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید -uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمی‌شود. -uploadPageBrowseButtonTitle = بارگذاری پرونده -uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size }) +title = Send importingFile = در حال وارد کردن… -verifyingFile = در حال تایید… encryptingFile = در حال رمزنگاری… decryptingFile = در حال رمزگشایی… -notifyUploadDone = بارگذاری شما پایان یافت. -uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید. -uploadingPageCancel = لغو بارگذاری -uploadCancelNotification = بارگذاری شما لغو شد -uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید! -uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده. -uploadSuccessConfirmHeader = آماده برای ارسال -uploadSvgAlt = بارگذاری -uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد. -copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename } -copyUrlFormButton = رونوشت به کلیپ‌بورد +downloadCount = + { $num -> + [one] ۱ بارگیری + *[other] { $num } بارگیری + } +timespanHours = + { $num -> + [one] ۱ ساعت + *[other] { $num } ساعت + } copiedUrl = رونوشت شد! -deleteFileButton = حذف پرونده -sendAnotherFileLink = ارسال پرونده دیگر -// Alternative text used on the download link/button (indicates an action). -downloadAltText = دریافت -downloadFileName = بارگیری { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = گذرواژه را وارد کنید unlockInputPlaceholder = گذرواژه unlockButtonLabel = باز کردن -downloadFileTitle = دریافت پروندهٔ رمزنگاری شده -// Firefox Send is a brand name and should not be localized. -downloadMessage = دوست شما درحال ارسال پرونده ای به وسیله Firefox Send است،‌ این سرویس این امکان را به شما می‌دهد تا پرونده‌های خود را به صورت ایمن،‌خصوصی و رمزنگاری شده به همراه پیوند انقضا خودکار همرسانی کنید تا اطمینان حاصل کنید چیزهای شما برای همیشه آنلاین باقی نخواهد ماند. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = بارگیری -downloadNotification = بارگیری شما کامل شد. downloadFinish = بارگیری کامل شد -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } از { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send را امتحان کنید -downloadingPageProgress = دریافت { $filename } ({ $size }) -downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت می‌کنیم و کدگذاری می‌کنیم. -errorAltText = خطا در بارگذاری -errorPageHeader = چیزی دچار اشکال شده است! -errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است. -errorPageLink = پرونده دیگری ارسال کنید. +sendYourFilesLink = Send را امتحان کنید +errorPageHeader = خطایی رخ داد! fileTooBig = این پرونده بسیار حجیم است. حجم آن می‌بایستی کم تر { $size } باشد. linkExpiredAlt = پیوند منقضی شده است -expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است! -notSupportedHeader = مرورگر شما پشتیبانی نمی‌کند. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است ! -notSupportedLink = چرا مرورگر من پشتیبانی نمی‌کند؟ -notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما نیاز دارید تا مرورگر خود را بروز کنید. +notSupportedHeader = مرورگر شما پشتیبانی نمی‌شود. +notSupportedLink = چرا از مرورگر من پشتیبانی نمی‌شود؟ +notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما نیاز دارید تا مرورگر خود را بروز کنید. updateFirefox = بروزرسانی فایرفاکس -downloadFirefoxButtonSub = دریافت رایگان -uploadedFile = پرونده‌ -copyFileList = رونوشت از نشانی -// expiryFileList is used as a column header -expiryFileList = زمان انقضا -deleteFileList = حذف -nevermindButton = بیخیال -legalHeader = شرایط و حریم‌خصوصی -legalNoticeTestPilot = Firefox Send در حال حاضر در نسخه آزمایشی خود به صورت می‌دهد و تحت عنوان خلبان آموزشی شرایط و خدمات و موارد حریم خصوصی کار می‌کند. شما می‌توانید اطلاعات بیشتر در مورد این آزمایش و اطلاعات که ذخیره می‌کنید را از اینجا کسب کنید. -legalNoticeMozilla = استفاده از Firefox Send همچنین منصوب به موزیلا است. پایگاه اینترنتی نکات حریم شخصی و پایگاه اطلاع رسانی شرایط خدمات و استفاده . -deletePopupText = حذف این پرونده؟ -deletePopupYes = بله deletePopupCancel = انصراف deleteButtonHover = حذف -copyUrlHover = رونوشت از نشانی -footerLinkLegal = ملاحظات حقوقی -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = درباره Test Pilot -footerLinkPrivacy = حریم‌خصوصی -footerLinkTerms = شرایط -footerLinkCookies = کوکی‌ها -requirePasswordCheckbox = دریافت این پرونده نیاز به گذرواژه دارد -addPasswordButton = افزودن گذرواژه passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید. +javascriptRequired = Send نیازمند جاوااسکریپت است +whyJavascript = چرا Send جاوااسکریپت لازم داد؟ +enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } دقیقه +# A short status message shown when the user enters a long password +maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = امکان ثبت این گذواژه نیست + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = ارسال +-firefox = فایرفاکس +-mozilla = موزیلا +introTitle = اشتراک‌گذاری ساده و خصوصیِ پرونده‌ها +introDescription = { -send-brand } به شما امکان اشتراک‌گذاری فایل‌ها با رمزگذاری سرتاسری و لینکی که به طور خودکار منقضی می شود را می‌دهد. در نتیجه می‌توانید اشتراک گذاری‌های خود را خصوصی نگه دارید و اطمینان حاصل کنید که فایل‌های شما تا همیشه آنلاین دردسترس نخواهند ماند. +notifyUploadEncryptDone = پرونده شما رمزگذاری شده و آماده ارسال است +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = پس از { $downloadCount } یا { $timespan } منقضی می‌شود +timespanMinutes = + { $num -> + [one] 1 دقیقه + *[other] { $num } دقیقه + } +timespanDays = + { $num -> + [one] 1 روز + *[other] { $num } روز + } +timespanWeeks = + { $num -> + [one] 1 هفته + *[other] { $num } هفته + } +fileCount = + { $num -> + [one] 1 پرونده + *[other] { $num } پرونده + } +# byte abbreviation +bytes = بایت +# kibibyte abbreviation +kb = کیلوبایت +# mebibyte abbreviation +mb = مگابایت +# gibibyte abbreviation +gb = گیگابایت +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = حجم کل: { $size } +# the next line after the colon contains a file name +copyLinkDescription = برای به اشتراک گذاشتن فایل خود، لینک را کپی کنید: +copyLinkButton = رونوشت از پیوند +downloadTitle = دریافت پرونده‌ها +downloadDescription = این پرونده از طریق { -send-brand } با رمزگذاری سرتاسری و پیوندی که به طور خودکار منقضی می شود، به اشتراک گذاشته شد. +trySendDescription = { -send-brand } را برای اشتراک گذاری ساده و ایمن پرونده امتحان کنید. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] تنها 1 پرونده می‌تواند در لحظه بارگزاری شود. + *[other] تنها { $count } پرونده می‌تواند در لحظه بارگزاری شود. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] تنها 1 بایگانی مجاز است. + *[other] تنها { $count } بایگانی مجاز است. + } +expiredTitle = این پیوند منقضی شده است. +notSupportedDescription = { -send-brand } با این مرورگر کار نخواهد کرد. { -send-short-brand } بهترین عملکرد را با آخرین نسخه { -firefox } خواهد داشت، و با آخرین نسخه اکثر مرورگر‌های کنونی کار می‌کند. +downloadFirefox = دریافت { -firefox } +legalTitle = { -send-short-brand } نکات حفظ حریم خصوصی +legalDateStamp = نسخه ۱.۰، مورخ ۱۲، ۲۰۱۹ +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } روز { $hours } ساعت { $minutes } دقیقه +addFilesButton = پرونده‌ها را برای بارگذاری انتخاب کنید +uploadButton = بارگذاری +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = فایل‌ها را بکشید و اینجا رها کنید +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = یا برای ارسال تا { $size } کلیک کنید +addPassword = با گذرواژه محافظت کنید +emailPlaceholder = ایمیل خود را وارد کنید +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = برای ارسال تا { $size } وارد شوید +signInOnlyButton = ورود +accountBenefitTitle = یک حساب { -firefox } ایجاد کنید یا وارد شوید +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = پرونده‌هایی تا { $size } را اشتراک‌گذاری کنید +accountBenefitDownloadCount = پرونده‌ها را با افراد بیشتری به اشتراک بگذارید +accountBenefitTimeLimit = + { $count -> + [one] پیوند‌ها را تا 1 روز فعال نگه دارید + *[other] پیوند‌ها را تا { $count } روز فعال نگه دارید + } +accountBenefitSync = فایل‌های اشتراکی را از هر دستگاه مدیریت کنید +accountBenefitMoz = در مورد سایر خدمات { -mozilla } اطلاعات کسب کنید +signOut = خروج +okButton = تأیید +downloadingTitle = در حال بارگیری +noStreamsWarning = ممکن است این مرورگر نتواند یک پرونده به این بزرگی را رمزگشایی کند. +noStreamsOptionCopy = لینک را کپی کنید تا در مرورگر دیگری باز شود +noStreamsOptionFirefox = مرورگر مورد علاقه ما را امتحان کنید +noStreamsOptionDownload = با این مرورگر ادامه دهید +downloadFirefoxPromo = { -send-short-brand } با جدیدترین { -firefox } برای شما آماده شده است. +# the next line after the colon contains a file name +shareLinkDescription = پیوند مربوط به پرونده خود را به اشتراک بگذارید: +shareLinkButton = اشتراک‌گذاری پیوند +# $name is the name of the file +shareMessage = “{ $name }” را با { -send-brand } دانلود کنید: اشتراک‌گذاری ساده و امن فایل +trailheadPromo = راهی برای محافظت از حریم خصوصی شما وجود دارد. به Firefox بپیوندید. +learnMore = بیشتر بدانید. diff --git a/public/locales/fi/send.ftl b/public/locales/fi/send.ftl new file mode 100644 index 00000000..0f253352 --- /dev/null +++ b/public/locales/fi/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Tuodaan… +encryptingFile = Salataan... +decryptingFile = Puretaan salausta... +downloadCount = + { $num -> + [one] yhden latauksen + *[other] { $num } latauksen + } +timespanHours = + { $num -> + [one] 1 tunnin + *[other] { $num } tunnin + } +copiedUrl = Kopioitu! +unlockInputPlaceholder = Salasana +unlockButtonLabel = Avaa +downloadButtonLabel = Lataa +downloadFinish = Lataus valmis +fileSizeProgress = { $partialSize } / { $totalSize } +sendYourFilesLink = Kokeile Send -palvelua +errorPageHeader = Jokin meni pieleen! +fileTooBig = Tämä tiedosto on liian suuri ladattavaksi. Sen pitäisi olla pienempi kuin { $size }. +linkExpiredAlt = Linkki on vanhentunut +notSupportedHeader = Selaintasi ei tueta. +notSupportedLink = Miksi selaintani ei tueta? +notSupportedOutdatedDetail = Valitettavasti tämä Firefoxin versio ei tue Sendiä käyttävää web-tekniikkaa. Sinun on päivitettävä selaimesi. +updateFirefox = Päivitä Firefox +deletePopupCancel = Peruuta +deleteButtonHover = Poista +passwordTryAgain = Väärä salasana. Yritä uudelleen. +javascriptRequired = Firefox-Send vaatii JavaScriptin +whyJavascript = Miksi Send vaatii JavaScriptin? +enableJavascript = Ota JavaScript käyttöön ja yritä uudelleen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } t { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Salasanan enimmäispituus: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Tätä salasanaa ei voitu asettaa + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Helppoa ja yksityistä tiedostonjakoa +introDescription = { -send-brand } mahdollistaa tiedostojen jakamisen automaattisesti vanhenevalla linkillä. Tiedostojen jakaminen tapahtuu päästä päähän -salattuna. Näin jakamasi tiedostot pysyvät yksityisinä ja voit olla varma, etteivät lähettämäsi tiedostot pysy verkossa ikuisesti. +notifyUploadEncryptDone = Tiedosto on salattu ja valmis lähetettäväksi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Vanhenee { $downloadCount } tai { $timespan } jälkeen +timespanMinutes = + { $num -> + [one] 1 minuutin + *[other] { $num } minuutin + } +timespanDays = + { $num -> + [one] 1 päivän + *[other] { $num } päivän + } +timespanWeeks = + { $num -> + [one] 1 viikon + *[other] { $num } viikon + } +fileCount = + { $num -> + [one] 1 tiedosto + *[other] { $num } tiedostoa + } +# byte abbreviation +bytes = t +# kibibyte abbreviation +kb = kt +# mebibyte abbreviation +mb = Mt +# gibibyte abbreviation +gb = Gt +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Koko yhteensä: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopioi linkki jakaaksesi tiedoston: +copyLinkButton = Kopioi linkki +downloadTitle = Lataa tiedostot +downloadDescription = Tämä tiedosto jaettiin { -send-brand } -palvelun kautta päästä päähän -salattuna ja automaattisesti vanhenevalla linkillä. +trySendDescription = Kokeile { -send-brand } -palvelua jakaaksesi tiedostoja helposti ja turvallisesti. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Vain 1 tiedosto on mahdollistaa lähettää kerralla. + *[other] Vain { $count } tiedostoa on mahdollista lähettää kerralla. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Vain 1 arkisto on sallittu. + *[other] Vain { $count } arkistoa on sallittu. + } +expiredTitle = Tämä linkki on vanhentunut. +notSupportedDescription = { -send-brand } ei toimi tällä selaimella. { -send-short-brand } toimii parhaiten { -firefox }in uusimmalla versiolla, ja toimii useimpien selainten uusimmilla versioilla. +downloadFirefox = Lataa { -firefox } +legalTitle = { -send-short-brand }-yksityisyyskäytäntö +legalDateStamp = Versio 1.0, päivätty 13. maaliskuuta 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } pv { $hours } t { $minutes } min +addFilesButton = Valitse lähetettävät tiedostot +uploadButton = Lähetä +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Vedä ja pudota tiedostot +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = tai napsauta lähettääksesi tiedostoja, joiden koko voi olla enintään { $size } +addPassword = Suojaa salasanalla +emailPlaceholder = Kirjoita sähköpostiosoitteesi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kirjautumalla voit lähettää jopa { $size } kokoisia tiedostoja +signInOnlyButton = Kirjaudu sisään +accountBenefitTitle = Luo { -firefox }-tili tai kirjaudu sisään +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Jaa jopa { $size } kokoisia tiedostoja +accountBenefitDownloadCount = Jaa tiedostoja useamman ihmisen kesken +accountBenefitTimeLimit = + { $count -> + [one] Säilytä linkit aktiivisina 1 päivän ajan + *[other] Säilytä linkit aktiivisina { $count } päivän ajan + } +accountBenefitSync = Hallitse jaettuja tiedostoja miltä tahansa laitteelta +accountBenefitMoz = Lue lisää muista { -mozilla }-palveluista +signOut = Kirjaudu ulos +okButton = OK +downloadingTitle = Ladataan +noStreamsWarning = Tämä selain ei välttämättä osaa purkaa salausta näin suurikokoisista tiedostoista. +noStreamsOptionCopy = Kopioi linkki avataksesi sen toisessa selaimessa +noStreamsOptionFirefox = Kokeile suosikkiselaintamme +noStreamsOptionDownload = Jatka tällä selaimella +downloadFirefoxPromo = { -send-short-brand } on olemassa kiitos uuden { -firefox }in. +# the next line after the colon contains a file name +shareLinkDescription = Jaa linkki tiedostoosi: +shareLinkButton = Jaa linkki +# $name is the name of the file +shareMessage = Lataa tiedosto ”{ $name }” { -send-brand } -palvelusta: yksinkertaista ja turvallista tiedostonjakoa +trailheadPromo = On tapa suojata yksityisyyttään. Liity Firefoxiin. +learnMore = Lue lisää. diff --git a/public/locales/fr/send.ftl b/public/locales/fr/send.ftl index 4589bfcd..a807a184 100644 --- a/public/locales/fr/send.ftl +++ b/public/locales/fr/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = expérience web -siteFeedback = Votre avis -uploadPageHeader = Partage de fichiers de façon confidentielle et chiffrée -uploadPageExplainer = Envoyez des fichiers de façon sécurisée, confidentielle et chiffrée, via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment. -uploadPageLearnMore = En savoir plus -uploadPageDropMessage = Déposez votre fichier ici pour l’envoyer -uploadPageSizeMessage = Pour un résultat fiable, il est conseillé d’utiliser des fichiers de taille inférieure à 1 Go -uploadPageBrowseButton = Sélectionner un fichier sur l’ordinateur -uploadPageBrowseButton1 = Choisir un fichier à envoyer -uploadPageMultipleFilesAlert = L’envoi de plusieurs fichiers ou de dossiers n’est pas pris en charge pour le moment. -uploadPageBrowseButtonTitle = Envoyer le fichier -uploadingPageProgress = Envoi en cours de { $filename } ({ $size }) +title = Send importingFile = Importation… -verifyingFile = Vérification… encryptingFile = Chiffrement… decryptingFile = Déchiffrement… -notifyUploadDone = L’envoi est terminé. -uploadingPageMessage = Une fois l’envoi terminé, vous serez en mesure de régler les options d’expiration. -uploadingPageCancel = Annuler l’envoi -uploadCancelNotification = L’envoi a été annulé. -uploadingPageLargeFileMessage = Ce fichier est volumineux et son envoi peut prendre un peu de temps. -uploadingFileNotification = M’envoyer une notification lorsque l’envoi est terminé. -uploadSuccessConfirmHeader = Paré à l’envoi -uploadSvgAlt = Envoyer -uploadSuccessTimingHeader = Le lien vers votre fichier expirera après le premier téléchargement ou au bout de 24 heures. -copyUrlFormLabelWithName = Copiez et partagez le lien pour envoyer votre fichier : { $filename } -copyUrlFormButton = Copier dans le presse-papiers +downloadCount = + { $num -> + [one] 1 téléchargement + *[other] { $num } téléchargements + } +timespanHours = + { $num -> + [one] 1 heure + *[other] { $num } heures + } copiedUrl = Lien copié ! -deleteFileButton = Supprimer le fichier -sendAnotherFileLink = Envoyer un autre fichier -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Télécharger -downloadFileName = Télécharger { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Saisissez un mot de passe unlockInputPlaceholder = Mot de passe unlockButtonLabel = Déverrouiller -downloadFileTitle = Télécharger le fichier chiffré -// Firefox Send is a brand name and should not be localized. -downloadMessage = Votre ami⋅e vous a envoyé un fichier avec Firefox Send, un service qui permet d’envoyer des fichiers de façon sécurisée, confidentielle et chiffrée via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Télécharger -downloadNotification = Le téléchargement est terminé. downloadFinish = Téléchargement terminé -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } sur { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Essayer Firefox Send -downloadingPageProgress = Téléchargement en cours de { $filename } ({ $size }) -downloadingPageMessage = Merci de laisser cet onglet ouvert pendant que nous récupérons le fichier et que nous le déchiffrons. -errorAltText = Erreur lors de l’envoi +sendYourFilesLink = Essayer Send errorPageHeader = Une erreur s’est produite. -errorPageMessage = Une erreur s’est produite lors de l’envoi du fichier. -errorPageLink = Envoyer un autre fichier fileTooBig = Ce fichier est trop volumineux pour être envoyé. Sa taille doit être inférieure à { $size }. linkExpiredAlt = Le lien a expiré -expiredPageHeader = Ce lien a expiré ou n’a jamais existé. notSupportedHeader = Votre navigateur n’est pas pris en charge. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Malheureusement, ce navigateur ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devrez utiliser un autre navigateur. Nous vous recommandons Firefox ! notSupportedLink = Pourquoi mon navigateur n’est-il pas pris en charge ? -notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devez mettre à jour votre navigateur. +notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Send. Vous devez mettre à jour votre navigateur. updateFirefox = Mettre à jour Firefox -downloadFirefoxButtonSub = Téléchargement gratuit -uploadedFile = Fichier -copyFileList = Copier le lien -// expiryFileList is used as a column header -expiryFileList = Expire dans -deleteFileList = Supprimer -nevermindButton = Non merci -legalHeader = Confidentialité et conditions d’utilisation -legalNoticeTestPilot = Firefox Send est actuellement une expérience Test Pilot, et en tant que tel est soumis aux conditions d’utilisation et à la politique de confidentialité de Test Pilot. Vous pouvez en apprendre plus sur cette expérience et sur la collecte de données ici. -legalNoticeMozilla = L’utilisation du site web Firefox Send est aussi soumise à l’avis de confidentialité relatif aux sites Web ainsi qu’aux conditions d’utilisation des sites Web de Mozilla. -deletePopupText = Supprimer ce fichier ? -deletePopupYes = Oui deletePopupCancel = Annuler deleteButtonHover = Supprimer -copyUrlHover = Copier le lien -footerLinkLegal = Mentions légales -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = À propos de Test Pilot -footerLinkPrivacy = Confidentialité -footerLinkTerms = Conditions d’utilisation -footerLinkCookies = Cookies -requirePasswordCheckbox = Exiger un mot de passe pour télécharger ce fichier -addPasswordButton = Ajouter un mot de passe passwordTryAgain = Mot de passe incorrect. Veuillez réessayer. -// This label is followed by the password needed to download a file -passwordResult = Mot de passe : { $password } +javascriptRequired = Send nécessite JavaScript +whyJavascript = Pourquoi Send nécessite-t-il JavaScript ? +enableJavascript = Veuillez activer JavaScript puis réessayer. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Longueur maximale du mot de passe : { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ce mot de passe n’a pas pu être défini + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partage de fichiers simple et privé +introDescription = { -send-brand } vous permet de partager des fichiers chiffrés de bout en bout ainsi qu’un lien qui expire automatiquement. Ainsi, vous pouvez garder ce que vous partagez en privé et vous assurer que vos contenus ne restent pas en ligne pour toujours. +notifyUploadEncryptDone = Votre fichier est chiffré et prêt à l’envoi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expire après { $downloadCount } ou { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = + { $num -> + [one] 1 jour + *[other] { $num } jours + } +timespanWeeks = + { $num -> + [one] 1 semaine + *[other] { $num } semaines + } +fileCount = + { $num -> + [one] 1 fichier + *[other] { $num } fichiers + } +# byte abbreviation +bytes = o +# kibibyte abbreviation +kb = Ko +# mebibyte abbreviation +mb = Mo +# gibibyte abbreviation +gb = Go +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Taille totale : { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiez le lien pour partager votre fichier : +copyLinkButton = Copier le lien +downloadTitle = Télécharger les fichiers +downloadDescription = Ce fichier a été partagé via { -send-brand } avec un chiffrement de bout en bout et un lien qui expire automatiquement. +trySendDescription = Essayez { -send-brand } pour un partage de fichiers simple et sécurisé. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Un seul fichier peut être envoyé à la fois. + *[other] Seuls { $count } fichiers peuvent être envoyés à la fois. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Une seule archive est autorisée. + *[other] Seules { $count } archives sont autorisées. + } +expiredTitle = Ce lien a expiré. +notSupportedDescription = { -send-brand } ne fonctionnera pas avec ce navigateur. { -send-short-brand } fonctionne mieux avec la dernière version de { -firefox } et fonctionnera avec la dernière version de la plupart des navigateurs. +downloadFirefox = Télécharger { -firefox } +legalTitle = Politique de confidentialité de { -send-short-brand } +legalDateStamp = Version 1.0 du 12 mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } j { $hours } h { $minutes } min +addFilesButton = Sélectionnez des fichiers à envoyer +uploadButton = Envoyer +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Glissez-déposez des fichiers +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ou cliquez pour envoyer jusqu’à { $size } +addPassword = Protéger par mot de passe +emailPlaceholder = Votre adresse électronique +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Connectez-vous pour envoyer jusqu’à { $size } +signInOnlyButton = Connexion +accountBenefitTitle = Créez un compte { -firefox } ou connectez-vous +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partagez des fichiers jusqu’à { $size } +accountBenefitDownloadCount = Partagez des fichiers avec davantage de personnes +accountBenefitTimeLimit = + { $count -> + [one] Maintenez les liens actifs jusqu’à 1 journée + *[other] Maintenez les liens actifs jusqu’à { $count } jours + } +accountBenefitSync = Gérez les fichiers partagés à partir de n’importe quel appareil +accountBenefitMoz = Apprenez-en davantage sur les autres services { -mozilla } +signOut = Se déconnecter +okButton = OK +downloadingTitle = Téléchargement en cours +noStreamsWarning = Ce navigateur pourrait ne pas être en mesure de déchiffrer un fichier aussi volumineux. +noStreamsOptionCopy = Copiez le lien pour l’ouvrir dans un autre navigateur +noStreamsOptionFirefox = Essayez notre navigateur préféré +noStreamsOptionDownload = Continuer avec ce navigateur +downloadFirefoxPromo = { -send-short-brand } vous est proposé par le tout nouveau { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Partagez le lien vers votre fichier : +shareLinkButton = Partager le lien +# $name is the name of the file +shareMessage = Télécharger « { $name } » avec { -send-brand } : un moyen simple et sûr de partager des fichiers +trailheadPromo = Il existe un moyen de protéger votre vie privée. Rejoignez Firefox. +learnMore = En savoir plus. diff --git a/public/locales/fy-NL/send.ftl b/public/locales/fy-NL/send.ftl index 116166cb..41a91430 100644 --- a/public/locales/fy-NL/send.ftl +++ b/public/locales/fy-NL/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webeksperiment -siteFeedback = Kommentaar -uploadPageHeader = Privee, fersifere bestânsdieling -uploadPageExplainer = Ferstjoer bestannen troch in feilich, privee en fersifere keppeling dy't automatysk ferrint, om foar te kommen dat jo guod net foar altyd online bliuwt. -uploadPageLearnMore = Mear ynfo -uploadPageDropMessage = Sleep jo bestân hjir hinne om opladen te starten -uploadPageSizeMessage = Foar de meast betroubere wurking, is it it bêste om jo bestân lytser as 1 GB te hâlden -uploadPageBrowseButton = Selektearje in bestân op jo kompjûter -uploadPageBrowseButton1 = Selektearje in bestân om op te laden -uploadPageMultipleFilesAlert = Opladen fan mear bestannen tagelyk of in map wurdt op dit stuit net stipe. -uploadPageBrowseButtonTitle = Bestân oplade -uploadingPageProgress = { $filename } ({ $size }) wurdt oplaad +title = Send importingFile = Ymportearje… -verifyingFile = Ferifiearje… encryptingFile = Fersiferje… decryptingFile = Untsiferje… -notifyUploadDone = Jo oplaad is foltôge. -uploadingPageMessage = Sa gau as jo bestân opladen wurdt, kinne jo de opsjes foar de ferrindatum ynstelle. -uploadingPageCancel = Opladen annulearje -uploadCancelNotification = Jo oplaad is annulearre. -uploadingPageLargeFileMessage = Dit is in grut bestân en it opladen kin efkes duorje. In amerijke! -uploadingFileNotification = Jou in melding as de oplaad foltôge is. -uploadSuccessConfirmHeader = Ree om te ferstjoeren -uploadSvgAlt = Oplaad -uploadSuccessTimingHeader = De keppeling nei jo bestân sil nei 1 download ferrinne of nei 24 oeren. -copyUrlFormLabelWithName = Kopiearje en diel de keppeling om jo bestân te ferstjoeren: { $filename } -copyUrlFormButton = Nei klamboerd kopiearje +downloadCount = + { $num -> + [one] 1 download + *[other] { $num } downloads + } +timespanHours = + { $num -> + [one] 1 oer + *[other] { $num } oer + } copiedUrl = Kopiearre! -deleteFileButton = Bestân fuortsmite -sendAnotherFileLink = Noch in bestân ferstjoere -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Downloade -downloadFileName = { $filename } downloade -downloadFileSize = ({ $size }) -unlockInputLabel = Wachtwurd ynfiere unlockInputPlaceholder = Wachtwurd unlockButtonLabel = Deblokkearje -downloadFileTitle = Fersifere bestân downloade -// Firefox Send is a brand name and should not be localized. -downloadMessage = Jo freon stjoert jo in best^n mei Firefox Send, in tsjinst dy't jo yn steat stelt bestannen te dielen mei in feilige, privee en fersifere keppeling dy't automatysk ferrint om wis te wêzen dat jo guod net foar altyd online bliuwt. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Downloade -downloadNotification = Jo download is foltôge. downloadFinish = Download foltôge -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } fan { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send probearje -downloadingPageProgress = { $filename } ({ $size }) wurdt download -downloadingPageMessage = Lit dit ljepblêd iepen wylst wy jo bestân krije en ûntsiferje. -errorAltText = Oplaadflater +sendYourFilesLink = Send probearje errorPageHeader = Der is wat misgien! -errorPageMessage = Der is in flater bard wylst it opladen fan jo bestân. -errorPageLink = Noch in bestân ferstjoere fileTooBig = It bestân is te grut om op te laden. It moat lytser wêze as { $size }. linkExpiredAlt = Keppeling ferrûn -expiredPageHeader = Dizze keppeling is ferrûn of hat nea bestien! notSupportedHeader = Jo browser wurdt net stipe. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Spitigernôch stipet dizze browser de webtechnology dy't Firefox Send mooglik makket net. Jo moatte in oare browser probearje. Wy rekommandearje Firefox! notSupportedLink = Wêrom wurdt myn browser net stipe? -notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Firefox Send mooflik makket net. Jo moatte jo browser fernije. +notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Send mooflik makket net. Jo moatte jo browser fernije. updateFirefox = Firefox fernije -downloadFirefoxButtonSub = Fergese download -uploadedFile = Bestân -copyFileList = URL kopiearje -// expiryFileList is used as a column header -expiryFileList = Ferrint oer -deleteFileList = Fuortsmite -nevermindButton = Lit mar -legalHeader = Betingsten en privacy -legalNoticeTestPilot = Firefox Send is op dit stuit in Test Pilot-eksperimint en falt ûnder de Betingsten en Privacybelied fan Test Pilot. Mear ynformaasje oer dit eksperimint en de gegevenssamling stiethjir. -legalNoticeMozilla = Gebrûk fan de Firefox Send-website falt ek ûnder it Websites Privacybelied en Websites Gebrûksbetingsten fan Mozilla. -deletePopupText = Dit bestân fuortsmite -deletePopupYes = Ja deletePopupCancel = Annulearje deleteButtonHover = Fuortsmite -copyUrlHover = URL kopiearje -footerLinkLegal = Juridysk -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Oer Test Pilot -footerLinkPrivacy = Privacy -footerLinkTerms = Betingsten -footerLinkCookies = Cookies -requirePasswordCheckbox = Om dit bestân te downloaden is in wachtwurd fereaske -addPasswordButton = Wachtwurd tafoegje passwordTryAgain = Net krekt wachtwurd. Probearje it opnij. -// This label is followed by the password needed to download a file -passwordResult = Wachtwurd: { $password } +javascriptRequired = Send fereasket JavaScript. +whyJavascript = Werom hat Send JavaScript nedich? +enableJavascript = Skeakelje JavaScript yn en probearje nochris. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }o { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimale wachtwurdlingte: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dit wachtwurd koe net ynsteld wurde + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Ienfâldich, privee bestannen diele +introDescription = Mei { -send-brand } kinne jo bestannen mei ein-ta-ein-fersifering en in automatysk ferrinnende keppeling diele. Sa kinne jo de dielde ynhâld privee hâlde, sadat jo gegevens net foar altyd online bliuwt. +notifyUploadEncryptDone = Jo bestân is fersifere en ree om te ferstjoeren +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ferrint nei { $downloadCount } of { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minuten + } +timespanDays = + { $num -> + [one] 1 dei + *[other] { $num } dagen + } +timespanWeeks = + { $num -> + [one] 1 wike + *[other] { $num } wiken + } +fileCount = + { $num -> + [one] 1 bestân + *[other] { $num } bestannen + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Totale grutte: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiearje de keppeling, om jo bestannen te dielen: +copyLinkButton = Keppeling kopierje +downloadTitle = Bestannen downloade +downloadDescription = Dit bestân is mei ein-ta-ein-fersifering en in keppeling dy't automatysk ferrint dield fia { -send-brand }. +trySendDescription = Probearje { -send-brand }, om ienfâldich en privee bestannen te dielen. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Der kin maksimaal ien bestân opladen wurde. + *[other] Der kinne maksimaal { $count } bestannen opladen wurde. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Der is mar ien argyf tastien. + *[other] Der binne mar { $count } argiven tastien. + } +expiredTitle = Dizze keppeling is ferrûn. +notSupportedDescription = { -send-brand } funksjonearret net mei dizze browser. { -send-short-brand } funksjonearret it bêste mei de nijste ferzje fan { -firefox } en funksjonearret mei de aktuele ferzje fan de measte browsers. +downloadFirefox = { -firefox } downloade +legalTitle = { -send-short-brand }-privacyferklearring +legalDateStamp = Ferzje 1.0, datearre 12 maart 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }o { $minutes }m +addFilesButton = Bestannen selektearje om op te laden +uploadButton = Oplade +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Sleep en pleats bestannen +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = of stjoer oant { $size } troch te klikken +addPassword = Mei wachtwurd beskermje +emailPlaceholder = Fier jo e-mailadres yn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Meld jo oan, om bestannen oant { $size } te stjoeren +signInOnlyButton = Oanmelde +accountBenefitTitle = Meitsje in { -firefox }-account of meld jo oan +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Diel bestannen oant { $size } +accountBenefitDownloadCount = Diel bestannen mei mear minsken +accountBenefitTimeLimit = + { $count -> + [one] Keppeling oant ien dei lang aktyf hâlde + *[other] Keppeling oant { $count } dagen lang aktyf hâlde + } +accountBenefitSync = Behear dielde bestannen fan elk apparaat ôf +accountBenefitMoz = Lês mear oer oare { -mozilla }-tsjinsten +signOut = Ofmelde +okButton = OK +downloadingTitle = Downloade +noStreamsWarning = Dizze browser kin in sa'n grut bestân mooglik net fersiferje. +noStreamsOptionCopy = Kopiearje de koppeling om yn in oare browser te iepenjen +noStreamsOptionFirefox = Probearje ús favorite browser +noStreamsOptionDownload = Trochgean mei dizze browser +downloadFirefoxPromo = { -send-short-brand } wurdt jo oanbean troch it folslein fernijde { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Diel de keppeling nei jo bestân: +shareLinkButton = Keppeling diele +# $name is the name of the file +shareMessage = Download ‘{ $name }’ mei { -send-brand }: ienfâldich, feilich bestannen diele +trailheadPromo = Der is in manier om jo privacy te beskermjen. Doch mei mei Firefox. +learnMore = Mear ynfo. diff --git a/public/locales/gn/send.ftl b/public/locales/gn/send.ftl new file mode 100644 index 00000000..f3f4ab58 --- /dev/null +++ b/public/locales/gn/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Ojegueruhína… +encryptingFile = Mo’ãmby… +decryptingFile = Ñemo’ã’o… +downloadCount = + { $num -> + [one] 1 mboguejy + *[other] { $num } mboguejy + } +timespanHours = + { $num -> + [one] 1 aravo + *[other] { $num } aravo + } +copiedUrl = Monguatiapyre! +unlockInputPlaceholder = Ñe’ẽñemi +unlockButtonLabel = Mbojera +downloadButtonLabel = Mboguejy +downloadFinish = Oguejypáma +fileSizeProgress = ({ $partialSize } rehe { $totalSize }) +sendYourFilesLink = Eipuru Send +errorPageHeader = ¡Oiko jejavy! +fileTooBig = Marandurenda tuichaiterei ehupi hag̃ua. Michĩveva’erã { $size } gui. +linkExpiredAlt = Juajuha ndoikóiva +notSupportedHeader = Ne kundaha ndorekói pytyvõ. +notSupportedLink = ¿Mba’ére che kundahára ndorekói ñepytyvõ? +notSupportedOutdatedDetail = Ko Firefox rembiapo ndaipu’akái ñanduti rembipurupyahu oikotevẽva Send. Embohekopyahúke ne kundahára. +updateFirefox = Firefox mbohekopyahu +deletePopupCancel = Heja +deleteButtonHover = Mboguete +passwordTryAgain = Ñe’ẽñemi ndoikóiva. Eha’ãjey. +javascriptRequired = Send oikotevẽ JavaScript +whyJavascript = ¿Mba’ére Send oikotevẽ JavaScript? +enableJavascript = Ikatúpa embojuruja JavaScript ha eha’ãjey uperire. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } m +# A short status message shown when the user enters a long password +maxPasswordLength = Ñe’ẽñemi pukukue: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ndaikatúi oikóvo ko ñe’ẽñemi + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Marandurenda ñemoambue hasy’ỹ ha ñemiguáva +introDescription = { -send-brand } omoherakuãkuaa marandurenda papapýpe ñepyrũ guive opa peve ha juajuha opareíva ijehegui. Ikatu oreko ñemihápe emoherakuãva ha ehecháta mba’éicha ne mba’ekuéra noĩri ñandutípe opa ára. +notifyUploadEncryptDone = Ne marandurenda oñemo’ã ha ikatúma emondo +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Opáta { $downloadCount } rire térã { $timespan } +timespanMinutes = + { $num -> + [one] 1 aravo’i + *[other] { $num } aravo’i + } +timespanDays = + { $num -> + [one] 1 ára + *[other] { $num } ára + } +timespanWeeks = + { $num -> + [one] 1 arapokõindy + *[other] { $num } arapokõindy + } +fileCount = + { $num -> + [one] 1 marandurenda + *[other] { $num } marandurenda + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tuichakue: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Emonguatia juajuha ha emoherakuã ne marandurenda: +copyLinkButton = Emonguatia juajuha +downloadTitle = Emboguejy marandurenda +downloadDescription = Ko marandurenda omoherakuã { -send-brand } rupive papapýpe ñepyrũ guive opa peve ha juajuha opáva ijehegui reheve. +trySendDescription = Eipuru { -send-brand } emoherakuã hag̃ua marandurenda tasy’ỹ ha tekorosãme. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ikatu ehupi 1 marandurenda oñondive + *[other] Ikatu ehupi { $count } marandurenda oñondive + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Oñemoneĩ 1 marandurenda añoite + *[other] Oñemoneĩ { $count } marandurenda añoite + } +expiredTitle = Ko juajuha ndoikovéima. +notSupportedDescription = { -send-brand } ndoikomo’ãi ko kundahára ndive. { -send-short-brand } oikoporãvéta { -firefox } rembiapokue ipyahuvéva ndive, ha oikóta opavavete kundahára ndive. +downloadFirefox = Emboguejy { -firefox } +legalTitle = { -send-short-brand } Marandu ñemigua +legalDateStamp = Mba’epyahu 1.0, 12 jasyapy 2019 peguare +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Eiporavo marandurenda ehupi hag̃ua +uploadButton = Hupi +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Embosyryry ha epoi marandurenda +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = térã eikutu emondo hag̃ua { $size } peve +addPassword = Ñe’ẽñemíme mo’ãmbyre +emailPlaceholder = Emoinge ne ñanduti veve +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Eñepyrũ tembiapo emondo hag̃ua { $size } peve +signInOnlyButton = Eñepyrũ tembiapo +accountBenefitTitle = Emoheñói { -firefox } mba’ete térã eñepyrũ tembiapo +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Emoherakuã marandurenda { $size } peve +accountBenefitDownloadCount = Emoherakuã marandurenda hetave tapicha ndive +accountBenefitTimeLimit = + { $count -> + [one] Eguereko juajuha hendyhápe 1 ára + *[other] Eguereko juajuha hendyhápe { $count } ára + } +accountBenefitSync = Eñangareko marandurenda moherakuãmbyrére oimeraẽ mba’e’oka guive. +accountBenefitMoz = Eikuaa ambue { -mozilla } mba’epytyvõrã +signOut = Emboty tembiapo +okButton = OK +downloadingTitle = Oñemboguejyhína +noStreamsWarning = Ikatu ko kundahára ndoikuaái marandurenda tuichaitereíva. +noStreamsOptionCopy = Embokuatia juajuha embojuruja hag̃ua ambue kundahárape. +noStreamsOptionFirefox = Eipuru ore kundahára rohayhuvéva +noStreamsOptionDownload = Eku’ejey ko kundahára ndive +downloadFirefoxPromo = Ipyahúva { -firefox } ome’ẽse ndéve { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Emoherakuã juajuha ne mba’e’oka ndive: +shareLinkButton = Emoherakuã juajuha +# $name is the name of the file +shareMessage = Emboguejy “{ $name }” { -send-brand } ndive: emoherakuã marandurenda tasy’ỹ ha tekorosãme +trailheadPromo = Mba’éichapa emo’ãta ne ñemigua. Eipuru Firefox. +learnMore = Kuaave. diff --git a/public/locales/gor/send.ftl b/public/locales/gor/send.ftl new file mode 100644 index 00000000..7c9f90c4 --- /dev/null +++ b/public/locales/gor/send.ftl @@ -0,0 +1,59 @@ +title = Molawo +siteSubtitle = web yimontalo +uploadPageLearnMore = Pobalajariya po'olo +uploadPageBrowseButton = Tulawota berkas to delomo komputermu +uploadPageBrowseButton1 = Tulawota berkas u detohulo +uploadPageBrowseButtonTitle = Detohe berkas +uploadingPageProgress = Hemodetohu { $filename } ({ $size }) +notifyUploadDone = Diletohumu ma yilapato +uploadingPageMessage = Bataliya modetohu +uploadingPageCancel = Bataliya modetohu +uploadCancelNotification = Diletohumu ma bilatali +uploadingPageLargeFileMessage = Berkas botiya damango wawu paralu wakutu ngope'e mopodetohu. Potihulo'opo! +uploadingFileNotification = Poleleya ola'u wonu ma yilapato lodetohu. +uploadSuccessConfirmHeader = Siap Molawo +uploadSvgAlt = Detohe +timespanHours = + { $num -> + *[other] { $num } jam + } +copiedUrl = Yilami +deleteFileButton = Luluta berkas +sendAnotherFileLink = Lawola berkas uwewo +# Alternative text used on the download link/button (indicates an action). +downloadAltText = Mopohuli +downloadsFileList = Mopohuli +# Used as header in a column indicating the amount of time left before a +# download link expires (e.g. "10h 5m") +timeFileList = Wakutu +# Used as header in a column indicating the number of times a file has been +# downloaded +downloadFileName = Mopohuli { $filename } +downloadFileSize = ({ $size }) +unlockInputLabel = Tuwota Password +unlockInputPlaceholder = Password +unlockButtonLabel = Hu'owa +downloadFileTitle = Mopohuli Enskripsi Berkas +# Text and title used on the download link/button (indicates an action). +downloadButtonLabel = Mopohuli +downloadNotification = U pilopohulimu ma yilapato. +downloadFinish = Mopohuli Yilapato +# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +fileSizeProgress = ({ $partialSize } meyalo { $totalSize }) +sendYourFilesLink = Yimontali Molawo +downloadingPageProgress = Modetohu { $filename } ({ $size }) +downloadFirefoxButtonSub = Pereyi Mopohuli +uploadedFile = Berkas +copyFileList = Kupe'iya URL +# expiryFileList is used as a column header +expiryFileList = Mopulito To +deleteFileList = Luluta +nevermindButton = Sambelo +deletePopupText = Luluta berkas botiya? +deletePopupYes = Joo +deletePopupCancel = Bataliya +deleteButtonHover = Luluta +copyUrlHover = Kupe'iya URL +# Test Pilot is a proper name and should not be localized. +footerLinkAbout = Tomimbihu Test Pilot +changePasswordButton = Boli'a diff --git a/public/locales/he/send.ftl b/public/locales/he/send.ftl index ffecb54f..1c07187e 100644 --- a/public/locales/he/send.ftl +++ b/public/locales/he/send.ftl @@ -1,73 +1,152 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ניסוי אינטרנט -siteFeedback = משוב -uploadPageHeader = שיתוף קבצים פרטי, מוצפן -uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח. -uploadPageLearnMore = מידע נוסף -uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה -uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב -uploadPageBrowseButton1 = נא לבחור קובץ להעלאה -uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע. -uploadPageBrowseButtonTitle = העלאת קובץ -uploadingPageProgress = { $filename } ({ $size }) בהעלאה -importingFile = מתבצע ייבוא... -verifyingFile = מתבצע אימות… +title = Send +importingFile = מתבצע ייבוא… encryptingFile = מתבצעת הצפנה... decryptingFile = מתבצע פענוח... -notifyUploadDone = ההעלאה שלך הסתיימה -uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה. -uploadCancelNotification = ההעלאה שלך בוטלה. -uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות! -uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה. -uploadSuccessConfirmHeader = מוכן לשליחה -uploadSvgAlt - .alt = להעלות -uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות. -copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename } +downloadCount = + { $num -> + [one] הורדה אחת + *[other] { $num } הורדות + } +timespanHours = + { $num -> + [one] שעה אחת + [two] שעתיים + *[other] { $num } שעות + } copiedUrl = הועתק! -deleteFileButton = מחיקת קובץ - .title = מחיקת קובץ -sendAnotherFileLink = שליחת קובץ נוסף - .title = שליחת קובץ נוסף -// Alternative text used on the download link/button (indicates an action). -downloadAltText - .alt = הורדה -downloadFileName = ההורדה נכשלה -downloadFileSize = ({ $size }) -// Text and title used on the download link/button (indicates an action). +unlockInputPlaceholder = ססמה +unlockButtonLabel = שחרור נעילה downloadButtonLabel = הורדה - .title = הורדה -downloadNotification = ההורדה הושלמה. downloadFinish = ההורדה הושלמה -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } מתוך { $totalSize }) -downloadingPageProgress = בהורדה: { $filename } ({ $size }) -errorAltText - .alt = תקלה בהעלאה +sendYourFilesLink = נסו את Send errorPageHeader = משהו השתבש! -errorPageLink = שליחת קובץ נוסף fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }. -linkExpiredAlt - .alt = קישור פג +linkExpiredAlt = הקישור פג notSupportedHeader = הדפדפן שלך לא נתמך. notSupportedLink = למה אין תמיכה בדפדפן שלי? -downloadFirefoxButtonSub = הורדה בחינם -uploadedFile = קובץ -copyFileList = העתקת כתובת -// expiryFileList is used as a column header -expiryFileList = יפוג בעוד -deleteFileList = מחיקה -nevermindButton = לא משנה -legalHeader = תנאי שירות ופרטיות -deletePopupText = למחוק דף זה? -deletePopupYes = כן +notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Send. יש לעדכן את הגרסה של הדפדפן שלך. +updateFirefox = עדכון Firefox deletePopupCancel = ביטול -deleteButtonHover - .title = מחיקה -copyUrlHover - .title = העתקת קישור -footerLinkLegal = מידע משפטי -footerLinkPrivacy = פרטיות -footerLinkTerms = תנאי שימוש -footerLinkCookies = קובצי עוגיות +deleteButtonHover = מחיקה +passwordTryAgain = סיסמה שגויה. נא לנסות שוב. +javascriptRequired = ל־Send דרוש JavaScript +whyJavascript = למה ל־Send דרוש JavaScript? +enableJavascript = נא להפעיל JavaScript ולנסות שוב. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } שע׳ { $minutes } דק׳ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } דק׳ +# A short status message shown when the user enters a long password +maxPasswordLength = אורך הססמה המרבי: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = לא ניתן להגדיר את הססמה הזאת + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = שיתוף קבצים פרטי ופשוט +introDescription = { -send-brand } מאפשר לך לשתף קבצים עם הצפנה מקצה לקצה וקישור עם תפוגה אוטומטית. בצורה זו תוכלו לשתף קבצים באופן פרטי ולהבטיח שהדברים שלכם לא נשארים ברשת לנצח. +notifyUploadEncryptDone = הקובץ שלך מוצפן ומוכן לשליחה +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = יפוג לאחר { $downloadCount } או { $timespan } +timespanMinutes = + { $num -> + [one] דקה אחת + *[other] { $num } דקות + } +timespanDays = + { $num -> + [one] יום אחד + [two] יומיים + *[other] { $num } ימים + } +timespanWeeks = + { $num -> + [one] שבוע אחד + [two] שבועיים + *[other] { $num } שבועות + } +fileCount = + { $num -> + [one] קובץ אחד + *[other] { $num } קבצים + } +# byte abbreviation +bytes = בתים +# kibibyte abbreviation +kb = ק״ב +# mebibyte abbreviation +mb = מ״ב +# gibibyte abbreviation +gb = ג״ב +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = גודל כולל: { $size } +# the next line after the colon contains a file name +copyLinkDescription = יש להעתיק את הקישור כדי לשתף את הקובץ שלך: +copyLinkButton = העתקת קישור +downloadTitle = הורדת קבצים +downloadDescription = קובץ זה שותף באמצעות { -send-brand } עם הצפנה מקצה לקצה וקישור שפג באופן אוטומטי. +trySendDescription = כדאי לנסות את { -send-brand } לשיתוף קבצים פשוט ומאובטח. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ניתן להעלות רק קובץ אחד בכל פעם. + *[other] ניתן להעלות רק { $count } קבצים בכל פעם. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] רק ארכיון אחד מורשה. + *[other] רק { $count } ארכיונים מורשים. + } +expiredTitle = פג תוקפו של קישור זה. +notSupportedDescription = ‏{ -send-brand } לא יפעל עם דפדפן זה. { -send-short-brand } פועל בצורה הטובה ביותר עם הגרסה העדכנית ביותר של { -firefox }, ויעבוד עם הגרסה הנוכחית של רוב הדפדפנים. +downloadFirefox = הורדת { -firefox } +legalTitle = הצהרת פרטיות של { -send-short-brand } +legalDateStamp = גרסה 1.0, בתאריך 12 במרץ 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ימים { $hours } שעות { $minutes } דקות +addFilesButton = בחירת קבצים להעלאה +uploadButton = העלאה +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = גרירה והשלכת קבצים +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = או ללחוץ כדי לשלוח קבצים עד לגודל של { $size } +addPassword = הגנה באמצעות ססמה +emailPlaceholder = נא להכניס כתובת דוא״ל +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = נא להירשם כדי לשלוח קבצים עד גודל של { $size } +signInOnlyButton = כניסה +accountBenefitTitle = נא ליצור חשבון { -firefox } או להיכנס לחשבון +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = שיתוף קבצים עד גודל של { $size } +accountBenefitDownloadCount = שיתוף קבצים עם יותר אנשים +accountBenefitTimeLimit = + { $count -> + [one] שמירה על קישורים פעילים עד ליום אחד + *[other] שמירה על קישורים פעילים עד ל־{ $count } ימים + } +accountBenefitSync = ניהול קבצים משותפים מכל מכשיר +accountBenefitMoz = מידע נוסף על שירותי { -mozilla } אחרים +signOut = יציאה +okButton = אישור +downloadingTitle = בהורדה +noStreamsWarning = ייתכן שדפדפן זה לא יוכל לפענח קובץ בגודל כזה. +noStreamsOptionCopy = העתקת הקישור לפתיחה בדפדפן אחר +noStreamsOptionFirefox = נסו את הדפדפן המועדף עלינו +noStreamsOptionDownload = המשך בדפדפן זה +downloadFirefoxPromo = { -send-short-brand } מובא אליך בחסות { -firefox } +# the next line after the colon contains a file name +shareLinkDescription = שיתוף הקישור לקובץ שלך: +shareLinkButton = שיתוף קישור +# $name is the name of the file +shareMessage = הורדת ״{ $name }״ עם { -send-brand }: שיתוף קבצים פשוט ובטוח +trailheadPromo = ישנן דרכים נוספות להגן על הפרטיות שלכם. הצטרפו אל Firefox. +learnMore = מידע נוסף. diff --git a/public/locales/hr/send.ftl b/public/locales/hr/send.ftl new file mode 100644 index 00000000..590643f4 --- /dev/null +++ b/public/locales/hr/send.ftl @@ -0,0 +1,158 @@ +title = Send +importingFile = Uvoz… +encryptingFile = Šifriranje … +decryptingFile = Dešifriranje … +downloadCount = + { $num -> + [one] { $num } preuzimanje + [few] { $num } preuzimanja + *[other] { $num } preuzimanja + } +timespanHours = + { $num -> + [one] { $num } sat + [few] { $num } sata + *[other] { $num } sati + } +copiedUrl = Kopirano! +unlockInputPlaceholder = Lozinka +unlockButtonLabel = Otključaj +downloadButtonLabel = Preuzmi +downloadFinish = Preuzimanje je završeno. +fileSizeProgress = ({ $partialSize } od { $totalSize }) +sendYourFilesLink = Isprobaj Send +errorPageHeader = Dogodila se neka greška! +fileTooBig = Datoteka je prevelika za prijenos. Mora biti manja od { $size }. +linkExpiredAlt = Poveznica je istekla +notSupportedHeader = Tvoj preglednik nije podržan. +notSupportedLink = Zašto moj preglednik nije podržan? +notSupportedOutdatedDetail = Nažalost, ovo izdanje Firefoxa ne podržava web tehnologiju koja omogućava Send. Morat ćeš ažurirati preglednik. +updateFirefox = Ažuriraj Firefox +deletePopupCancel = Odustani +deleteButtonHover = Obriši +passwordTryAgain = Netočna lozinka. Pokušaj ponovo. +javascriptRequired = Za Send potreban je JavaScript +whyJavascript = Zašto je za Send potreban JavaScript? +enableJavascript = Aktiviraj JavaScript i pokušaj ponovo. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }s { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }min +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna duljina lozinke: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Lozinku nije moguće postaviti + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jednostavno i privatno dijeljenje datoteka +introDescription = { -send-brand } omogućava dijeljenje datoteka sa šifriranjem i poveznicom koja će automatski isteći. Ovim putem, stvari koje dijeliš ostaju privatne i osiguravaš se da ne ostaju zauvijek dostupne na internetu. +notifyUploadEncryptDone = Tvoja je datoteka šifrirana i spremna za slanje. +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Isteći će nakon { $downloadCount } ili { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minuta + [few] { $num } minute + *[other] { $num } minuta + } +timespanDays = + { $num -> + [one] { $num } dan + [few] { $num } dana + *[other] { $num } dana + } +timespanWeeks = + { $num -> + [one] { $num } tjedan + [few] { $num } tjedna + *[other] { $num } tjedana + } +fileCount = + { $num -> + [one] { $num } datoteka + [few] { $num } datoteke + *[other] { $num } datoteka + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ukupna veličina: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiraj poveznicu za dijeljenje svoje datoteke: +copyLinkButton = Kopiraj poveznicu +downloadTitle = Preuzmi datoteke +downloadDescription = Ova se datoteka dijelila putem usluge { -send-brand } sa šifriranjem i poveznicom koja će automatski isteći. +trySendDescription = Probaj { -send-brand } za jednostavno i sigurno dijeljenje datoteka. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Istovremeno se može prenijeti samo { $count } datoteka. + [few] Istovremeno se može prenijeti samo { $count } datoteke. + *[other] Istovremeno se može prenijeti samo { $count } datoteka. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Dozvoljena je samo { $count } arhiva. + [few] Dozvoljene su samo { $count } arhive. + *[other] Dozvoljeno je samo { $count } arhiva. + } +expiredTitle = Poveznica je istekla. +notSupportedDescription = { -send-brand } neće raditi s ovim preglednikom. { -send-short-brand } najbolje radi sa zadnjom { -firefox } verzijom i radit će s aktualnim verzijama većine preglednika. +downloadFirefox = Preuzmi { -firefox } +legalTitle = { -send-short-brand } politika privatnosti +legalDateStamp = Verzija 1.0, od 12. ožujka 2019. godine +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }s { $minutes }m +addFilesButton = Odaberi datoteke za prijenos +uploadButton = Prijenos +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Povuci i ispusti datoteke +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ili pritisni gumb, za slanje do { $size } +addPassword = Zaštiti s lozinkom +emailPlaceholder = Upiši svoju e-adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Prijavi se, za slanje do { $size } +signInOnlyButton = Prijavi se +accountBenefitTitle = Otvori { -firefox } račun ili se prijavi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dijeli datoteke do { $size } +accountBenefitDownloadCount = Dijeli datoteke s više osoba +accountBenefitTimeLimit = + { $count -> + [one] Ostavi poveznice aktivnima { $count } dan + [few] Ostavi poveznice aktivnima { $count } dana + *[other] Ostavi poveznice aktivnima { $count } dana + } +accountBenefitSync = Upravljaj dijeljenim datotekama s bilo kojeg uređaja +accountBenefitMoz = Saznaj više o drugim { -mozilla } uslugama +signOut = Odjavi se +okButton = U redu +downloadingTitle = Preuzimanje +noStreamsWarning = Ovaj preglednik možda neće moći dešifrirati datoteku ove veličine. +noStreamsOptionCopy = Za otvaranje u drugom pregledniku, kopiraj poveznicu +noStreamsOptionFirefox = Isprobaj naš omiljeni preglednik +noStreamsOptionDownload = Nastavi s ovim preglednikom +downloadFirefoxPromo = Potpuno novi { -firefox } donosi { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Dijeli poveznicu na tvoju datoteku: +shareLinkButton = Dijeli poveznicu +# $name is the name of the file +shareMessage = Preuzmi „{ $name }” pomoću { -send-brand }: jednostavno i sigurno dijeljenje datoteka +trailheadPromo = Postoji način, kako zaštititi vlastitu privatnost. Pridruži se Firefoxu. +learnMore = Saznaj više. diff --git a/public/locales/hsb/send.ftl b/public/locales/hsb/send.ftl index 8f07d1a1..491f17e8 100644 --- a/public/locales/hsb/send.ftl +++ b/public/locales/hsb/send.ftl @@ -1,91 +1,167 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webeksperiment -siteFeedback = Komentar -uploadPageHeader = Priwatne, zaklučowane dźělenje datajow -uploadPageExplainer = Pósćelće dataje přez wěsty, priwatny a zaklučowany wotkaz, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostali. -uploadPageLearnMore = Dalše informacije -uploadPageDropMessage = Ćehńće swoju dataju sem, zo byšće ju nahrał -uploadPageSizeMessage = Wužiwajće najlěpje dataje, kotrež su mjeńše hač 1 GB za lěpšu spušćomnosć. -uploadPageBrowseButton = Wubjerće dataju na swojim ličaku -uploadPageBrowseButton1 = Wubjerće dataju za nahraće -uploadPageMultipleFilesAlert = Nahrawanje wjacorych datajow abo rjadowaka so tuchwilu njepodpěruje. -uploadPageBrowseButtonTitle = Dataju nahrać -uploadingPageProgress = { $filename } ({ $size }) so nahrawa +title = Send importingFile = Importuje so... -verifyingFile = Přepruwuje so... encryptingFile = Zaklučuje so... decryptingFile = Dešifruje so... -notifyUploadDone = Waše nahraće je dokónčene. -uploadingPageMessage = Hdyž so waša dataja nahrawa, móžeće nastajenja spadnjenja postajić. -uploadingPageCancel = Nahraće přetorhnyć -uploadCancelNotification = Waše nahraće je so přetorhnyło. -uploadingPageLargeFileMessage = Tuta dataja je wulka a nahrawanje móhło chwilku trać. Budźće sćerpliwy! -uploadingFileNotification = Zdźělić, hdyž nahraće je dokónčene. -uploadSuccessConfirmHeader = Hotowy za słanje -uploadSvgAlt = Nahrać -uploadSuccessTimingHeader = Wotkaz k wašej dataji po 1 sćehnjenju abo 24 hodźinach spadnje. -copyUrlFormLabelWithName = Kopěrujće a dźělće wotkaz, zo byšće swoju dataju pósłał: { $filename } -copyUrlFormButton = Do mjezyskłada kopěrować +downloadCount = + { $num -> + [one] 1 sćehnjenje + [two] { $num } sćehnjeni + [few] { $num } sćehnjenja + *[other] { $num } sćehnjenjow + } +timespanHours = + { $num -> + [one] 1 hodźina + [two] { $num } hodźinje + [few] { $num } hodźiny + *[other] { $num } hodźin + } copiedUrl = Kopěrowany! -deleteFileButton = Dataju zhašeć -sendAnotherFileLink = Druhu dataju pósłać -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Sćahnyć -downloadFileName = { $filename } sćahnyć -downloadFileSize = ({ $size }) -unlockInputLabel = Hesło zapodać unlockInputPlaceholder = Hesło unlockButtonLabel = Wotewrěć -downloadFileTitle = Zaklučowanu dataju sćahnyć -// Firefox Send is a brand name and should not be localized. -downloadMessage = Waš přećel wam dataju z Firefox Send sćele, słužba, kotraž wam zmóžnja, dataje přez wěsty, priwatny a zaklučowany wotkaz dźělić, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostawali. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Sćahnyć -downloadNotification = Waše sćehnjenje je dokónčene. downloadFinish = Sćehnjenje dokónčene -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send wupruwować -downloadingPageProgress = { $filename } ({ $size }) so sćahuje -downloadingPageMessage = Prošu wostajće tutón rajtark wočinjeny, mjeztym zo wašu dataju sćahujemy a dešifrujemy. -errorAltText = Nahrawanski zmylk +sendYourFilesLink = Send wupruwować errorPageHeader = Něšto je so nimokuliło! -errorPageMessage = Při nahrawanju dataje je zmylk wustupił. -errorPageLink = Druhu dataju pósłać fileTooBig = Tuta dataja je přewulka za nahraće. Měła mjeńša hač { $size } być. linkExpiredAlt = Wotkaz je spadnjeny -expiredPageHeader = Tutón wotkaz je spadnjeny abo njeje ženje eksistował! notSupportedHeader = Waš wobhladowak so njepodpěruje. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Bohužel tutón wobhladowak webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće druhi wobhladowak wužiwać. My Firefox doporučemy! notSupportedLink = Čehodla so mój wobhladowak njepodpěruje? -notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće swój wobhladowak aktualizować. +notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Send bazuje. Dyrbiće swój wobhladowak aktualizować. updateFirefox = Firefox aktualizować -downloadFirefoxButtonSub = Darmotne sćehnjenje -uploadedFile = Dataja -copyFileList = URL kopěrować -// expiryFileList is used as a column header -expiryFileList = Spadnje za -deleteFileList = Zhašeć -nevermindButton = Wšojedne -legalHeader = Wuměnjenja a priwatnosć -legalNoticeTestPilot = Firefox je tuchwilu eksperiment Test Pilot, a podleži wužiwanskim wuměnjenjam a pokazce priwatnosće Test Pilot. Wjace wo tutym eksperimenće a daty, kotrež hromadźi, tu zhoniće. -legalNoticeMozilla = Tež wužiwanje websydła Firefox Send pokazce priwatnosće za websydła a wužiwanskim wuměnjenjam za websydła Mozilla podleži. -deletePopupText = Tutu dataju zhašeć? -deletePopupYes = Haj deletePopupCancel = Přetorhnyć deleteButtonHover = Zhašeć -copyUrlHover = URL kopěrować -footerLinkLegal = Prawniske -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Wo Test Pilot -footerLinkPrivacy = Priwatnosć -footerLinkTerms = Wuměnjenja -footerLinkCookies = Placki -requirePasswordCheckbox = Žadajće sej hesło za sćehnjenje tuteje dataje -addPasswordButton = Hesło přidać passwordTryAgain = Wopačne hesło. Prošu spytajće hišće raz. -// This label is followed by the password needed to download a file -passwordResult = Hesło: { $password } +javascriptRequired = Send JavaScript trjeba +whyJavascript = Čehodla Send JavaScript trjeba? +enableJavascript = Prošu zmóžńće JavaScript a spytajće hišće raz. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } hodź. { $minutes } mjeń. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } mjeń. +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna dołhosć hesła: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Tute hesło njeda so nastajić + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jednore, priwatne datajowe dźělenje +introDescription = { -send-brand } wam zmóžnja, dataje ze zaklučowanjom kónc do kónca a wotkazom dźělić, kotryž awtomatisce spadnje. Tak móžeće dźěleny wobsah priwatny dźeržeć a zawěsćić, zo waše daty online na přeco njewóstanu. +notifyUploadEncryptDone = Waša dataja je zaklučowana a hotowa za słanje +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Spadnje po { $downloadCount } abo { $timespan } +timespanMinutes = + { $num -> + [one] { $num } mjeńšina + [two] { $num } mjeńšinje + [few] { $num } mjeńšiny + *[other] { $num } mjeńšin + } +timespanDays = + { $num -> + [one] { $num } dźeń + [two] { $num } dnjej + [few] { $num } dny + *[other] { $num } dnjow + } +timespanWeeks = + { $num -> + [one] { $num } tydźeń + [two] { $num } njedźeli + [few] { $num } njedźele + *[other] { $num } njedźel + } +fileCount = + { $num -> + [one] { $num } dataja + [two] { $num } dataji + [few] { $num } dataje + *[other] { $num } datajow + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Cyłkowna wulkosć: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopěrujće wotkaz, zo byšće swoju dataju dźělił: +copyLinkButton = Wotkaz kopěrować +downloadTitle = Dataje sćahnyć +downloadDescription = Tuta dataja je so přez { -send-brand } ze zaklučowanjom kónc do kónca a wotkazom dźěliła, kotryž awtomatisce spadnje. +trySendDescription = Spytajće { -send-brand } za jednore, wěste datajowe dźělenje. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Jenož { $count } dataja da so na jedne dobo nahrać. + [two] Jenož { $count } dataji datej so na jedne dobo nahrać. + [few] Jenož { $count } dataje dadźa so na jedne dobo nahrać. + *[other] Jenož { $count } datajow da so na jedne dobo nahrać. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Jenož { $count } archiw je dowoleny. + [two] Jenož { $count } archiwaj stej dowolenej. + [few] Jenož { $count } archiwy su dowolene. + *[other] Jenož { $count } archiwow je dowolene. + } +expiredTitle = Tutón wotkaz je spadnjeny. +notSupportedDescription = { -send-brand } z tutym wobhladowakom njefunguje. { -send-short-brand } najlěpje z najnowšej wersiju { -firefox } funguje, a funguje z aktualnej wersiju najwjace wobhladowakow. +downloadFirefox = { -firefox } scáhnyć +legalTitle = Zdźělenka priwatnosće { -send-short-brand } +legalDateStamp = Wersija 1.0 wot 12. měrca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Dataje za nahrawanje wubrać +uploadButton = Nahrać +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ćehńće a wotkładźće dataje +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = abo klikńće, zo byšće do { $size } pósłał +addPassword = Z hesłom škitać +emailPlaceholder = Zapodajće swoju e-mejlowu adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Přizjewće so, zo byšće do { $size } pósłał +signInOnlyButton = Přizjewić +accountBenefitTitle = Załožće konto { -firefox } abo přizjewće so +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dataje do { $size } dźělić +accountBenefitDownloadCount = Dataje z wjace ludźimi dźělić +accountBenefitTimeLimit = + { $count -> + [one] Wotkazy do { $count } dnja aktiwne dźeržeć + [two] Wotkazy do { $count } dnjow aktiwne dźeržeć + [few] Wotkazy do { $count } dnjow aktiwne dźeržeć + *[other] Wotkazy do { $count } dnjow aktiwne dźeržeć + } +accountBenefitSync = Dźělene dataje z někajkeho grata rjadować +accountBenefitMoz = ZHońće wjace wo druhich słužbach { -mozilla } +signOut = Wotzjewić +okButton = W porjadku +downloadingTitle = Sćahuje so +noStreamsWarning = Tutón wobhladowak njemóhł tajku wulku dataju dešifrować. +noStreamsOptionCopy = Kopěrujće wotkaz, zo byšće jón w druhim wobhladowaku wočinił +noStreamsOptionFirefox = Wupruwujće naš najlubši wobhladowak +noStreamsOptionDownload = Z tutym wobhladowakom pokročować +downloadFirefoxPromo = { -send-short-brand } so wam přez cyle nowy { -firefox } přinjese. +# the next line after the colon contains a file name +shareLinkDescription = Dźělće wotkaz k swojej dataji: +shareLinkButton = Wotkaz dźělić +# $name is the name of the file +shareMessage = Sćehńće „{ $name }“ z { -send-brand }: jednore, wěste dźělenje datajow +trailheadPromo = Je móžnosć, wašu priwatnosć škitać. Přińdźće k Firefox. +learnMore = Dalše informacije. diff --git a/public/locales/hu/send.ftl b/public/locales/hu/send.ftl index 55db07ff..d85513c6 100644 --- a/public/locales/hu/send.ftl +++ b/public/locales/hu/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webes kísérlet -siteFeedback = Visszajelzés -uploadPageHeader = Privát, titkosított fájlmegosztás -uploadPageExplainer = Küldjön át fájlokat biztonságos, privát és titkosított hivatkozáson keresztül, amely automatikusan elévül, hogy ne maradjanak a dolgai örökké online. -uploadPageLearnMore = Tudjon meg többet -uploadPageDropMessage = Dobja ide a fájljait, és kezdjen feltölteni -uploadPageSizeMessage = A megbízható működés érdekében a legjobb, ha a fájlok 1 GB-nál kisebbek maradnak -uploadPageBrowseButton = Válasszon egy fájlt a számítógépén -uploadPageBrowseButton1 = Válassza ki a feltöltendő fájlt -uploadPageMultipleFilesAlert = Több fájl vagy mappa feltöltése pillanatnyilag nem támogatott. -uploadPageBrowseButtonTitle = Fájl feltöltése -uploadingPageProgress = { $filename } ({ $size }) feltöltése +title = Send importingFile = Importálás… -verifyingFile = Ellenőrzés… encryptingFile = Titkosítás… decryptingFile = Visszafejtés… -notifyUploadDone = A feltöltése befejeződött. -uploadingPageMessage = Ha a fájl feltöltésre került, akkor megadhatja a lejárati beállításokat. -uploadingPageCancel = Feltöltés megszakítása -uploadCancelNotification = A feltöltés megszakításra került. -uploadingPageLargeFileMessage = Ez a fájl nagy, és a feltöltése eltarthat egy ideig. Türelmét kérjük! -uploadingFileNotification = Értesítsen, ha a feltöltés elkészült. -uploadSuccessConfirmHeader = Küldésre kész -uploadSvgAlt = Feltöltés -uploadSuccessTimingHeader = A fájl hivatkozása lejár 1 letöltés vagy 24 óra múlva. -copyUrlFormLabelWithName = Másolja és ossza meg a hivatkozást a fájl küldéséhez: { $filename } -copyUrlFormButton = Vágólapra másolás +downloadCount = + { $num -> + [one] 1 letöltés + *[other] { $num } letöltés + } +timespanHours = + { $num -> + [one] 1 óra + *[other] { $num } óra + } copiedUrl = Másolva! -deleteFileButton = Fájl törlése -sendAnotherFileLink = Még egy fájl küldése -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Letöltés -downloadFileName = { $filename } letöltése -downloadFileSize = ({ $size }) -unlockInputLabel = Adja meg a jelszót unlockInputPlaceholder = Jelszó unlockButtonLabel = Feloldás -downloadFileTitle = Titkosított fájl letöltése -// Firefox Send is a brand name and should not be localized. -downloadMessage = Az ismerőse egy fájlt küld a Firefox Senddel, egy olyan fájlmegosztó szolgáltatással, amely biztonságos, privát és titkosított hivatkozáson keresztül működik, amely automatikusan elévül, így biztosítva hogy a dolga ne maradjon örökre online. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Letöltés -downloadNotification = A letöltés befejeződött. downloadFinish = A letöltés befejeződött -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Próbálja ki a Firefox Sendet -downloadingPageProgress = { $filename } letöltése ({ $size }) -downloadingPageMessage = Hagyja nyitva ezt a lapot, amíg lekérésre és visszafejtésre kerül a fájlja. -errorAltText = Feltöltési hiba +sendYourFilesLink = Próbálja ki a Sendet errorPageHeader = Hiba történt! -errorPageMessage = Hiba történt a fájl feltöltésekor. -errorPageLink = Még egy fájl küldése fileTooBig = Ez a fájl túl nagy a feltöltéshez. Kevesebb mint { $size } kell legyen. linkExpiredAlt = A hivatkozás lejárt -expiredPageHeader = Ez a hivatkozás lejárt, vagy sosem létezett! notSupportedHeader = A böngésző nem támogatott. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Sajnos ez a böngésző nem támogatja a Firefox Send alapját képező webes technológiát. Egy másik böngészőben kell megpróbálnia. Mi a Firefoxot javasoljuk! notSupportedLink = Miért nem támogatott a böngészőm? -notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Firefox Send alapját képező technológiát. Frissítenie kell a böngészőjét. +notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Send alapját képező technológiát. Frissítenie kell a böngészőjét. updateFirefox = Firefox frissítése -downloadFirefoxButtonSub = Ingyenes letöltés -uploadedFile = Fájl -copyFileList = URL másolása -// expiryFileList is used as a column header -expiryFileList = Lejár: -deleteFileList = Törlés -nevermindButton = Mindegy -legalHeader = Feltételek és adatvédelem -legalNoticeTestPilot = A Firefox Send pillanatnyilag egy Tesztpilóta kísérlet, és a Szolgáltatási feltételek valamint az Adatvédelmi nyilatkozat vonatkozik rá. Többet tudhat meg a kísérletről, és az adatgyűjtéséről itt. -legalNoticeMozilla = A Firefox Send weboldal használatakor a Mozilla Webhelyekre vonatkozó adatvédelmi nyilatkozata és a Weboldalak felhasználási feltételei is vonatkoznak Önre. -deletePopupText = Törli ezt a fájlt? -deletePopupYes = Igen deletePopupCancel = Mégse deleteButtonHover = Törlés -copyUrlHover = URL másolása -footerLinkLegal = Jogi információk -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = A Tesztpilóta névjegye -footerLinkPrivacy = Adatvédelem -footerLinkTerms = Feltételek -footerLinkCookies = Sütik -requirePasswordCheckbox = Jelszó megkövetelése a fájl letöltéséhez -addPasswordButton = Jelszó hozzáadása passwordTryAgain = Helytelen jelszó. Próbálja meg újra. -// This label is followed by the password needed to download a file -passwordResult = Jelszó: { $password } +javascriptRequired = A Sendhez JavaScript szükséges +whyJavascript = Miért van szükség JavaScriptre a Sendhez? +enableJavascript = Kérjük engedélyezze a JavaScriptet, majd próbálkozzon újra. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ó { $minutes }p +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }p +# A short status message shown when the user enters a long password +maxPasswordLength = Maximális jelszóhossz: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ez a jelszó nem állítható be + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Egyszerű, privát fájlmegosztás +introDescription = A { -send-brand }del végpontok közötti titkosítással oszthat meg fájlokat, a hivatkozások pedig automatikusan lejárnak. Így bizalmasan tarthatja azt, amit megoszt, és biztosíthatja, hogy a dolgok nem maradnak örökre online. +notifyUploadEncryptDone = A fájl titkosítva és készen áll a küldésre +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } vagy { $timespan } után elévül +timespanMinutes = + { $num -> + [one] 1 perc + *[other] { $num } perc + } +timespanDays = + { $num -> + [one] 1 nap + *[other] { $num } nap + } +timespanWeeks = + { $num -> + [one] 1 hét + *[other] { $num } hét + } +fileCount = + { $num -> + [one] 1 fájl + *[other] { $num } fájl + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Teljes méret: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Másolja a hivatkozást a fájl megosztásához: +copyLinkButton = Hivatkozás másolása +downloadTitle = Fájlok letöltése +downloadDescription = Ez a fájl a { -send-brand } szolgáltatással lett megosztva, végpontok közötti titkosítással, és a hivatkozás automatikusan elévül. +trySendDescription = Próbálja ki a { -send-brand }et az egyszerű, biztonságos fájlmegosztásért. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Egyszerre csak 1 fájl tölthető fel. + *[other] Egyszerre csak { $count } fájl tölthető fel. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Csak 1 archívum engedélyezett. + *[other] Csak { $count } archívum engedélyezett. + } +expiredTitle = Ez a hivatkozás elévült. +notSupportedDescription = A { -send-brand } nem működik ebben a böngészőben. A { -send-short-brand } a { -firefox } legfrissebb verziójával működik a legjobban, de működik a legtöbb böngésző aktuális verziójával is. +downloadFirefox = A { -firefox } letöltése +legalTitle = { -send-short-brand } adatvédelmi nyilatkozat +legalDateStamp = 1.0-s verzió, kelt 2019. március 12-én +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }n { $hours }ó { $minutes }p +addFilesButton = Válassza ki a feltöltendő fájlokat +uploadButton = Feltöltés +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Húzza ide a fájlokat +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = vagy jelentkezzen be, és küldjön legfeljebb { $size }-ot +addPassword = Jelszavas védelem +emailPlaceholder = Adja meg az e-mail címét +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Jelentkezzen be, és küldjön legfeljebb { $size }-ot +signInOnlyButton = Bejelentkezés +accountBenefitTitle = Hozzon létre egy { -firefox } fiókot vagy jelentkezzen be +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Osszon meg fájlokat { $size }-ig +accountBenefitDownloadCount = Osszon meg fájlokat több emberrel +accountBenefitTimeLimit = + { $count -> + [one] A hivatkozások aktívan tartása legfeljebb 1 napig + *[other] A hivatkozások aktívan tartása legfeljebb { $count } napig + } +accountBenefitSync = Kezelje a megosztott fájlokat bármely eszközről +accountBenefitMoz = Ismerje meg a többi { -mozilla } szolgáltatást +signOut = Kijelentkezés +okButton = OK +downloadingTitle = Letöltés +noStreamsWarning = Előfordulhat, hogy a böngésző nem fog tudni visszafejteni egy ekkora fájlt. +noStreamsOptionCopy = Másolja a hivatkozást, és nyissa meg egy másik böngészőben +noStreamsOptionFirefox = Próbálja ki a kedvenc böngészőnket +noStreamsOptionDownload = Folytatás ezzel a böngészővel +downloadFirefoxPromo = A { -send-short-brand }et a vadonatúj { -firefox } hozza el Önnek. +# the next line after the colon contains a file name +shareLinkDescription = Ossza meg a fájlja hivatkozását: +shareLinkButton = Hivatkozás megosztása +# $name is the name of the file +shareMessage = „{ $name }” letöltése a { -send-brand } segítségével: egyszerű, biztonságos fájlmegosztás +trailheadPromo = Védje meg a magánszféráját. Csatlakozzon a Firefoxhoz. +learnMore = További tudnivalók. diff --git a/public/locales/hus/send.ftl b/public/locales/hus/send.ftl new file mode 100644 index 00000000..23ac7e8b --- /dev/null +++ b/public/locales/hus/send.ftl @@ -0,0 +1,146 @@ +title = Send +importingFile = k'wajat i chiyál... +encryptingFile = K'wajat i tsinat dheyál... +decryptingFile = K'wajat i exal ki wila'... +downloadCount = + { $num -> + *[other] 1 pa'badh { $num } pa'badh + } +timespanHours = + { $num -> + *[other] 1 hora { $num } hora + } +copiedUrl = Letsbadh... +unlockInputPlaceholder = Tsinat japixtal +unlockButtonLabel = Ka japiy +downloadButtonLabel = Ka pa'ba' +downloadFinish = Tala' pa'iyits +fileSizeProgress = { $partialSize } xi ti { $totalSize } +sendYourFilesLink = Ka eyendha' Send +errorPageHeader = ¡Yab kalej alwa'! +fileTooBig = Tekedh pulik axi a le' ka kadh'ba', kwa'al kin alemna' { $size } +linkExpiredAlt = Yabats u awil ki ela' +notSupportedHeader = Yab u awil ka japiyat k'al axi NAVEGADOR +notSupportedLink = ¿Jale' ti u NAVEGADOR yab in japiyal? +notSupportedOutdatedDetail = Yab u awil ka eyendha' Send kom an NAVEGADOR Firefox biyalits. Ka Pa'ba' axi it. +updateFirefox = Ka itmedha' Firefox +deletePopupCancel = Ka kuba' +deleteButtonHover = Ka pakuw +passwordTryAgain = Yab ja' an tsinat japixtaláb. Ka exa' junil. +javascriptRequired = Send in yejenchal JavaScript +whyJavascript = ¿Jale' Send in yejenchal JavaScript? +enableJavascript = Ka lek'wtsiy JavaScript ani ka exa' junil. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = In puwél an tsinat japixtaláb pel: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Axi tsinat japixtaláb yab u awil ka eyendha' + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Yab k'ibat, a tsinat t'ojlabil u awil ka buk'uw +introDescription = { -send-brand } in t'ajál abal ka buk'uw a t'ojlabil po axé' tsinat abal an atikláb axi tat yab a le' kin tsu'uw yab kin ejtow, aniyej an enlace abal ka pa'ba' an t'ojláb u talél kwetém. Antsan patal axi ka abna' u awil ka buk'uw tsinat ani antsan jayej axi ka buk'uw yab u jilk'onal ets'ey ti ébtsolom (internet). +notifyUploadEncryptDone = A t'ojlabil xo' tsinadhits ani u awilits ka abna' +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ne'ets ka taliy ti { $downloadCount } o ti { $timespan } +timespanMinutes = + { $num -> + *[other] 1 minuto { $num } + } +timespanDays = + { $num -> + *[other] 1 k'icháj { $num } k'ichajchik + } +timespanWeeks = + { $num -> + *[other] 1 semana { $num } i semanachik + } +fileCount = + { $num -> + *[other] 1 t'ojláb { $num } t'ojlabchik + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = In puwél an t'ojláb: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Ka k'ot'biy an enlace abal ka ejtow ka buk'uw a t'ojlabil: +copyLinkButton = ka k'ot'biy an enlace +downloadTitle = Ka pa'ba' an t'ojláb +downloadDescription = Axi t'ojláb aban k'al in tolmixtal an { -send-brand } ani tsinat, aniyej in tsap an enlace u talél kwetém. +trySendDescription = Ka eyendha' { -send-brand } abal ka abna' a t'ojlabil, yab k'ibat ani k'anidh. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] + Expidh u awil ka k'adhba' 1 i t'ojláb + Expidh u awil ka k'adhba' { $count } i t'ojláb. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] + Expidh u awil 1 i t'ojláb. + Expidh u awil { $count } i t'ojláb. + } +expiredTitle = An enlace talíts in tsap. +notSupportedDescription = { -send-brand } yab u t'ojnal al axi navegador. { -send-short-brand } u t'ojnal alwa' k'al an { -firefox } axi it, ani ne'ets ka t'ojon alwa' k'al an it navegadorchik. +downloadFirefox = Ka pa'ba' { -firefox } +legalTitle = Tin kwentaj an "Tsinaxtaláb a k'al" { -send-short-brand } +legalDateStamp = Versión 1.0 ani t'ajadh ti Marzo 12 ti tamub 2019. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } k'icháj { $hours } hora { $minutes } minuto +addFilesButton = Ka takuy an t'ojláb axi ne'ets ka k'adhba' +uploadButton = Ka k'adhba' +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ka kina' a t'ojlabil ani ka walka' te' +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o ka t'aja' an clic abal ka abna' ma { $size } +addPassword = Ka k'aniy k'al jún i tsinat japixtaláb +emailPlaceholder = Ka punuw a abnax dhuchlab Correo Electrónico. +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kit otsits abal ka ejtow ka abna' ma { $size } +signInOnlyButton = Kit otsits +accountBenefitTitle = Ka ts'ejka' jún a it k'al (cuenta) { -firefox } o kit otsits max a kwa'alits jún. +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ka buk'uw a t'ojlabil, ma { $size } +accountBenefitDownloadCount = Ka buk'uw a t'ojlabil k'al pil i atiklabchik +accountBenefitTimeLimit = + { $count -> + *[other] + Ka ko'oy an enlace ma 1 a k'icháj + Ka ko'oy an enlacechik ma { $count } a k'icháhchik + } +accountBenefitSync = Ka ejtow tit t'ojnal k'al t'ojlabil al jawakitsk'ij tum eyendhabnél +accountBenefitMoz = Ka exla' jant'oj ti pidhál { -mozilla } +signOut = Kit kalej +okButton = Ka bats'uw +downloadingTitle = K'wajat ti pa'íl +noStreamsWarning = Walám axi navegador yab ne'ets kin ejtow kin japiy jún i t'ojláb tekedh pulik. +noStreamsOptionCopy = Ka k'ot'biy an enlace abal ka japiy al pil i navegador +noStreamsOptionFirefox = Ka eyendha' i navegador +noStreamsOptionDownload = yab kit kalej al axi navegador +downloadFirefoxPromo = An it { -firefox } ti pidhál { -send-short-brand } +# the next line after the colon contains a file name +shareLinkDescription = Ka abna' an enlace al an eyendhanél: +shareLinkButton = Ka abna' an enlace +# $name is the name of the file +shareMessage = Ka pa'ba' “{ $name }” k'al { -send-brand }: ka abna' a t'ojlabil, yab k'ibat ani k'anidh +trailheadPromo = U awil ka k'aniy axi tat a k'al. Kit tamkun k'al Firefox. +learnMore = Ka ajiy más. diff --git a/public/locales/hy-AM/send.ftl b/public/locales/hy-AM/send.ftl new file mode 100644 index 00000000..6a2f883e --- /dev/null +++ b/public/locales/hy-AM/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Ներմուծում... +encryptingFile = Գաղտնագրում… +decryptingFile = Վերծանում… +downloadCount = + { $num -> + [one] 1 ներբեռնում + *[other] { $num } ներբեռնումներ + } +timespanHours = + { $num -> + [one] 1 ժամ + *[other] { $num } ժամ + } +copiedUrl = Պատճենված +unlockInputPlaceholder = Գաղտնաբառ +unlockButtonLabel = Ապակողպել +downloadButtonLabel = Ներբեռնել +downloadFinish = Ներբեռնումն ավարտված է +fileSizeProgress = ({ $partialSize }-ը { $totalSize })-ից +sendYourFilesLink = Փորձել Send-ը +errorPageHeader = Ինչ-որ բան այն չէ +fileTooBig = Այդ ֆայլը չափազանց մեծ է վերբեռնելու համար: Այն պետք է լինի ավելի քիչ, քան { $size }-ը +linkExpiredAlt = Հղումն ավարտված է +notSupportedHeader = Ձեր զննարկիչը չի աջակցվում: +notSupportedLink = Ինչու իմ զննարկիչը չի աջակցվում: +notSupportedOutdatedDetail = Դժբախտաբար, Firefox- ի այս տարբերակը չի աջակցում այն վեբ տեխնոլոգիան, որը պետք է Send-ի համար: Դուք պետք է թարմացնեք ձեր զննարկիչը: +updateFirefox = Թարմացնել Firefox-ը +deletePopupCancel = Չեղարկել +deleteButtonHover = Ջնջել +passwordTryAgain = Սխալ գաղտնաբառ. Կրկին փորձեք: +javascriptRequired = Send-ը պահանջում է JavaScript +whyJavascript = Ինչո՞ւ է Send-ը պահանջում JavaScript. +enableJavascript = Խնդրում ենք միացնել JavaScript-ը և կրկին փորձել: +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ժ { $minutes }ր +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ր +# A short status message shown when the user enters a long password +maxPasswordLength = Գանղտնաբառի առավելագույն չափ. { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Այս գաղտնաբառը հնարավոր չէ սահմանել + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Ուղարկել +-firefox = Firefox +-mozilla = Mozilla +introTitle = Պարզ, մասնավոր ֆայլերի փոխանակում +introDescription = { -send-brand }-ը թույլ է տալիս փոխանակել ֆայլեր ծայրից ծայր գաղտնագրման միջոցով և այնպիսի հղում, որն ինքնաբերաբար ավարտվում է: Այսպիսով, դուք կարող եք վերահսկել այն, ինչով կիսվում եք և համոզված լինեք, որ ձեր նյութերը հավերժ չեն մնա առցանց: +notifyUploadEncryptDone = Ձեր ֆայլը գաղտնագրված է և պատրաստ է ուղարկել +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ավարտվելու է { $downloadCount }-ից կամ { $timespan }-ից +timespanMinutes = + { $num -> + [one] 1 րոպե + *[other] { $num } րոպե + } +timespanDays = + { $num -> + [one] 1 օր + *[other] { $num } օր + } +timespanWeeks = + { $num -> + [one] 1 շաբաթ + *[other] { $num } շաբաթ + } +fileCount = + { $num -> + [one] 1 ֆայլ + *[other] { $num } ֆայլեր + } +# byte abbreviation +bytes = Բ +# kibibyte abbreviation +kb = ԿԲ +# mebibyte abbreviation +mb = ՄԲ +# gibibyte abbreviation +gb = ԳԲ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ընդհանուր չափ՝ { $size } +# the next line after the colon contains a file name +copyLinkDescription = Պատճենեք հղումը՝ ֆայլը համօգտագործելու համար. +copyLinkButton = Պատճենել հղումը +downloadTitle = Ներբեռնել ֆայլերը +downloadDescription = Հայլը համօգտագործվել է { -send-brand }-ի միջոցով ՝ ծայրից ծայր գաղտնագրմամբ և ինքնաբերաբար ավարտվող հղմամբ: +trySendDescription = Փորձեք { -send-brand }-ը՝ ֆայլերի պարզ և անվտանգ փոխանակման համար: +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Միաժամանակ միայն 1 ֆայլ կարող է վերբեռնվել: + *[other] Միաժամանակ միայն { $count } ֆայլեր կարող են վերբեռնվել: + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Միայն 1 արխիվ է թույլատրված: + *[other] Միայն { $count } արխիվներ են թույլատրված: + } +expiredTitle = Այս հղումն ավարտված է: +notSupportedDescription = { -send-brand }-ը չի աշխատի այս զննարկչի հետ: { -send-short-brand }-ը լավագույն կերպով աշխատում է { -firefox }-ի վերջին տարբերակի հետ և կաշխատի զննարկիչների մեծամասնության վերջին տարբերակների հետ: +downloadFirefox = Ներբեռնել { -firefox }-ը +legalTitle = { -send-short-brand }-ի Գաղտնիության ծանուցում +legalDateStamp = Տարբերակ 1.0, թվագրված՝ 2019 թ. մարտի 12-ով +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }օր { $hours }ժ { $minutes }ր +addFilesButton = Ընտրեք ֆայլեր՝ վերբեռնելու համար +uploadButton = Վերբեռնել +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Քաշեք և գցեք ֆայլերը +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = կամ կտտացրեք`ուղարկելու համար մինչև { $size } +addPassword = Պաշտպանեք գաղտնաբառով +emailPlaceholder = Մուտքագրեք ձեր էլ. փոստը +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Մուտք գործեք՝ { $size } ուղարկելու համար +signInOnlyButton = Մուտք գործել +accountBenefitTitle = Ստեղծեք { -firefox } հաշիվ կամ մուտք գործեք +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Կիսվեք մինչև { $size } ֆայլերով +accountBenefitDownloadCount = Կիսվեք ֆայլերով ավելի շատ մարդկանց հետ +accountBenefitTimeLimit = + { $count -> + [one] Հղումներն ակտիվ պահել մինչև 1 օր + *[other] Հղումներն ակտիվ պահել մինչև { $count } օր + } +accountBenefitSync = Կառավարեք համօգտագործվող ֆայլերը ցանկացած սարքից +accountBenefitMoz = Իմացեք { -mozilla }-ի այլ ծառայությունների մասին +signOut = Դուրս գրվել +okButton = Լավ +downloadingTitle = Ներբեռնվում է +noStreamsWarning = Այս զննարկիչը չի կարողանա վերծանել այսպիսի մեծ ֆայլը +noStreamsOptionCopy = Պատճենեք հղումը`այլ զննարկիչում բացելու համար +noStreamsOptionFirefox = Փորձեք մեր սիրած զննարկիչը +noStreamsOptionDownload = Շարունակեք այս զննարկիչով +downloadFirefoxPromo = { -send-short-brand }-ը ձեզ է առաջարկում ամբողջովին նոր { -firefox }: +# the next line after the colon contains a file name +shareLinkDescription = Կիսվեք ձեր ֆայլի հղումով. +shareLinkButton = Համօգտագործել հղումը +# $name is the name of the file +shareMessage = Ներբեռնեք “{ $name }”-ը { -send-brand }-ով ՝ պարզ և ապահով՝ ֆայլերի համօգտագործում +trailheadPromo = Ձեր գաղտնիությունը պաշտպանելու միջոց կա: Միացեք Firefox- ին: +learnMore = Իմանալ ավելին diff --git a/public/locales/ia/send.ftl b/public/locales/ia/send.ftl new file mode 100644 index 00000000..45ccff4b --- /dev/null +++ b/public/locales/ia/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Importation… +encryptingFile = Cryptation... +decryptingFile = Decryptation… +downloadCount = + { $num -> + [one] { $num } discargamento + *[other] { $num } discargamentos + } +timespanHours = + { $num -> + [one] { $num } hora + *[other] { $num } horas + } +copiedUrl = Copiate! +unlockInputPlaceholder = Contrasigno +unlockButtonLabel = Disblocar +downloadButtonLabel = Discargar +downloadFinish = Discargamento completate +fileSizeProgress = ({ $partialSize } de { $totalSize }) +sendYourFilesLink = Proba Send +errorPageHeader = Un error occurreva! +fileTooBig = Iste file es troppo grande pro incargar. Illo debe esser inferior a { $size }. +linkExpiredAlt = Ligamine expirate +notSupportedHeader = Tu navigator non es supportate +notSupportedLink = Proque non es mi navigator supportate? +notSupportedOutdatedDetail = Infelicemente iste version de Firefox non supporta le nove technologia web que actiona Send. Tu debe actualisar tu navigator. +updateFirefox = Actualisar Firefox +deletePopupCancel = Cancellar +deleteButtonHover = Deler +passwordTryAgain = Contrasigno incorrecte. Retenta. +javascriptRequired = Send require JavaScript +whyJavascript = Proque Send require JavaScript? +enableJavascript = Por favor activa JavaScript e tenta novemente. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maxime longor del contrasigno: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Iste contrasigno non ha potite esser establite + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Comparti file in maniera confidential +introDescription = { -send-brand } te pone in grado de compartir files con cryptographia bilateral e un ligamine que automaticamente expira. Assi que tu pote mantener private lo que tu comparti e liberar te del anxietate que tu problema resta online per sempre. +notifyUploadEncryptDone = Tu file es cryptate e preste pro esser inviate +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira post { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuta + *[other] { $num } minutas + } +timespanDays = + { $num -> + [one] 1 die + *[other] { $num } dies + } +timespanWeeks = + { $num -> + [one] 1 septimana + *[other] { $num } septimanas + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } files + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Dimension total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copia le ligamine pro compartir le file: +copyLinkButton = Copiar ligamine +downloadTitle = Discargar files +downloadDescription = Iste file era compartite via { -send-brand } con cryptographia bilateral e un ligamine que expira automaticamente. +trySendDescription = Prova { -send-brand } pro le compartimento de file simple e secur. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solmente 1 file pote ser incargate al vice. + *[other] Solmente { $count } files pote esser incargate al vice. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo 1 archivo es permittite. + *[other] Solo { $count } archivos es permitter. + } +expiredTitle = Iste ligamine ha expirate. +notSupportedDescription = { -send-brand } non functionara con iste navigator. { -send-short-brand } functiona melio con le ultime version de { -firefox }, e functionara con le version actual de plure navigatores. +downloadFirefox = Discargar { -firefox } +legalTitle = Aviso de confidentialitate de { -send-short-brand } +legalDateStamp = Version 1.0 del 12 martio 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selige le files a incargar +uploadButton = Incargar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Traher e deponer files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o cliccar pro inviar usque { $size } +addPassword = Proteger per contrasigno +emailPlaceholder = Insere tu adresse de e-mail +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Aperi session pro inviar usque a { $size } +signInOnlyButton = Aperir session +accountBenefitTitle = Crea un conto { -firefox } o registra te +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Comparti files usque { $size } +accountBenefitDownloadCount = Comparti files con plus de personas +accountBenefitTimeLimit = + { $count -> + [one] Retene active le ligamine pro 1 die + *[other] Retene active le ligamine pro { $count } dies + } +accountBenefitSync = Gere files compartite ab non importa qual apparato +accountBenefitMoz = Discoperi altere servicios de { -mozilla } +signOut = Clauder session +okButton = OK +downloadingTitle = Discargamento +noStreamsWarning = Es possibile que iste navigator non pote decryptar un file de iste proportiones. +noStreamsOptionCopy = Copiar le ligamine e aperir lo in un altere navigator +noStreamsOptionFirefox = Prova nostre navigator favorite +noStreamsOptionDownload = Continuar con iste navigator +downloadFirefoxPromo = { -send-short-brand } es portate a te per le novissime { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Condivide le ligamine a tu file: +shareLinkButton = Condivide ligamine +# $name is the name of the file +shareMessage = Discarga “{ $name }” con { -send-brand }: condivide files in modo simple e secur +trailheadPromo = Il ha un via pro proteger tu confidentialitate. Junge te a Firefox! +learnMore = Saper plus. diff --git a/public/locales/id/send.ftl b/public/locales/id/send.ftl index 17e80528..0d806eb9 100644 --- a/public/locales/id/send.ftl +++ b/public/locales/id/send.ftl @@ -1,89 +1,140 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = eksperimen web -siteFeedback = Saran -uploadPageHeader = Pribadi, Berbagi Berkas Terenskripsi -uploadPageExplainer = Kirim berkas melalui tautan yang aman, pribadi, dan terenkripsi yang secara otomatis kedaluwarsa untuk memastikan berkas Anda tidak daring selamanya. -uploadPageLearnMore = Pelajari lebih lanjut -uploadPageDropMessage = Lepas berkas Anda di sini untuk mulai mengunggah -uploadPageSizeMessage = Untuk pengoperasian yang paling andal, sebaiknya jaga berkas Anda di bawah 1GB -uploadPageBrowseButton = Pilih berkas pada komputer Anda -uploadPageBrowseButton1 = Pilih berkas untuk diunggah - .title = Pilih berkas untuk diunggah -uploadPageMultipleFilesAlert = Saat ini belum mendukung pengunggahan beberapa berkas atau folder. -uploadPageBrowseButtonTitle = Unggah berkas -uploadingPageProgress = Mengunggah { $filename } ({ $size }) +title = Send importingFile = Mengimpor… -verifyingFile = Memverifikasi… encryptingFile = Mengenkripsi... decryptingFile = Mendekripsi... -notifyUploadDone = Unggahan Anda telah selesai. -uploadingPageMessage = Setelah berkas diunggah, Anda dapat mengatur pilihan kedaluwarsa. -uploadingPageCancel = Batal unggah -uploadCancelNotification = Unggahan Anda dibatalkan. -uploadingPageLargeFileMessage = Berkas ini berukuran besar dan mungkin perlu beberapa saat untuk mengunggahnya. Silakan tunggu! -uploadingFileNotification = Beri tahu saya ketika unggahan telah selesai. -uploadSuccessConfirmHeader = Siap untuk Dikirim -uploadSvgAlt = Unggah -uploadSuccessTimingHeader = Tautan ke berkas Anda akan berakhir setelah 1 unduhan atau dalam 24 jam. -copyUrlFormLabelWithName = Salin dan bagikan tautan untuk mengirim berkas Anda: { $filename } -copyUrlFormButton = Salin ke papan klip +downloadCount = + { $num -> + *[other] { $num } unduhan + } +timespanHours = + { $num -> + *[other] { $num } jam + } copiedUrl = Tersalin! -deleteFileButton = Hapus berkas -sendAnotherFileLink = Kirim berkas lain -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Unduh -downloadFileName = Unduh { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Masukkan Sandi unlockInputPlaceholder = Sandi -downloadFileTitle = Unduh Berkas Terenkripsi -// Firefox Send is a brand name and should not be localized. -downloadMessage = Teman Anda mengirimkan berkas dengan Firefox Send, layanan yang memungkinkan Anda berbagi berkas dengan tautan yang aman, pribadi, dan terenkripsi yang secara otomatis berakhir untuk memastikan berkas Anda tidak daring selamanya. -// Text and title used on the download link/button (indicates an action). +unlockButtonLabel = Buka downloadButtonLabel = Unduh -downloadNotification = Unduhan Anda telah selesai. downloadFinish = Unduhan Selesai -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } dari { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Coba Firefox Send -downloadingPageProgress = Mengunduh { $filename } ({ $size }) -downloadingPageMessage = Sila biarkan tab ini terbuka sementara kami memproses berkas Anda dan mendekripsinya. -errorAltText = Unggahan bermasalah +sendYourFilesLink = Coba Send errorPageHeader = Terjadi kesalahan! -errorPageMessage = Terjadi kesalahan saat mengunggah berkas. -errorPageLink = Kirim berkas lain fileTooBig = Berkas terlalu besar untuk diunggah. Harus kurang dari { $size }. linkExpiredAlt = Tautan kedaluwarsa -expiredPageHeader = Tautan ini telah kedaluwarsa atau tidak pernah ada! notSupportedHeader = Peramban Anda tidak mendukung. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Sayangnya peramban ini tidak mendukung teknologi web yang menggerakkan Firefox Send. Anda perlu mencoba peramban lain. Kami merekomendasikan Firefox! notSupportedLink = Mengapa peramban saya tidak didukung? -notSupportedOutdatedDetail = Sayangnya Firefox versi ini tidak mendukung teknologi web yang menggerakkan Firefox Send. Anda perlu memperbarui peramban Anda. +notSupportedOutdatedDetail = Sayangnya Firefox versi ini tidak mendukung teknologi web yang menggerakkan Send. Anda perlu memperbarui peramban Anda. updateFirefox = Perbarui Firefox -downloadFirefoxButtonSub = Unduh Gratis -uploadedFile = Berkas -copyFileList = Salin URL -// expiryFileList is used as a column header -expiryFileList = Kedaluwarsa Pada -deleteFileList = Hapus -nevermindButton = Abaikan -legalHeader = Syarat & Privasi -legalNoticeTestPilot = Saat ini Firefox Send merupakan eksperimen Test Pilot, dan merupakan subyek dari Ketentuan Layanan dan Pemberitahuan Privasi Test Pilot. Anda dapat mempelajari lebih lanjut tentang eksperimen ini dan pengumpulan datanya di sini. -legalNoticeMozilla = Penggunaan situs Firefox Send juga merupakan subyek dari Pemberitahuan Privasi Situs Web dan Persyaratan Penggunaan Situs Web Mozilla. -deletePopupText = Hapus berkas ini? -deletePopupYes = Ya deletePopupCancel = Batal deleteButtonHover = Hapus -copyUrlHover = Salin URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Tentang Test Pilot -footerLinkPrivacy = Privasi -footerLinkTerms = Ketentuan -footerLinkCookies = Kuki -requirePasswordCheckbox = Membutuhkan sandi untuk mengunduh berkas ini -addPasswordButton = Tambahkan Sandi -incorrectPassword = Sandi salah. Coba lagi? +passwordTryAgain = Sandi salah. Silakan coba lagi. +javascriptRequired = Send membutuhkan JavaScript. +whyJavascript = Mengapa Send membutuhkan JavaScript? +enableJavascript = Silakan aktifkan JavaScript dan coba lagi. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }j { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Panjang sandi maksimal: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Tidak bisa menyetel sandi ini + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Berbagi berkas dengan mudah dan privat +introDescription = { -send-brand } mudahkan Anda membagikan berkas dengan enkripsi ujung-ke-ujung dan tautan yang otomatis kadaluarsa. Sehingga Anda dapat menjaga apa yang Anda bagikan secara privat dan memastikan barang Anda tidak selamanya ada di daring. +notifyUploadEncryptDone = Berkas Anda terenkripsi dan siap untuk dikirim +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Berakhir setelah { $downloadCount } atau { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } menit + } +timespanDays = + { $num -> + *[other] { $num } hari + } +timespanWeeks = + { $num -> + *[other] { $num } pekan + } +fileCount = + { $num -> + *[other] { $num } berkas + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total ukuran: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Salin tautan untuk membagikan berkas Anda: +copyLinkButton = Salin tautan +downloadTitle = Unduh berkas +downloadDescription = Berkas ini dibagikan lewat { -send-brand } dengan enkripsi ujung-ke-ujung dan tautan yang otomatis kadaluarsa. +trySendDescription = Coba { -send-brand } untuk berbagi berkas dengan mudah dan aman. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] Hanya { $count } berkas dapat diunggah dalam sekali waktu. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] Hanya { $count } arsip diperbolehkan. + } +expiredTitle = Tautan ini telah kadaluarsa. +notSupportedDescription = { -send-brand } tidak dapat digunakan dengan peramban ini. { -send-short-brand } bekerja maksimal dengan versi terbaru { -firefox }, dan akan bekerja dengan versi terkini mayoritas peramban. +downloadFirefox = Unduh { -firefox } +legalTitle = Pemberitahuan Privasi { -send-short-brand } +legalDateStamp = Versi 1.0, tertanggal 12 Maret 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }h { $hours }j { $minutes }m +addFilesButton = Pilih berkas untuk diunggah +uploadButton = Unggah +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Seret dan jatuhkan berkas +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = atau klik untuk mengirim hingga { $size } +addPassword = Lindungi dengan kata sandi +emailPlaceholder = Masukkan surel Anda +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Masuk untuk dapat mengirim hingga { $size } +signInOnlyButton = Masuk +accountBenefitTitle = Buat { -firefox } Account atau masuk +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bagikan berkas hingga { $size } +accountBenefitDownloadCount = Bagikan berkas kepada lebih banyak orang +accountBenefitTimeLimit = + { $count -> + *[other] Buat tautan aktif selama { $count } hari + } +accountBenefitSync = Kelola berkas yang dibagikan dari perangkat apa pun +accountBenefitMoz = Pelajari tentang layanan { -mozilla } lainnya +signOut = Keluar +okButton = Oke +downloadingTitle = Mengunduh +noStreamsWarning = Peramban ini mungkin tidak dapat mendekripsi berkas sebesar ini. +noStreamsOptionCopy = Salin tautan untuk dibuka di peramban lainnya +noStreamsOptionFirefox = Coba peramban favorit kami +noStreamsOptionDownload = Lanjutkan dengan peramban ini +downloadFirefoxPromo = { -send-short-brand } dipersembahkan untuk Anda oleh { -firefox } terbaru. +# the next line after the colon contains a file name +shareLinkDescription = Bagikan tautan ke berkas Anda: +shareLinkButton = Bagikan tautan +# $name is the name of the file +shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman +trailheadPromo = Ada cara untuk melindungi privasi Anda. Bergabunglah dengan Firefox. +learnMore = Pelajari lebih lanjut. diff --git a/public/locales/ig/send.ftl b/public/locales/ig/send.ftl new file mode 100644 index 00000000..c81e2e34 --- /dev/null +++ b/public/locales/ig/send.ftl @@ -0,0 +1,88 @@ +title = Zipu +importingFile = Mbubata… +encryptingFile = ezoro ezo... +decryptingFile = Kpebie +downloadCount = + { $num -> + [one] ụbọchị { $num } + *[other] Abuọ + } +timespanHours = + { $num -> + [one] { $num } otu + *[other] { $num } abụọ + } +copiedUrl = edepụtachaghiri +unlockInputPlaceholder = okwuntughe +unlockButtonLabel = imeghe +downloadButtonLabel = budata +downloadFinish = Mbudata zuru ezu +fileSizeProgress = ({ $partialSize } nke { $totalSize }) +sendYourFilesLink = Zipu +errorPageHeader = Onwere ihe na-adighi mma +fileTooBig = Failu a ebuka ibulite. Ọ kwẹsịghi ịkalị { $size } +linkExpiredAlt = Njiko jedebe +notSupportedHeader = Adighi akwado ihe nchogharị gị +notSupportedLink = Gịnị kpatara na akwadoghị ihe nchọgharị m? +notSupportedOutdatedDetail = Ọ dị nwute na ụdị Firefox a anaghị akwado teknụzụ weebụ na-eji Zipụ. Ikwesiri imelite ihe nchọgharị gị. +updateFirefox = Melite Firefox +deletePopupCancel = Kagbuo +deleteButtonHover = Hichapụ +passwordTryAgain = okwuntughe ezighi ezi.Nwaa ọzọ +javascriptRequired = Zipu chọrọ +whyJavascript = Kedu ihe kpatara Zipu jiri chọ JavaScript? +enableJavascript = Biko họrọ JavaScript ma nwaa ọzọ +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Oke okwuntughe kachasị: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Enweghị ike ịtọ paswọọdụ a + +## Send version 2 strings + +-send-brand = Zipu +-send-short-brand = Zipu, Ziga +-firefox = Firefox +-mozilla = Mozilla +introTitle = Mfe, nkekọrịta faịlụ nkeonwe +introDescription = na-ahapu gị ịkekọrịta faịlụ na izo ya na njedebe na njedebe na-akwụsị na akpaghị aka. Yabụ ị nwere ike idobe ihe ị na -eche ma hụ na ngwongwo gị agaghị adị n'ịntanetị ruo mgbe ebighi ebi. +notifyUploadEncryptDone = Failu gi zoro ezo ma di njikere iziga +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ọ ga-agwu mgbe { $downloadCount } ma ọ bụ { $timespan } gasịrị +timespanDays = + { $num -> + [one] 1 ụbọchị + *[other] ụbọchị { $num } + } +timespanWeeks = + { $num -> + [one] 1 izu + *[other] izu { $num } + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $Number } { $nkeji } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = { $nha } +# the next line after the colon contains a file name +copyLinkDescription = Detuo njikọ ahụ iji kee faịlụ gị +copyLinkButton = Detuo njikọ +downloadTitle = Budata faịlụ gasi +downloadDescription = Nkekọrịta faịlụ a site na site na iji zoo njedebe na-njedebe yana otu njikọ na-akwụsị na-akpaghị aka. +trySendDescription = Gbalịa maka nyefe faịlụ dị mfe. +expiredTitle = Njikọ a emebiela. +notSupportedDescription = agaghị eji ihe nchọgharị a rụọ ọrụ. na arụ ọrụ kacha mma na ụdị nke , ọ ga-arụkwa ụdị nke ihe nchọgharị ka ugbu a. +downloadFirefox = Budata +legalTitle = Nkwupụta Nzuzo +legalDateStamp = 1.dị 1.0, akara ụbọchị Maachi 12, 2019 +okButton = O diff --git a/public/locales/it/send.ftl b/public/locales/it/send.ftl index 3e7b7207..253744a1 100644 --- a/public/locales/it/send.ftl +++ b/public/locales/it/send.ftl @@ -1,91 +1,141 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = un esperimento web -siteFeedback = Feedback -uploadPageHeader = Condivisione di file riservata e crittata -uploadPageExplainer = Invia file in modo sicuro, riservato e crittato, con un link che scade automaticamente per garantire che i tuoi dati non rimangano online per sempre. -uploadPageLearnMore = Ulteriori informazioni -uploadPageDropMessage = Trascina qui un file per caricarlo -uploadPageSizeMessage = Per evitare problemi è consigliabile caricare file di dimensione inferiore a 1 GB -uploadPageBrowseButton = Seleziona un file sul computer -uploadPageBrowseButton1 = Seleziona un file da caricare -uploadPageMultipleFilesAlert = Il caricamento di più file o cartelle non è attualmente supportato. -uploadPageBrowseButtonTitle = Carica file -uploadingPageProgress = Caricamento { $filename } ({ $size }) +title = Send importingFile = Importazione in corso… -verifyingFile = Verifica in corso… encryptingFile = Crittazione in corso… decryptingFile = Decrittazione in corso… -notifyUploadDone = Caricamento completato. -uploadingPageMessage = È possibile impostare le opzioni di scadenza del file al termine del caricamento. -uploadingPageCancel = Annulla caricamento -uploadCancelNotification = Caricamento annullato. -uploadingPageLargeFileMessage = Si tratta di un file di grandi dimensioni e potrebbe richiedere un po' di tempo. -uploadingFileNotification = Invia una notifica quando il caricamento è completato. -uploadSuccessConfirmHeader = Pronto per l’invio -uploadSvgAlt = Carica -uploadSuccessTimingHeader = Il link al file scadrà dopo 1 download o in 24 ore. -copyUrlFormLabelWithName = Copia e condividi il link per inviare il tuo file: { $filename } -copyUrlFormButton = Copia negli appunti +downloadCount = + { $num -> + [one] 1 download + *[other] { $num } download + } +timespanHours = + { $num -> + [one] 1 ora + *[other] { $num } ore + } copiedUrl = Copiato -deleteFileButton = Elimina file -sendAnotherFileLink = Invia un altro file -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Scarica -downloadFileName = Scarica { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Inserire la password unlockInputPlaceholder = Password unlockButtonLabel = Sblocca -downloadFileTitle = Scarica il file crittato -// Firefox Send is a brand name and should not be localized. -downloadMessage = Qualcuno ha utilizzato Firefox Send per inviarti un file. Si tratta di un servizio che permette di condividere file in modo sicuro, riservato e crittato, utilizzando un link che smette di funzionare automaticamente dopo un certo periodo di tempo, garantendo così che i tuoi dati non rimangano online per sempre. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Scarica -downloadNotification = Download completato. downloadFinish = Download completato -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } di { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prova Firefox Send -downloadingPageProgress = Download in corso di { $filename } ({ $size }) -downloadingPageMessage = Mantieni aperta questa scheda mentre il file viene scaricato e decrittato. -errorAltText = Errore durante il caricamento +sendYourFilesLink = Prova Send errorPageHeader = Si è verificato un errore. -errorPageMessage = Si è verificato un errore durante il caricamento del file. -errorPageLink = Invia un altro file fileTooBig = Le dimensioni di questo file sono eccessive. Dovrebbe essere inferiore a { $size }. linkExpiredAlt = Link scaduto -expiredPageHeader = Questo link è scaduto oppure non è mai esistito. notSupportedHeader = Il browser in uso non è supportato. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Purtroppo questo browser non supporta le tecnologie web alla base di Firefox Send. Devi utilizzare un altro browser. Ti consigliamo Firefox! notSupportedLink = Perché questo browser non risulta supportato? -notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Firefox Send. È necessario aggiornare il browser. +notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Send. È necessario aggiornare il browser. updateFirefox = Aggiorna Firefox -downloadFirefoxButtonSub = Download gratuito -uploadedFile = File -copyFileList = Copia indirizzo -// expiryFileList is used as a column header -expiryFileList = Scade in -deleteFileList = Elimina -nevermindButton = No, grazie -legalHeader = Termini di utilizzo e privacy -legalNoticeTestPilot = Firefox Send è attualmente un esperimento di Test Pilot ed è soggetto alle Condizioni di utilizzo e all’Informativa sulla privacy di Test Pilot. Per ulteriori informazioni su questo esperimento e i dati raccolti, consulta questa pagina. -legalNoticeMozilla = L’utilizzo del sito di Firefox Send è soggetto all’Informativa sulla privacy e le Condizioni di utilizzo dei siti web Mozilla. -deletePopupText = Eliminare questo file? -deletePopupYes = Sì deletePopupCancel = Annulla deleteButtonHover = Elimina -copyUrlHover = Copia indirizzo -footerLinkLegal = Note legali -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Informazioni su Test Pilot -footerLinkPrivacy = Privacy -footerLinkTerms = Condizioni di utilizzo -footerLinkCookies = Cookie -requirePasswordCheckbox = Richiedi una password per poter scaricare questo file -addPasswordButton = Aggiungi password passwordTryAgain = Password errata, riprovare. -// This label is followed by the password needed to download a file -passwordResult = Password: { $password } +javascriptRequired = Send richiede JavaScript +whyJavascript = Perché Send richiede JavaScript? +enableJavascript = Attiva JavaScript e riprova. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Lunghezza massima della password: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Impossibile impostare la password + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Condividi file in modo semplice e riservato +introDescription = { -send-brand } permette di condividere file con crittografia end-to-end attraverso un link che scade automaticamente. In questo modo hai la garanzia che i tuoi contenuti vengano condivisi in modo riservato e non rimangano online per sempre. +notifyUploadEncryptDone = Il file è crittato e pronto per l’invio +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Scade dopo { $downloadCount } o tra { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minuti + } +timespanDays = + { $num -> + [one] 1 giorno + *[other] { $num } giorni + } +timespanWeeks = + { $num -> + [one] 1 settimana + *[other] { $num } settimane + } +fileCount = { $num } file +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Dimensione totale: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copia il link per condividere il file: +copyLinkButton = Copia link +downloadTitle = Scarica file +downloadDescription = Questo file è stato condiviso tramite { -send-brand } con crittografia end-to-end e un link che scade automaticamente. +trySendDescription = Prova { -send-brand } per condividere file in modo semplice e sicuro. +# count will always be > 10 +tooManyFiles = È possibile caricare solo { $count } file alla volta. +# count will always be > 10 +tooManyArchives = + { $count -> + [one] È consentito solo un archivio. + *[other] Sono consentiti solo { $count } archivi. + } +expiredTitle = Questo link è scaduto. +notSupportedDescription = Non è possibile utilizzare { -send-brand } con questo browser. { -send-short-brand } funziona al meglio con l’ultima versione di { -firefox } ma è compatibile con l’ultima versione della maggior parte dei browser. +downloadFirefox = Scarica { -firefox } +legalTitle = Informativa sulla privacy di { -send-short-brand } +legalDateStamp = Versione 1.0 del 12 marzo 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }g { $hours }h { $minutes }m +addFilesButton = Seleziona i file da caricare +uploadButton = Carica +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Trascina e rilascia i file +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o fai clic per inviare fino a { $size } +addPassword = Proteggi con una password +emailPlaceholder = Inserisci il tuo indirizzo email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Accedi per inviare fino a { $size } +signInOnlyButton = Accedi +accountBenefitTitle = Crea un account { -firefox } o accedi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Condividi file fino a { $size } +accountBenefitDownloadCount = Condividi file con più persone +accountBenefitTimeLimit = + { $count -> + [one] Mantieni link attivi per 1 giorno + *[other] Mantieni link attivi per { $count } giorni + } +accountBenefitSync = Gestisci i file condivisi da qualsiasi dispositivo +accountBenefitMoz = Scopri altri servizi { -mozilla } +signOut = Disconnetti +okButton = OK +downloadingTitle = Download in corso… +noStreamsWarning = Questo browser potrebbe non essere in grado di decrittare un file così grande. +noStreamsOptionCopy = Copia il link e aprilo in un altro browser +noStreamsOptionFirefox = Prova il nostro browser preferito +noStreamsOptionDownload = Continua con questo browser +downloadFirefoxPromo = { -send-short-brand } è offerto dal nuovissimo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Condividi il link al tuo file: +shareLinkButton = Condividi link +# $name is the name of the file +shareMessage = Scarica “{ $name }” con { -send-brand }: condivisione di file semplice e sicura +trailheadPromo = C’è un modo per proteggere la tua privacy. Entra in Firefox. +learnMore = Ulteriori informazioni. diff --git a/public/locales/ixl/send.ftl b/public/locales/ixl/send.ftl new file mode 100644 index 00000000..a1ca3531 --- /dev/null +++ b/public/locales/ixl/send.ftl @@ -0,0 +1,53 @@ +title = Send +importingFile = Eq'otzan +encryptingFile = La muj isik'lele +decryptingFile = Ni jaj ve't isik'lele' +downloadCount = + { $num -> + [one] Eq'omal ku'tzan + *[other] { $num } Eq'omalaj ku'tzan + } +timespanHours = + { $num -> + [one] 1 Ch'ich' + *[other] { $num } Nimalaj ch'ich' + } +copiedUrl = Eesamal ivatz! +unlockInputPlaceholder = Kach'ub'al +unlockButtonLabel = Eesa ikach'ub'al +downloadButtonLabel = Eq'o ku'tzan +downloadFinish = Eq'o ku'tzan kaajayil +fileSizeProgress = ({ $partialSize }tetz{ $totalSize }) +sendYourFilesLink = B'anb'e ve't u Send +errorPageHeader = At ma'l kam valexh kat eli! +notSupportedHeader = U chukb'al aq'one' ye' ni toleb'e'. +notSupportedLink = Kam q'ii uve' ye' kuxh ni toleb' u chukb'al vaq'one'? +updateFirefox = Tz'ajsa tatine' Firefox +deletePopupCancel = Ya'samal +deleteButtonHover = Sojsa +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Aq'b'en +-firefox = Firefox +-mozilla = Mozilla +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +emailPlaceholder = Aq'ku' a correo +shareLinkButton = La jatxb'en u vaa' +learnMore = Ootzi ka'te. diff --git a/public/locales/ja/send.ftl b/public/locales/ja/send.ftl index e033a8c7..b42ac167 100644 --- a/public/locales/ja/send.ftl +++ b/public/locales/ja/send.ftl @@ -1,91 +1,140 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ウェブ実験 -siteFeedback = フィードバック -uploadPageHeader = プライベートな暗号化されたファイル共有 -uploadPageExplainer = 安全で、プライベートで、暗号化されたリンクを通じてファイルを送信。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。 -uploadPageLearnMore = 詳しくはこちら -uploadPageDropMessage = ここにファイルをドロップしてアップロードを開始 -uploadPageSizeMessage = 確実に処理できるよう、ファイルサイズは 1 GB 以下にすることを推奨します。 -uploadPageBrowseButton = コンピューター上のファイルを選択 -uploadPageBrowseButton1 = アップロードするファイルを選択 -uploadPageMultipleFilesAlert = 今のところ複数ファイルやフォルダーのアップロードには対応していません。 -uploadPageBrowseButtonTitle = ファイルをアップロード -uploadingPageProgress = { $filename } ({ $size }) をアップロード中 +title = Send importingFile = インポート中... -verifyingFile = 検証中... encryptingFile = 暗号化中... decryptingFile = 復号化中... -notifyUploadDone = アップロードが完了しました。 -uploadingPageMessage = ファイルのアップロード完了後に期限を設定できます。 -uploadingPageCancel = アップロードを中止 -uploadCancelNotification = アップロードは中止されました。 -uploadingPageLargeFileMessage = このファイルは大きいのでアップロードに多少時間が掛かるかもしれません。しばらくお待ちください。 -uploadingFileNotification = アップロード完了時に通知を受け取る -uploadSuccessConfirmHeader = 送信準備完了 -uploadSvgAlt = アップロード -uploadSuccessTimingHeader = ファイルへのリンクは、1 回ダウンロードされた後、もしくは 24 時間以内に期限切れとなります。 -copyUrlFormLabelWithName = ファイルを送信するにはこのリンクをコピー、共有してください: { $filename } -copyUrlFormButton = クリップボードへコピー +downloadCount = + { $num -> + *[other] { $num } 回のダウンロード + } +timespanHours = + { $num -> + *[other] { $num } 時間 + } copiedUrl = コピー完了! -deleteFileButton = ファイルを削除 -sendAnotherFileLink = 他のファイルを送信 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = ダウンロード -downloadFileName = { $filename } をダウンロード -downloadFileSize = ({ $size }) -unlockInputLabel = パスワードを入力 unlockInputPlaceholder = パスワード unlockButtonLabel = ロック解除 -downloadFileTitle = 暗号化されたファイルをダウンロード -// Firefox Send is a brand name and should not be localized. -downloadMessage = あなたの友人が Firefox Send を通じてファイルを送ってきています。これは、安全で、プライベートで、暗号化されたリンクを通じてファイルを共有できるサービスです。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。 -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = ダウンロード -downloadNotification = ダウンロードが完了しました。 downloadFinish = ダウンロード完了 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send を試す -downloadingPageProgress = { $filename } ({ $size }) をダウンロードしています -downloadingPageMessage = ファイルの取得と復号化が完了するまでこのタブを開いたままにしておいてください。 -errorAltText = アップロードエラー +sendYourFilesLink = Send を試す errorPageHeader = 何か問題が発生しました。 -errorPageMessage = ファイルのアップロード中に問題が発生しました。 -errorPageLink = 他のファイルを送信 fileTooBig = このファイルは大きすぎるためアップロードできません。上限は { $size } です。 linkExpiredAlt = リンク期限切れ -expiredPageHeader = このリンクは期限切れとなったか元々存在していません。 notSupportedHeader = お使いのブラウザーには対応していません。 -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 残念ながらお使いのブラウザーは Firefox Send が活用しているウェブ技術に対応していません。他のブラウザーで試してください。私たちは Firefox をお勧めします! -notSupportedLink = なぜ私のブラウザには対応していないのでしょうか? -notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Firefox Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。 +notSupportedLink = なぜ私のブラウザーには対応していないのでしょうか? +notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。 updateFirefox = Firefox を更新 -downloadFirefoxButtonSub = 無料ダウンロード -uploadedFile = ファイル -copyFileList = URL をコピー -// expiryFileList is used as a column header -expiryFileList = 有効期限: -deleteFileList = 削除 -nevermindButton = 気にしないでください -legalHeader = 利用規約とプライバシー -legalNoticeTestPilot = Firefox Send は今のところ Test Pilot 実験のひとつであり、Test Pilot 利用規約プライバシー通知 が適用されます。この実験とそのデータ収集に関する詳細は こちら をご覧ください。 -legalNoticeMozilla = Firefox Send のサイトの利用には、Mozilla の ウェブサイトプライバシー通知ウェブサイト利用規約 も適用されます。 -deletePopupText = このファイルを削除しますか? -deletePopupYes = はい deletePopupCancel = キャンセル deleteButtonHover = 削除 -copyUrlHover = URL をコピー -footerLinkLegal = 法的情報 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot について -footerLinkPrivacy = プライバシー -footerLinkTerms = 利用規約 -footerLinkCookies = Cookie -requirePasswordCheckbox = このファイルをダウンロードするにはパスワードが必要です -addPasswordButton = パスワードを追加 passwordTryAgain = パスワードが正しくありません。再度入力してください。 -// This label is followed by the password needed to download a file -passwordResult = パスワード: { $password } +javascriptRequired = Send を使うには JavaScript が必要です +whyJavascript = Send が JavaScript を必要とする理由 +enableJavascript = JavaScript を有効にして再度試してください。 +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } 時間 { $minutes } 分 +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } 分 +# A short status message shown when the user enters a long password +maxPasswordLength = パスワード最長文字数: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = このパスワードは設定できませんでした + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = 簡単に、プライベートにファイル共有 +introDescription = { -send-brand } では、暗号化してファイル共有でき、リンクは自動的に期限切れになります。そのため、共有するものをプライベートに保管でき、オンライン上に永遠に残さないようにできます。 +notifyUploadEncryptDone = ファイルが暗号化され、送信する準備ができました +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = 有効期間: { $downloadCount } または { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } 分 + } +timespanDays = + { $num -> + *[other] { $num } 日 + } +timespanWeeks = + { $num -> + *[other] { $num } 週間 + } +fileCount = + { $num -> + *[other] { $num } ファイル + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 合計サイズ: { $size } +# the next line after the colon contains a file name +copyLinkDescription = リンクをコピーしてファイルを共有: +copyLinkButton = リンクをコピー +downloadTitle = ファイルをダウンロード +downloadDescription = このファイルは { -send-brand } により、暗号化されて共有されました。リンクは自動的に期限切れになります。 +trySendDescription = 簡単で安全なファイル共有ができる { -send-brand } を試してください。 +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] 一度にアップロードできるのは { $count } ファイルまでです。 + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] { $count } 回までしかダウンロードできません。 + } +expiredTitle = このリンクは期限切れです。 +notSupportedDescription = { -send-brand } は、このブラウザーでは動作しません。{ -send-short-brand } は最新バージョンの { -firefox } で最もよく動作し、その他の現バージョンのブラウザーでも動作します。 +downloadFirefox = { -firefox } をダウンロード +legalTitle = { -send-short-brand } プライバシー通知 +legalDateStamp = バージョン 1.0, 2019年3月12日時点 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } 日 { $hours } 時 { $minutes } 分 +addFilesButton = アップロードするファイルを選択 +uploadButton = アップロード +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ファイルをドラッグ&ドロップ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = または、クリックして最大 { $size } のファイルを送信 +addPassword = パスワードで保護 +emailPlaceholder = メールアドレスを入力 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = ログインすると最大 { $size } のファイルを送信できます +signInOnlyButton = ログイン +accountBenefitTitle = { -firefox } アカウントを作成またはログイン +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = 最大 { $size } までのファイルを共有 +accountBenefitDownloadCount = より多くの人とファイルを共有 +accountBenefitTimeLimit = + { $count -> + *[other] リンクを { $count } 日間有効化 + } +accountBenefitSync = 様々な端末から共有したファイルを管理 +accountBenefitMoz = { -mozilla } の他のサービスについて詳しく学ぶ +signOut = ログアウト +okButton = OK +downloadingTitle = ダウンロード中 +noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。 +noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください +noStreamsOptionFirefox = Firefox を試してみる +noStreamsOptionDownload = このブラウザーで続ける +downloadFirefoxPromo = { -send-short-brand } はすべてが新しくなった { -firefox } により提供されています。 +# the next line after the colon contains a file name +shareLinkDescription = ファイルへのリンクを共有しましょう: +shareLinkButton = リンクを共有 +# $name is the name of the file +shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有 +trailheadPromo = プライバシーを保護する方法があります。Firefox を試してください。 +learnMore = 詳細情報 diff --git a/public/locales/ka/send.ftl b/public/locales/ka/send.ftl index 2e0d5e2b..6aac9d6d 100644 --- a/public/locales/ka/send.ftl +++ b/public/locales/ka/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = საცდელი -siteFeedback = გამოხმაურება -uploadPageHeader = ფაილების უსაფრთხო, დაშიფრული გაზიარება -uploadPageExplainer = გააგზავნეთ ფაილები უსაფრთხოდ, დაფარულად და დაშიფრულად ბმულის საშუალებით, წინასწარ განსაზღვრული ვადით, რაც საწინდარია იმის, რომ თქვენი კუთვნილი მასალა, არ დარჩება ინტერნეტში სამუდამოდ. -uploadPageLearnMore = ვრცლად -uploadPageDropMessage = გადმოიტანეთ ფაილი აქ, ასატვირთად -uploadPageSizeMessage = ყველაზე საიმედო მომსახურება, შეგიძლიათ ატვირთოთ არაუმეტეს 1GB ზომის ფაილი -uploadPageBrowseButton = ფაილის არჩევა კომპიუტერიდან -uploadPageBrowseButton1 = ფაილის არჩევა ასატვირთად -uploadPageMultipleFilesAlert = ერთდროულად რამდენიმე ფაილის, ან საქაღალდის ატვირთვა, ამჟამად არაა ხელმისაწვდომი. -uploadPageBrowseButtonTitle = ფაილის ატვირთვა -uploadingPageProgress = მიმდინარეობს ატვირთვა { $filename } ({ $size }) +title = Send importingFile = გადმოტანა... -verifyingFile = დამოწმება... encryptingFile = დაშიფვრა... decryptingFile = გაშიფვრა... -notifyUploadDone = ფაილის ატვირთვა დასრულებულია. -uploadingPageMessage = ფაილის ატვირთვის შემდეგ, შეგიძლიათ მიუთითოთ შენახვის ვადა. -uploadingPageCancel = ატვირთვის გაუქმება -uploadCancelNotification = ფაილის ატვირთვა გაუქმებულია. -uploadingPageLargeFileMessage = ფაილი დიდია და ატვირთვამ შესაძლოა დიდხანს გასტანოს. ასე რომ, მოკალათდით! -uploadingFileNotification = შეტყობინება, ატვირთვის დასრულებისას. -uploadSuccessConfirmHeader = მზადაა გასაგზავნად -uploadSvgAlt = ატვირთვა -uploadSuccessTimingHeader = ფაილს ვადა გაუვა 1 ჩამოტვირთვის, ან 24 საათის მერე. -copyUrlFormLabelWithName = დააკოპირეთ და გააზიარეთ ბმული, ფაილის გასაგზავნად: { $filename } -copyUrlFormButton = დაკოპირება -copiedUrl = დაკოპირდა! -deleteFileButton = ფაილის წაშლა -sendAnotherFileLink = სხვა ფაილის გაგზავნა -// Alternative text used on the download link/button (indicates an action). -downloadAltText = ჩამოტვირთვა -downloadFileName = { $filename } ჩამოტვირთვა -downloadFileSize = ({ $size }) -unlockInputLabel = შეიყვანეთ პაროლი +downloadCount = + { $num -> + [one] 1 ჩამოტვირთვა + *[other] { $num } ჩამოტვირთვა + } +timespanHours = + { $num -> + [one] 1 საათი + *[other] { $num } საათი + } +copiedUrl = ასლი აღებულია! unlockInputPlaceholder = პაროლი unlockButtonLabel = გახსნა -downloadFileTitle = დაშიფრული ფაილის ჩამოტვირთვა -// Firefox Send is a brand name and should not be localized. -downloadMessage = თქვენი მეგობარი გიგზავნით ფაილს Firefox Send მომსახურების მეშვეობით, რომლითაც შეგიძლიათ ფაილების უსაფრთხოდ, დაფარულად და დაშიფრულად გაზიარება ბმულის საშუალებით, წინასწარ განსაზღვრული ვადით, რაც საწინდარია იმის, რომ თქვენი კუთვნილი მასალა, არ დარჩება ინტერნეტში სამუდამოდ. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = ჩამოტვირთვა -downloadNotification = თქვენი ჩამოტვირთვა დასრულებულია. downloadFinish = ჩამოტვირთვა დასრულდა -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } { $totalSize }-იდან) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = გამოცადეთ Firefox Send -downloadingPageProgress = მიმდინარეობს ჩამოტვირთვა { $filename } ({ $size }) -downloadingPageMessage = გთხოვთ დატოვოთ ეს ჩანართი გახსნილი, სანამ ფაილი ჩამოიტვირთება და გაიშიფრება. -errorAltText = შეცდომა ატვირთვისას +sendYourFilesLink = გამოცადეთ Send errorPageHeader = რაღაც ხარვეზია! -errorPageMessage = ფაილის ატვირთვისას წარმოიშვა შეცდომა. -errorPageLink = სხვა ფაილის გაგზავნა fileTooBig = ფაილი ზედმეტად დიდია. უნდა იყოს { $size } ზომაზე ნაკლები. linkExpiredAlt = ბმული ვადაგასულია -expiredPageHeader = ბმული ან ვადაგასულია, ან არ არსებობს! notSupportedHeader = თქვენი ბრაუზერი არაა მხარდაჭერილი. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = სამწუხაროდ, ამ ბრაუზერს არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ სხვა ბრაუზერი. ჩვენ შეგვიძლია გირჩიოთ Firefox! notSupportedLink = რატომ არაა ჩემი ბრაუზერი მხარდაჭერილი? -notSupportedOutdatedDetail = სამწუხაროდ, Firefox-ის ამ ვერსიას არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ, ბრაუზერის განახლება. +notSupportedOutdatedDetail = სამწუხაროდ, Firefox-ის ამ ვერსიას არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Send-ის მუშაობისთვის. გესაჭიროებათ, ბრაუზერის განახლება. updateFirefox = Firefox-ის განახლება -downloadFirefoxButtonSub = უფასო ჩამოტვირთვა -uploadedFile = ფაილი -copyFileList = URL ბმულის დაკოპირება -// expiryFileList is used as a column header -expiryFileList = ვადის გასვლის დრო -deleteFileList = წაშლა -nevermindButton = არ აქვს მნიშვნელობა -legalHeader = პირობები და პირადულობა -legalNoticeTestPilot = Firefox Send ამჟამად Test Pilot-ის საცდელი პროექტია და ექვემდებარება Test Pilot-ის მომსახურების პირობებსა და პირადი მონაცემების დაცვის დებულებას. ვრცლად, ამ საცდელი პროექტისა და მონაცემების აღრიცხვის შესახებ, შეგიძლიათ იხილოთ აქ. -legalNoticeMozilla = Firefox Send ვებსაიტი, ასევე ექვემდებარება Mozilla-ს ვებსაიტების პირადი მონაცემების შესახებ დებულებას და ვებსაიტების გამოყენების პირობებს. -deletePopupText = გსურთ ამ ფაილის წაშლა? -deletePopupYes = დიახ deletePopupCancel = გაუქმება deleteButtonHover = წაშლა -copyUrlHover = URL-ს დაკოპირება -footerLinkLegal = იურიდიული ინფორმაცია -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot-ის შესახებ -footerLinkPrivacy = პირადულობა -footerLinkTerms = პირობები -footerLinkCookies = ფუნთუშები -requirePasswordCheckbox = პაროლის მოთხოვნა, ფაილის ჩამოტვირთვისას -addPasswordButton = პაროლის დამატება passwordTryAgain = პაროლი არასწორია. სცადეთ ხელახლა. -// This label is followed by the password needed to download a file -passwordResult = პაროლი: { $password } +javascriptRequired = Send საჭიროებს JavaScript-ს +whyJavascript = რატომ საჭიროებს Send JavaScript-ს? +enableJavascript = გთხოვთ ჩართოთ JavaScript და სცადოთ ხელახლა. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }სთ { $minutes }წთ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }წთ +# A short status message shown when the user enters a long password +maxPasswordLength = პაროლის დაშვებული ზომა: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ამ პაროლის დაყენება ვერ ხერხდება + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = ფაილის გაზიარება მარტივად, დაცულად +introDescription = { -send-brand } საშუალებას გაძლევთ გააზიაროთ ფაილები გამჭოლი დაშიფვრითა და ბმულით, რომელიც გარკვეული დროის შემდეგ თავისთავად გაუქმდება. ასე რომ, რასაც გააზიარებთ იქნება საიდუმლო და არც ინტერნეტში არ დარჩება სამუდამოდ. +notifyUploadEncryptDone = თქვენი ფაილი დაშიფრულია და მზადაა გასაგზავნად +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = ვადის გასვლამდე დარჩენილია { $downloadCount } ან { $timespan } +timespanMinutes = + { $num -> + [one] 1 წუთი + *[other] { $num } წუთი + } +timespanDays = + { $num -> + [one] 1 დღე + *[other] { $num } დღე + } +timespanWeeks = + { $num -> + [one] 1 კვირა + *[other] { $num } კვირა + } +fileCount = + { $num -> + [one] 1 ფაილი + *[other] { $num } ფაილი + } +# byte abbreviation +bytes = ბ +# kibibyte abbreviation +kb = კბ +# mebibyte abbreviation +mb = მბ +# gibibyte abbreviation +gb = გბ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = სულ ზომა: { $size } +# the next line after the colon contains a file name +copyLinkDescription = ბმულის ასლი ფაილის გასაზიარებლად: +copyLinkButton = ბმულის ასლი +downloadTitle = ფაილების ჩამოტვირთვა +downloadDescription = ფაილი გაზიარებულია { -send-brand }-ის საშუალებით, გამჭოლი დაშიფვრითა და ვადიანი ბმულით. +trySendDescription = გამოსცადეთ { -send-brand }, ფაილების გაზიარება მარტივად, დაცულად. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] მხოლოდ 1 ფაილი შეიძლება აიტვირთოს ერთ ჯერზე. + *[other] მხოლოდ { $count } ფაილი შეიძლება აიტვირთოს ერთ ჯერზე. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] მხოლოდ 1 არქივია დაშვებული. + *[other] მხოლოდ { $count } არქივია დაშვებული. + } +expiredTitle = ბმული ვადაგასულია. +notSupportedDescription = { -send-brand } არ იმუშავებს ამ ბრაუზერთან. { -send-short-brand } საუკეთესოდ მუშაობს ახალ { -firefox }-ზე და აგრეთვე უმეტესი ბრაუზერების უახლეს ვერსიებზე. +downloadFirefox = ჩამოტვირთეთ { -firefox } +legalTitle = { -send-short-brand } პირადულობის განაცხადი +legalDateStamp = ვერსია 1.0, დათარიღებული 12 მარტით, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } დღე { $hours } სთ { $minutes } წთ +addFilesButton = ფაილების შერჩევა ასატვირთად +uploadButton = ატვირთვა +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = გადმოიტანეთ და მოათავსეთ ფაილები +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ან დაწკაპეთ გასაგზავნად { $size }-მდე +addPassword = პაროლით დაცვა +emailPlaceholder = შეიყვანეთ ელფოსტა +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = შედით ანგარიშზე, რომ გაგზავნოთ { $size }-მდე +signInOnlyButton = შესვლა +accountBenefitTitle = შექმენით { -firefox }-ანგარიში ან შედით +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = გააზიარეთ ფაილები { $size }-მდე +accountBenefitDownloadCount = გაუზიარეთ ფაილები მეტ ხალხს +accountBenefitTimeLimit = + { $count -> + [one] დატოვეთ ფაილები 1 დღემდე + *[other] დატოვეთ ფაილები { $count } დღემდე + } +accountBenefitSync = მართეთ გაზიარებული ფაილები ნებისმიერი მოწყობილობიდან +accountBenefitMoz = გაეცანით { -mozilla }-ს სხვა მომსახურებებს +signOut = გამოსვლა +okButton = კარგი +downloadingTitle = მიმდინარეობს ჩამოტვირთვა +noStreamsWarning = ამ ბრაუზერმა, შესაძლოა ვერ მოახერხოს ასეთი დიდი ფაილის გაშიფვრა. +noStreamsOptionCopy = ბმულის ასლის აღება სხვა ბრაუზერში გასახსნელად +noStreamsOptionFirefox = სცადეთ ჩვენი რჩეული ბრაუზერი +noStreamsOptionDownload = განაგრძეთ ამ ბრაუზერით +downloadFirefoxPromo = { -send-short-brand }-ს წარმოგიდგინეთ უახლესი { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = ფაილის ბმულის გაზიარება: +shareLinkButton = ბმულის გაზიარება +# $name is the name of the file +shareMessage = ჩამოტვირთეთ „{ $name }“ { -send-brand }-ით: ფაილების გაზიარება მარტივად, უსაფრთხოდ +trailheadPromo = გზა, თქვენი პირადულობის დასაცავად. შემოუერთდით Firefox-ს. +learnMore = იხილეთ ვრცლად. diff --git a/public/locales/kab/send.ftl b/public/locales/kab/send.ftl index 49fcfbb6..71e12e11 100644 --- a/public/locales/kab/send.ftl +++ b/public/locales/kab/send.ftl @@ -1,89 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Tarmit web -siteFeedback = Tikti -uploadPageHeader = Beṭṭu n ifuyla s uwgelhen akked tbaḍnit -uploadPageExplainer = Azen ifuyla s wudem aɣelsant, s tbaḍnit akked uwgelhen, s useqdec n useɣwen ara yemten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda. -uploadPageLearnMore = Issin ugar -uploadPageDropMessage = Zuɣeṛ afaylu-ik ar dagi akken ad tebduḍ asali -uploadPageSizeMessage = I ugmuḍ ufrin, yelha ad tesqedceḍ ifuyla daw n 1 GAṬ -uploadPageBrowseButton = Fren afaylu sef uselkim-ik -uploadPageBrowseButton1 = Fren afaylu ad tazneḍ -uploadPageMultipleFilesAlert = Asali n ddeqs n ifuyla neɣ ikaramen ur ittusefrak ara yakan. -uploadPageBrowseButtonTitle = Sali ifuyla -uploadingPageProgress = Tuzna n { $filename } ({ $size }) +title = Send importingFile = Akter... -verifyingFile = Asenqed... encryptingFile = Awgelhen... decryptingFile = Azmek... -notifyUploadDone = Asali n ufaylu yemmed. -uploadingPageMessage = Ticki afaylu-ik yettali, ad tizmired ad ternuḍ iɣewwaṛen n wazen n tagara. -uploadingPageCancel = Sefsex asali -uploadCancelNotification = Asali-ik yefsex. -uploadingPageLargeFileMessage = Afaylu meqqer aṭas ihi yezmer ad yawi ddeqs n wakud. Rǧu ihi! -uploadingFileNotification = Lɣu-yid ticki yemmed usali. -uploadSuccessConfirmHeader = Ihegga i walluy -uploadSvgAlt = Sali -uploadSuccessTimingHeader = Aseɣwen ar ufaylu-ik ad yemmet ticki yuder-d neɣ deffir n 24 n yisragen. -copyUrlFormLabelWithName = Nɣel sakin Bḍu aseɣwen akken ad tazneḍ afaylu-ik: { $filename } -copyUrlFormButton = Sers ɣef afus +downloadCount = + { $num -> + [one] 1 usider + *[other] { $num } isidar + } +timespanHours = + { $num -> + [one] 1 usrag + *[other] { $num } isragen + } copiedUrl = Yenɣel! -deleteFileButton = Kkes afaylu -sendAnotherFileLink = Azen afaylu-nniḍen -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Sider -downloadFileName = Sider { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Sekcem awal uffir unlockInputPlaceholder = Awal uffir unlockButtonLabel = Serreḥ -downloadFileTitle = Sider afaylu awgelhan -// Firefox Send is a brand name and should not be localized. -downloadMessage = Amdakel-ik yuzen-ak-d afaylu s Firefox Firefox Send, ameẓlu ara yeǧǧen tuzna n ifuyla s wudem aɣelsan, s tbadnit akked uwgelhen s useqdec n useqwen ara yeùten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Sider -downloadNotification = Asider-ik yemmed. downloadFinish = Asider yemmed -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } seg { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Ɛreḍ Firefox Send -downloadingPageProgress = Asider n { $filename } ({ $size }) -downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen. -errorAltText = Tuccḍa n tuzna +sendYourFilesLink = Ɛreḍ Send errorPageHeader = Yella wayen yeḍran! -errorPageMessage = Teḍra-d tuccḍa deg usali n ufaylu. -errorPageLink = Azen afaylu-nniḍen -fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }. +fileTooBig = Afaylu-agi meqqer aṭas. Yessefk ad yili daw n { $size }. linkExpiredAlt = Aseɣwen yemmut -expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara! notSupportedHeader = Iminig-ik ur ittusefrak ara -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ad nesḥissef imi iminig-ik ur isefrak ara tatiknulujit web iseqdac Firefox Send. Yessefk ad tesqedceḍ iminig-nniḍen. Seqdec Firefox! notSupportedLink = Ayγer iminig inu ur yettwasefrek ara? -notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Firefox Send. Yessefk ad tleqmeḍ iminig-ik. +notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Send. Yessefk ad tleqmeḍ iminig-ik. updateFirefox = Leqqem Firefox -downloadFirefoxButtonSub = Asider ilelli -uploadedFile = Afaylu -copyFileList = Nɣel URL -// expiryFileList is used as a column header -expiryFileList = Ad ifak di -deleteFileList = Kkes -nevermindButton = Wicqa -legalHeader = Tiwtilin &tabaḍnit -legalNoticeTestPilot = Firefox Send yettwasekyad akka tura am tarmit Test Pilot, ihi ad yili daw n n tewtilin n useqdec n Test Pilot akked Tasertit n tbaḍnit. Tzemreḍ ad teẓreḍ ugar ɣeef tarmit-agi akked ulqaḍ n isefka dagihere. -legalNoticeMozilla = Aseqdec n usmel n Firefox Send yella daw n ilugan tbaḍnit n yismal web n Mozilla akked Tiwtilin n useqdec n yismal Web n Mozilla. -deletePopupText = Kkes afaylu-agi? -deletePopupYes = Ih deletePopupCancel = Sefsex deleteButtonHover = Kkes -copyUrlHover = Nɣel URL. -footerLinkLegal = Usḍif -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Ɣef Test Pilot -footerLinkPrivacy = Tabaḍnit -footerLinkTerms = Tiwtilin -footerLinkCookies = Inagan n tuqqna -requirePasswordCheckbox = YEsra awal uffir akken ad isider afaylu-agi -addPasswordButton = rnu awal uffir passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen. +javascriptRequired = Send yesra JavaScript +whyJavascript = Ayɣer Send yesra JavaScript? +enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }Isragen { $minutes }Tisdatin +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }Tisdatin +# A short status message shown when the user enters a long password +maxPasswordLength = Tuγzi tafellayt n wawal uffir: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Afessas, beṭṭu n ifuyla s wudem uslig +introDescription = { -send-brand } ad k·kem-yeǧǧ ad tebḍuḍ ifuyla iwgelhanen si ṭṭerf ɣer ṭṭerf akked useɣwen ara yemmten s wudem awurman. Daɣen, ad tizmireḍ ad tḥerzeḍ ayen i tbeṭṭuḍ s wudem uslig daɣen ad tamneḍ imi agbur-ik·im ur yettɣimi ara i lebda. +notifyUploadEncryptDone = Afaylu-ik yewgelhen daɣen ihegga i tuzna +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ad yemmet deffir { $downloadCount } neɣ { $timespan } +timespanMinutes = + { $num -> + [one] 1 n tsedat + *[other] { $num } n tsedatin + } +timespanDays = + { $num -> + [one] 1 n wass + *[other] { $num } n wussan + } +timespanWeeks = + { $num -> + [one] 1 n dduṛt + *[other] { $num } n ledwaṛ + } +fileCount = + { $num -> + [one] 1 n ufaylu + *[other] { $num } n yifuyla + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KAṬ +# mebibyte abbreviation +mb = MAṬ +# gibibyte abbreviation +gb = GAṬ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tuɣzi s umata: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek +copyLinkButton = Nɣel aseɣwen +downloadTitle = Sider ifuyla +downloadDescription = Afaylu-a yettwabḍa s { -send-brand } s uwgelhen s ṭṭerf ɣer ṭṭerf s useɣwen ara yemmten s wudem awurman. +trySendDescription = Ɛreḍ { -send-brand } i beḍḍu afessas n ifuyla s wudem ameɣtu. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ala 1 n ufaylu i yemzren ad yali i tikkelt. + *[other] Ala { $count } n yifuyla i yemzren ad alin i tikkelt. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Ala 1 n teṛcibt i yettwasirgen. + *[other] Ala { $count } n teṛcibin i yettwasiregn. + } +expiredTitle = Immut useɣwen. +notSupportedDescription = { -send-brand } ur iteddu ara s yiminig-a. { -send-short-brand } iteddu akken iwata s lqem aneggaru n { -firefox }, daɣen iteddu s lqem amiran n tuget n yiminigen. +downloadFirefox = Sider { -firefox } +legalTitle = Tasertit tabaḍnit n { -send-short-brand } +legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ass { $hours } srg { $minutes } tsd +addFilesButton = Fren ifuyla ad tessaliḍ +uploadButton = Sali +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ẓuɣer sakin sers ifuyla +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = neɣ sit akken ad tazneḍ arma d { $size } +addPassword = Ḥrez s wawal uffir +emailPlaceholder = Sekcem imayl inek +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Qqen akken ad tazneḍ arma d { $size } +signInOnlyButton = Qqen +accountBenefitTitle = Rnu amiḍan { -firefox } akken ad teqqneḍ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bḍu ifuyla arma d { $size } +accountBenefitDownloadCount = Bḍu ifuyla d wugan n medden +accountBenefitTimeLimit = + { $count -> + [one] Eǧǧ iseɣwan d urmiden arma d 1 n wass + *[other] Eǧǧ iseɣwan d urmiden arma d { $count } n wassan + } +accountBenefitSync = Sefrek ifuyla yebdan seg yal ibenk +accountBenefitMoz = Issin ugar ɣef yimeẓla-nniḍen n { -mozilla } +signOut = Ffeɣ +okButton = IH +downloadingTitle = Azdam +noStreamsWarning = Iminig-a ur yezmir ara ad yezmek afaylu meqqren. +noStreamsOptionCopy = Nɣel aseɣwen i tulya deg yiminig-nniden +noStreamsOptionFirefox = Ɛreḍ iminig-ik ufrin +noStreamsOptionDownload = Kemmel akked iminig-a +downloadFirefoxPromo = { -send-short-brand } yettwasumer i yal { -firefox } amaynut. +# the next line after the colon contains a file name +shareLinkDescription = Bḍu aseɣwen ɣer ufaylu-ik: +shareLinkButton = Bḍu aseɣwen +# $name is the name of the file +shareMessage = Sider "{ $name }" s { -send-brand }: d fessas, d aɣelsan i beṭṭu n yifuyla. +trailheadPromo = Yella wallal n ummesten n tudert-ik tusligt. Ddu ɣer Firefox. +learnMore = Issin ugar. diff --git a/public/locales/ko/send.ftl b/public/locales/ko/send.ftl index f8070cd3..e51e19d8 100644 --- a/public/locales/ko/send.ftl +++ b/public/locales/ko/send.ftl @@ -1,92 +1,135 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = 웹 실험 -siteFeedback = 사용자 의견 -uploadPageHeader = 개인적이고, 암호화된 파일 공유 -uploadPageExplainer = 안전하고, 개인적이며, 암호화된 링크를 통해 파일을 공유하세요. 사용자의 파일이 더 이상 온라인 상에 남지 않도록 링크는 자동적으로 만료됩니다. -uploadPageLearnMore = 더 알아보기 -uploadPageDropMessage = 파일을 끌어 놓아 업로드 시작 -uploadPageSizeMessage = 확실한 작동을 위해서, 파일의 크기가 1GB보다 작은 것이 좋음 -uploadPageBrowseButton = 컴퓨터의 파일을 선택 -uploadPageBrowseButton1 = 업로드 할 파일 선택 - .title = 업로드 할 파일 선택 -uploadPageMultipleFilesAlert = 여러 개의 파일 또는 폴더를 업로드하는 것은 현재로선 지원되지 않습니다. -uploadPageBrowseButtonTitle = 파일 업로드 -uploadingPageProgress = { $filename } ({ $size }) 업로드 중 +# Send is a brand name and should not be localized. +title = Send importingFile = 가져오는 중… -verifyingFile = 확인하는 중… encryptingFile = 암호화 중… decryptingFile = 복호화 중… -notifyUploadDone = 업로드가 완료되었습니다. -uploadingPageMessage = 파일이 업로드 되고나서 만료 옵션을 설정할 수 있습니다. -uploadingPageCancel = 업로드 취소 -uploadCancelNotification = 업로드가 취소되었습니다. -uploadingPageLargeFileMessage = 이 파일은 크기가 커서 시간이 다소 걸릴 수 있습니다. 잠시만 기다려주세요! -uploadingFileNotification = 업로드가 완료되면 알림을 표시해 주세요. -uploadSuccessConfirmHeader = 보낼 준비 완료 -uploadSvgAlt = 업로드 -uploadSuccessTimingHeader = 이 파일의 링크는 한 번의 다운로드 후 또는 24시간이 지난 뒤에 만료됩니다. -copyUrlFormLabelWithName = 파일을 보내기 위해 이 링크를 복사하고 공유하세요: { $filename } -copyUrlFormButton = 클립보드에 복사 +downloadCount = 다운로드 { $num }회 +timespanHours = { $num }시간 copiedUrl = 복사 완료! -deleteFileButton = 파일 삭제 -sendAnotherFileLink = 다른 파일 보내기 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = 다운로드 -downloadFileName = { $filename } 다운로드 -downloadFileSize = ({ $size }) -unlockInputLabel = 비밀번호 입력 unlockInputPlaceholder = 비밀번호 unlockButtonLabel = 잠금 해제 -downloadFileTitle = 암호화된 파일 다운로드 -// Firefox Send is a brand name and should not be localized. -downloadMessage = 당신의 친구가 Firefox Send를 통해 파일을 보내고 있습니다. 이 서비스는 안전하고, 개인적이며, 암호화된 링크를 통해 파일을 공유하는 서비스입니다. 사용자의 파일이 더 이상 온라인 상에 남지 않도록 링크는 자동적으로 만료됩니다. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = 다운로드 -downloadNotification = 다운로드가 완료되었습니다. downloadFinish = 다운로드 완료 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send 써보기 -downloadingPageProgress = { $filename } ({ $size }) 다운로드 중 -downloadingPageMessage = 파일을 가져오고 복호화하는 동안 탭을 닫지 말아주세요. -errorAltText = 업로드 오류 +sendYourFilesLink = Send 써보기 errorPageHeader = 오류가 발생했습니다! -errorPageMessage = 파일을 업로드하는 도중 오류가 발생했습니다. -errorPageLink = 다른 파일 보내기 fileTooBig = 파일의 크기가 너무 큽니다. { $size } 보다 작아야 합니다. linkExpiredAlt = 링크가 만료됨 -expiredPageHeader = 이 링크는 만료되었거나 애초부터 존재하지 않았습니다! notSupportedHeader = 이 브라우저는 지원되지 않습니다. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 안타깝게도 이 브라우저는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 다른 브라우저로 다시 시도해주세요. Firefox를 추천합니다! notSupportedLink = 왜 이 브라우저는 지원이 되지 않나요? -notSupportedOutdatedDetail = 안타깝게도 현재 브라우저 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다. +notSupportedOutdatedDetail = 안타깝게도 사용중인 Firefox 버전에서는 Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다. updateFirefox = Firefox 업데이트 -downloadFirefoxButtonSub = 무료 다운로드 -uploadedFile = 파일 -copyFileList = URL 복사 -// expiryFileList is used as a column header -expiryFileList = 만료기한 -deleteFileList = 삭제 -nevermindButton = 괜찮습니다 -legalHeader = 이용약관 & 개인정보 보호 -legalNoticeTestPilot = Firefox Send는 현재 Test Pilot 실험 중이고, Test Pilot 이용 약관개인정보 보호공지가 적용됩니다. 이 실험과 데이터 수집에 관해서는 여기에서 더 알아볼 수 있습니다. -legalNoticeMozilla = 또한, Firefox Send 웹사이트 사용에는 웹사이트 개인정보 공지웹 사이트 이용약관이 적용됩니다. -deletePopupText = 이 파일을 지우시겠습니까? -deletePopupYes = 예 deletePopupCancel = 아니오 deleteButtonHover = 삭제 -copyUrlHover = URL 복사 -footerLinkLegal = 법적 정보 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot 정보 -footerLinkPrivacy = 개인정보 보호 -footerLinkTerms = 이용 약관 -footerLinkCookies = 쿠키 -requirePasswordCheckbox = 이 파일을 다운로드하려면 비밀번호가 필요함 -addPasswordButton = 비밀번호 추가 passwordTryAgain = 비밀번호가 맞지 않습니다. 다시 시도해 주세요. -// This label is followed by the password needed to download a file -passwordResult = 비밀번호: { $password } +javascriptRequired = Send는 JavaScript를 필요로 합니다 +whyJavascript = 왜 Send에 JavaScript가 필요하죠? +enableJavascript = JavaScript를 활성화하고 다시 시도해 주세요. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }시간 { $minutes }분 +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }분 +# A short status message shown when the user enters a long password +maxPasswordLength = 최대 비밀번호 길이: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = 이 비밀번호를 설정할 수 없었습니다 + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = 간단하고, 사생활을 보호하는 파일 공유 +introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다. +notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다 +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨 +timespanMinutes = + { $num -> + *[other] { $num }분 + } +timespanDays = + { $num -> + *[other] { $num }일 + } +timespanWeeks = + { $num -> + *[other] { $num }주 + } +fileCount = + { $num -> + *[other] { $num } 파일 + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 전체 크기: { $size } +# the next line after the colon contains a file name +copyLinkDescription = 링크를 복사해서 파일을 공유하세요: +copyLinkButton = 링크 복사 +downloadTitle = 파일 다운로드 +downloadDescription = 이 파일은 종단간 암호화 및 자동으로 만료되는 링크를 지원하는 { -send-brand }를 통해 공유되었습니다. +trySendDescription = 간단하고 안전한 파일 공유를 원하시나요? { -send-brand }를 사용해보세요. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] 한번에 { $count }개의 파일만 업로드 할 수 있습니다. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] { $count }개의 아카이브만 허용됩니다. + } +expiredTitle = 이 링크는 만료되었습니다. +notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다. +downloadFirefox = { -firefox } 다운로드 +legalTitle = { -send-short-brand } 개인정보처리방침 +legalDateStamp = 버전 1.0, 2019년 3월 12일자 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분 +addFilesButton = 업로드할 파일들을 선택하세요 +uploadButton = 업로드 +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = 파일들을 여기에 끌어서 놓으세요 +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = 또는 여기를 클릭하여 { $size }까지의 파일을 공유하세요. +addPassword = 비밀번호로 파일 보호 +emailPlaceholder = 이메일 입력 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인 +signInOnlyButton = 로그인 +accountBenefitTitle = { -firefox } 계정 생성 또는 로그인 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size }까지의 파일 공유 +accountBenefitDownloadCount = 더 많은 사람들과 함께 파일 공유 +accountBenefitTimeLimit = + { $count -> + *[other] 최대 { $count }일까지 링크 유지 + } +accountBenefitSync = 어떤 기기에서든지 공유된 링크 관리 +accountBenefitMoz = 다른 { -mozilla } 서비스에 대해 알아보기 +signOut = 로그아웃 +okButton = 확인 +downloadingTitle = 다운로드 중 +noStreamsWarning = 이 브라우저는 이렇게 큰 파일은 암호화 해제를 못할 수도 있습니다. +noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사 +noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요 +noStreamsOptionDownload = 이 브라우저로 계속하기 +downloadFirefoxPromo = 완전히 새로운 { -firefox }로 { -send-short-brand }가 제공됩니다. +# the next line after the colon contains a file name +shareLinkDescription = 파일 링크 공유: +shareLinkButton = 링크 공유 +# $name is the name of the file +shareMessage = { -send-brand }으로 “{ $name }” 파일을 내려받으세요: 쉽고 안전한 파일 공유입니다. +trailheadPromo = 개인 정보를 보호하는 방법이 있습니다. Firefox에 가입하세요. +learnMore = 더 알아보기. diff --git a/public/locales/lt/send.ftl b/public/locales/lt/send.ftl new file mode 100644 index 00000000..e75077a5 --- /dev/null +++ b/public/locales/lt/send.ftl @@ -0,0 +1,166 @@ +title = Send +importingFile = Importuojama… +encryptingFile = Šifruojama… +decryptingFile = Iššifruojama… +downloadCount = + { $num -> + [one] { $num } kartą + [few] { $num } kartus + *[other] { $num } kartų + } +timespanHours = + { $num -> + [one] { $num } valandos + [few] { $num } valandų + *[other] { $num } valandų + } +copiedUrl = Nukopijuota! +unlockInputPlaceholder = Slaptažodis +unlockButtonLabel = Atrakinti +downloadButtonLabel = Parsisiųsti +downloadFinish = Parsiuntimas baigtas +fileSizeProgress = ({ $partialSize } iš { $totalSize }) +sendYourFilesLink = Išbandyti „Send“ +errorPageHeader = Nutiko kažkas negero! +fileTooBig = Pasirinktas failas yra per didelis, kad jį būtų galima įkelti. Failo dydis neturėtų viršyti { $size } +linkExpiredAlt = Saitas nebegalioja +notSupportedHeader = Jūsų naršyklė nepalaikoma. +notSupportedLink = Kodėl mano naršyklė nepalaikoma? +notSupportedOutdatedDetail = Deja, šioje „Firefox“ naršyklės laidoje nepalaikoma „Send“ veikti reikalinga technologija. Jeigu norite naudotis šia paslauga, turėsite atnaujinti savo naršyklę. +updateFirefox = Atnaujinti „Firefox“ +deletePopupCancel = Atsisakyti +deleteButtonHover = Šalinti +passwordTryAgain = Slaptažodis netinka. Bandykite dar kartą. +javascriptRequired = „Send“ veikimui būtina įgalinti „JavaScript“ palaikymą +whyJavascript = Kodėl „Send“ neveikia išjungus „JavaScript“? +enableJavascript = Įgalinkit „JavaScript“ ir bandykite dar kartą. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } val. { $minutes } min. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min. +# A short status message shown when the user enters a long password +maxPasswordLength = Didžiausias leistinas slaptažodžio ilgis: { $length } simb. +# A short status message shown when there was an error setting the password +passwordSetError = Slaptažodžio nustatyti nepavyko + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = + { $case -> + *[nominative] Mozilla + [genitive] Mozillos + [dative] Mozillai + [accusative] Mozillą + [instrumental] Mozilla + [locative] Mozilloje + } +introTitle = Paprastas ir privatus dalijimasis failais +introDescription = „{ -send-brand }“ suteikia galimybę dalintis failais, pasitelkiant abipusį šifravimą ir riboto galiojimo saitus. Tai padeda pasidalintus failus išlaikyti privačiais ir užtikrina, jog trumpam įkelti failai neliks pasiekiami internete amžinai. +notifyUploadEncryptDone = Failas užšifruotas ir parengtas išsiuntimui +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Nustos galioti parsisiuntus { $downloadCount } arba po { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minutės + [few] { $num } minučių + *[other] { $num } minučių + } +timespanDays = + { $num -> + [one] { $num } dienos + [few] { $num } dienų + *[other] { $num } dienų + } +timespanWeeks = + { $num -> + [one] { $num } savaitės + [few] { $num } savaičių + *[other] { $num } savaičių + } +fileCount = + { $num -> + [one] { $num } failas + [few] { $num } failai + *[other] { $num } failų + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Bendras dydis: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Nukopijuokite saitą, jeigu norite pasidalinti failu: +copyLinkButton = Kopijuoti saitą +downloadTitle = Parsisiųsti failus +downloadDescription = Šiuo failu pasidalinta per „{ -send-brand }“, pasitelkiant abipusį šifravimą ir riboto galiojimo saitą. +trySendDescription = Išbandykite „{ -send-brand }“ paprastam ir saugiam dalijimuisi failais. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Vienu metu galima įkelti ne daugiau kaip { $count } failą. + [few] Vienu metu galima įkelti ne daugiau kaip { $count } failus. + *[other] Vienu metu galima įkelti ne daugiau kaip { $count } failų. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Leidžiama turėti iki ne daugiau kaip { $count } archyvą. + [few] Leidžiama turėti iki ne daugiau kaip { $count } archyvus. + *[other] Leidžiama turėti iki ne daugiau kaip { $count } archyvų. + } +expiredTitle = Šis saitas nebegalioja. +notSupportedDescription = „{ -send-brand }“ su šia naršykle neveikia. „{ -send-short-brand }“ geriausiai veikia su paskiausia „{ -firefox }“ laida, o taip pat veikia su daugumos kitų naršyklių paskiausiomis laidomis. +downloadFirefox = Parsisiųsti „{ -firefox }“ +legalTitle = „{ -send-short-brand }“ privatumo pranešimas +legalDateStamp = 1.0 versija, 2019 m. kovo 12 d +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d. { $hours } val. { $minutes } min. +addFilesButton = Rinktis failus įkėlimui +uploadButton = Įkelti +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Užtempkite ir numeskite failus čia +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = arba spustelėkite mygtuką ir dalinkitės failais iki { $size } +addPassword = Apsaugoti slaptažodžiu +emailPlaceholder = Įveskite savo el. pašto adresą +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Prisijunkite, jeigu norite siųsti iki { $size } +signInOnlyButton = Prisijungti +accountBenefitTitle = Susikurkite „{ -firefox }“ paskyrą arba prisijunkite +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dalinkitės iki { $size } dydžio failais +accountBenefitDownloadCount = Dalinkitės su daugiau žmonių +accountBenefitTimeLimit = + { $count -> + [one] Išlaikykite saitus galiojančiais iki { $count } dienos. + [few] Išlaikykite saitus galiojančiais iki { $count } dienų. + *[other] Išlaikykite saitus galiojančiais iki { $count } dienų. + } +accountBenefitSync = Tvarkykite failus, kuriais dalijatės, iš bet kurio įrenginio +accountBenefitMoz = Sužinokite apie kitas „{ -mozilla(case: "genitive") }“ paslaugas +signOut = Atsijungti +okButton = Gerai +downloadingTitle = Parsiunčiama +noStreamsWarning = jūsų naršyklei gali nepavykti iššifruoti tokio didelio failo. +noStreamsOptionCopy = Nukopijuokite saitą ir atverkite jį kita naršykle +noStreamsOptionFirefox = Išbandykite mūsų mėgstamiausią naršyklę +noStreamsOptionDownload = Tęsti naudojantis šia naršykle +downloadFirefoxPromo = „{ -send-short-brand }“ jums atkeliauja iš naujosios „{ -firefox }“. +# the next line after the colon contains a file name +shareLinkDescription = Pasidalinkite saitu į jūsų failą: +shareLinkButton = Dalintis saitu +# $name is the name of the file +shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais +trailheadPromo = Yra būdas apsaugoti jūsų privatumą. Naudokite „Firefox“. +learnMore = Sužinoti daugiau. diff --git a/public/locales/lus/send.ftl b/public/locales/lus/send.ftl new file mode 100644 index 00000000..d8c257c3 --- /dev/null +++ b/public/locales/lus/send.ftl @@ -0,0 +1,5 @@ +encryptingFile = Encrypting... +decryptingFile = Decrypting + +## Send version 2 strings + diff --git a/public/locales/meh/send.ftl b/public/locales/meh/send.ftl new file mode 100644 index 00000000..aa9b07a0 --- /dev/null +++ b/public/locales/meh/send.ftl @@ -0,0 +1,148 @@ +title = Send +importingFile = Nasia´a… +encryptingFile = Encriptando... +decryptingFile = Desencriptando… +downloadCount = + { $num -> + *[other] { $num } nxinuun + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } +copiedUrl = Ntɨɨn +unlockInputPlaceholder = Contraseña +unlockButtonLabel = Nkasɨ +downloadButtonLabel = Xinuu +downloadFinish = Nnɨ´ɨ xinuu +fileSizeProgress = ({ $partialSize } de { $totalSize }) +sendYourFilesLink = Ni´i Send +errorPageHeader = ¡Iyo iin ntu nkene va´a! +fileTooBig = Archivo ya´a ka´nu. Nejia chunku´va { $size } +linkExpiredAlt = Nnɨ´ɨ enlace +notSupportedHeader = Ntu íyo tiñu nuu ka̱a̱ nánuku ya´a. +notSupportedLink = ¿Navi ntu satiñu nuu ka̱a̱ nánuku ya´a? +notSupportedOutdatedDetail = Tuni Firefox ya´a ntu satiñu vii jii Send. Nejika xinunu a jíía ka̱a̱ nánuku. +updateFirefox = Naxi´ñá Firefox +deletePopupCancel = Nkuvi-ka +deleteButtonHover = Xita +passwordTryAgain = Contraseña ntu vatu. Nachu´un tuku. +javascriptRequired = Send ni´i JavaScript +whyJavascript = ¿Navi Send ni´i JavaScript? +enableJavascript = Kua´a jia´a JavaScript jee nachu´un tuku. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Naja ka´nu koo contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ntu nkuvi sá´á contraseña + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Kua´a daa archivo ñama jee yu´u +introDescription = { -send-brand } taji jia´anu archivos jii cifrado uvi nuu jee iin enlace nɨ´ɨ. Sukuan kuvi kumi yu´unu daa archivo jia´anu jee kuninu nkino daa ya´a kue´e kuiya íchi nuu. +notifyUploadEncryptDone = Archivo noo´o íyo cifrado jee kuvi chu´un íchi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Nɨ'ɨ dee nña´a { $downloadCount } a xiin { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ka´nu: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Tɨɨn enlace jee kua´a archivo: +copyLinkButton = Tɨɨn enlacae +downloadTitle = Xinuu archivo +downloadDescription = Archivo ya´a nsajia { -send-brand } jíí cifrado punto a punto jee iin enlace naa. +trySendDescription = Nasá´á jii { -send-brand } kua´a ñama jee vatu. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ntuxini 1 archivo kuvi ska. + *[other] Ntuxini { $count } archivos kuvi ska. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Ntu xini 1 archivo íyo + *[other] Ntu xini { $count } archivos íyo + } +expiredTitle = Nnɨ'ɨ link ya´a. +notSupportedDescription = { -send-brand } nsatiñu jii ka̱a̱ nánuku ya´a. { -send-short-brand } satiñu va´a jii tuni íchi yata { -firefox }, jee satiñu va´a jii tuni íyo ntañu´u kuaiyo daa ka̱a̱ nánuku. +downloadFirefox = Xinuun { -firefox } +legalTitle = Tu´un xitu a kumiji noo´o { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Kaji archivos ska +uploadButton = Ska +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Staka jee sía daa archivo +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = a xiin kuaxin saa chu´un íchi nee { $size } +addPassword = Iyo yu´u jii contraseña +emailPlaceholder = Chu´un email noo´o +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kajie´e sesión saa chu´un íchi nee { $size } +signInOnlyButton = Kajie´e sesión +accountBenefitTitle = Sá´á iin cuenta { -firefox } a xiin kajie´e sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Kua´a archivo ka´nu { $size } +accountBenefitDownloadCount = Kua´a archivos jii inka ñivɨ +accountBenefitTimeLimit = + { $count -> + [one] Kuteku enlaces 1 kivɨ + *[other] Kuteku daa enlaces { $count } kivɨ + } +accountBenefitSync = Tetiñu archivos jia´anu ntaka ka̱a̱ +accountBenefitMoz = Ka´vi kue´eka jiee inka tiñu { -mozilla } +signOut = Kasɨ sesión +okButton = Kuvi +downloadingTitle = Xinuu +noStreamsWarning = Kuvi ka̱a̱ nánaku ya´a nxituvi a vaji nuu iin archivo ka´nu. +noStreamsOptionCopy = Tɨɨn enlace jee síne nuu inka ka̱a̱ nánuku +noStreamsOptionFirefox = Ni´i ka̱a̱ nánuku va´a +noStreamsOptionDownload = Kaka jii ka̱a̱ nánuku ya´a +downloadFirefoxPromo = { -send-short-brand } taji jíía { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Kua´a enlace archivo noo´o +shareLinkButton = Kua´a link +# $name is the name of the file +shareMessage = Xinuu “{ $name }” jii { -send-brand }: ntu viji +trailheadPromo = Iyo iin kuvi kumi privacidad noo´o. Nayonika Firefox. +learnMore = Ka´vi kue´eka diff --git a/public/locales/mix/send.ftl b/public/locales/mix/send.ftl new file mode 100644 index 00000000..21c88630 --- /dev/null +++ b/public/locales/mix/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Ndakiin… +encryptingFile = Ndasami tu'un… +decryptingFile = Nchiko tu'un… +downloadCount = + { $num -> + [one] 1 snuú + *[other] { $num } snuú + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } +copiedUrl = ¡Tsa ndatavi ña! +unlockInputPlaceholder = Tu'un seè +unlockButtonLabel = Kuna +downloadButtonLabel = Snuù +downloadFinish = Ntsinu snui +fileSizeProgress = ({ $partialSize } ña { $totalSize }) +sendYourFilesLink = Kuachu'un Send +errorPageHeader = ¡Yee ña va'a! +fileTooBig = Kanu tutu yo. Tsini ñu'u koi tana { $size }. +linkExpiredAlt = Ntoo enlace +notSupportedHeader = Kue ku kuni página. +notSupportedLink = ¿Chanu kue ku kuncheuña? +notSupportedOutdatedDetail = Firefox kue ku kuni página web takua kuachu'un Send. tsiniñu'u ndu tsa'a navegador. +updateFirefox = Ndu tsa'a Firefox +deletePopupCancel = Kunchatu +deleteButtonHover = Stoò +passwordTryAgain = Kue vaa ni chau sivi siki. Chai tuku. +javascriptRequired = Send tsiniñui JavaScript +whyJavascript = ¿Chanu Send tsiniñui JavaScript? +enableJavascript = Saá ña mani katsi JavaScript chá kitsa tuku. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Kua tu'un see: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ma ku ntanii tu'un see + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Stucha kue tutu ku +introDescription = { -send-brand } ku stuchaku tutu seé tsi inkana tsi iin enlace ña ntóo mituin. Sa'an ku kunka va'a ña stuchaku cha ma ku kunchee na kue tutu ku. +notifyUploadEncryptDone = Tsa inka va'a tutu ku tsa ku stuchaku ña +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ku kunkai mancha { $downloadCount } a { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 kii + *[other] { $num } kii + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 tutu + *[other] { $num } tutu + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Kua: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Ndatava enlace takua stuchaku tutú. +copyLinkButton = Ndatava enlace +downloadTitle = Snuú tutu +downloadDescription = Tutu yo stuchaku ña tsi { -send-brand } inka si'i chá ku nto'o mituin. +trySendDescription = Kuachu'un { -send-brand } takua stuchaku nchi tutu niku +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ku skau 1 tutu ni. + *[other] Mitu'un { $count }tutu ku skau. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] 1 tutu ni ku. + *[other] Mitu'un { $count } tutu ni ku. + } +expiredTitle = Koo enlace inka +notSupportedDescription = { -send-brand } ma ku Kuachu'un navegador yo. { -send-short-brand } Sachu'in va'a la versión da ntii { -firefox }, sachu'un tsi versión tsa'a su inka kue navegador. +downloadFirefox = Snuú { -firefox } +legalTitle = Tu'un privacidad { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Katsi tutu ku skau +uploadButton = Skaa +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Xita cha sia kue tutu +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = katavi takua stuchaku ña mancha { $size } +addPassword = Inka vai tsi tu'un seé +emailPlaceholder = Chaa korreo ku +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = kitsa takua kuachu'una mancha { $size } +signInOnlyButton = Kitsaa +accountBenefitTitle = Saa iin kuenta ña { -firefox } a kitsa +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Stucha tutu mancha { $size } +accountBenefitDownloadCount = Stucha tutu tsi kuaka nivi +accountBenefitTimeLimit = + { $count -> + [one] Ku kunka tutu ku mancha 1 kii + *[other] Ku kunka tutu ku mancha { $count } kii + } +accountBenefitSync = Stucha tutu tsí nchi kaa ndusu niku +accountBenefitMoz = Kavi tutú tsa { -mozilla } +signOut = Kee +okButton = Vaá +downloadingTitle = Snuì +noStreamsWarning = Ku ña navegador yo ma ku mini iin tutú kanu. +noStreamsOptionCopy = Ndatava enlace takua kunu tsí inka navegador +noStreamsOptionFirefox = Kuachu'un navegador ña va'a nu ntia +noStreamsOptionDownload = Kunka tsi navegador yo +downloadFirefoxPromo = { -send-short-brand } snai ña tsaa { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Stucha enlace tutu ku: +shareLinkButton = Stucha Enlace +# $name is the name of the file +shareMessage = Snuu «{ $name }» tsi { -send-brand }: kue nchichi +trailheadPromo = Ku china vau ña chau. Kita'an tsi Firefox. +learnMore = Skua'a kuakaa. diff --git a/public/locales/ml/send.ftl b/public/locales/ml/send.ftl new file mode 100644 index 00000000..d767973f --- /dev/null +++ b/public/locales/ml/send.ftl @@ -0,0 +1,147 @@ +title = ഫയർഫോക്സ് സെൻഡ് +importingFile = ഇറക്കുമതി ചെയ്യുന്നു... +encryptingFile = എൻക്രിപ്റ്റ് ചെയ്യുന്നു... +decryptingFile = ഡീക്രിപ്റ്റ് ചെയ്യുന്നു... +downloadCount = + { $num -> + [one] ഒരു ഡൗൺലോഡ് + *[other] { $num } ഡൗൺലോഡുകൾ + } +timespanHours = + { $num -> + [one] 1 മണിക്കൂർ + *[other] { $num } മണിക്കൂറുകൾ + } +copiedUrl = പകർത്തി! +unlockInputPlaceholder = രഹസ്യവാക്ക് +unlockButtonLabel = തുറക്കുക +downloadButtonLabel = ഡൗൺലോഡ് +downloadFinish = ഡൗൺലോഡ് പൂർത്തിയായി +fileSizeProgress = ({ $totalSize } -ന്റെ { $partialSize }) +sendYourFilesLink = ഫയർഫോക്സ് സെൻഡ് പരീക്ഷിക്കൂ +errorPageHeader = എന്തോ പ്രശ്നമുണ്ട്! +fileTooBig = ഈ ഫയൽ വളരെ വലുതായതിനാൽ അപ്‌ലോഡ് ചെയ്യാൻ സാധിച്ചില്ല. പരമാവധി വലുപ്പം { $size } ആണ്. +linkExpiredAlt = കണ്ണി കാലഹരണപ്പെട്ടു +notSupportedHeader = താങ്കളുടെ ബ്രൗസറിന് പിന്തുണയില്ല. +notSupportedLink = എന്തുകൊണ്ടാണ് എന്റെ ബ്രൗസറിന് പിന്തുണയില്ലാത്തത്? +notSupportedOutdatedDetail = ദൗർഭാഗ്യവശാൽ ഫയർഫോക്സിന്റെ ഈ പതിപ്പ് ഫയർഫോക്സ് സെൻഡ് ഉപയോഗിക്കുന്ന വെബ് സാങ്കേതികവിദ്യ പിന്തുണയ്ക്കുന്നില്ല. താങ്കൾ താങ്കളുടെ ബ്രൗസർ പുതുക്കേണ്ടി വരും. +updateFirefox = ഫയർഫോക്സ് പുതുക്കൂ +deletePopupCancel = റദ്ദാക്കുക +deleteButtonHover = നീക്കം ചെയ്യുക +passwordTryAgain = രഹസ്യവാക്ക് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക. +javascriptRequired = ഫയർഫോക്സ് സെൻഡ് പ്രവർത്തിക്കാൻ ജാവാസ്ക്രിപ്റ്റ് വേണം +whyJavascript = ഫയർഫോക്സ് സെൻഡ് പ്രവർത്തിക്കാൻ എന്തിനാണ് ജാവാസ്ക്രിപ്റ്റ്? +enableJavascript = ദയവായി ജാവാസ്ക്രിപ്റ്റ് പ്രവർത്തനസജ്ജമാക്കിയിട്ട് വീണ്ടും ശ്രമിക്കുക. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } മണിക്കൂർ { $minutes } മിനുട്ട് +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } മിനുട്ട് +# A short status message shown when the user enters a long password +maxPasswordLength = രഹസ്യവാക്കിന്റെ പരമാവധി നീളം: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ഈ രഹസ്യവാക്ക് ക്രമീകരിക്കാനായില്ല + +## Send version 2 strings + +-send-brand = ഫയർഫോക്സ് സെൻഡ് +-send-short-brand = സെൻഡ് +-firefox = ഫയർഫോക്സ് +-mozilla = മോസില്ല +introTitle = ലളിതവും സ്വകാര്യവുമായ ഫയൽ പങ്കിടൽ +introDescription = തനിയെ കാലഹരണപ്പെടുന്ന ലിങ്ക് ഉപയോഗിച്ച് തുടക്കം മുതല്‍ അവസാനം വരെയുള്ള എന്‍ക്രിപ്ഷന്‍ സാങ്കേതികതയോടെ ഫയലുകള്‍ പങ്കിടാന്‍ { -send-brand } ഉപയോഗിക്കാം. അത് കൊണ്ട് തന്നെ നിങ്ങള്‍ പങ്കിടുന്നത് സ്വകാര്യമായി സൂക്ഷിക്കാനും അത് ഓണ്‍ലൈനില്‍ എക്കാലവും കാണില്ലെന്ന് ഉറപ്പാക്കാനും പറ്റും. +notifyUploadEncryptDone = നിങ്ങളുടെ ഫയൽ എൻക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു, അയയ്ക്കാൻ തയ്യാറാണ് +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } അല്ലെങ്കിൽ { $timespan } കഴിഞ്ഞാൽ കാലഹരണപ്പെടും +timespanMinutes = + { $num -> + [one] മിനുട്ട് + *[other] { $num } മിനുട്ട് + } +timespanDays = + { $num -> + [one] 1 ദിവസം + *[other] { $num } ദിവസം + } +timespanWeeks = + { $num -> + [one] 1 ആഴ്ച + *[other] { $num } ആഴ്ച + } +fileCount = + { $num -> + [one] 1 ഫയൽ + *[other] { $num } ഫയലുകൾ + } +# byte abbreviation +bytes = ബൈറ്റ് +# kibibyte abbreviation +kb = കി.ബൈ +# mebibyte abbreviation +mb = എംബി +# gibibyte abbreviation +gb = ജിബി +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ആകെ വലിപ്പം: { $size } +# the next line after the colon contains a file name +copyLinkDescription = നിങ്ങളുടെ ഫയൽ പങ്കിടാനുള്ള ലിങ്ക് പകർത്തുക: +copyLinkButton = ലിങ്ക് പകർത്തുക +downloadTitle = ഫയലുകൾ ഡൗൺലോഡുചെയ്യുക +downloadDescription = ഈ ഫയൽ { -send-brand } ഉപയോഗിച്ച് എൻഡ്-ടു-എൻഡ് എൻക്രിപ്ഷനോടും തനിയെ കാലഹരണപ്പെടുന്ന ഒരു ലിങ്കോടും കൂടി പങ്കിട്ടതാണ്. +trySendDescription = ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടലിനായി { -send-brand } പരീക്ഷിക്കുക. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ഒരേസമയം 1 ഫയൽ മാത്രമേ അപ്‌ലോഡു ചെയ്യാൻ കഴിയൂ. + *[other] ഒരേസമയം { $count } ഫയലുകൾ മാത്രമേ അപ്‌ലോഡു ചെയ്യാൻ കഴിയൂ. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] ഒരു ആർക്കൈവ് മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ. + *[other] { $count } ആർക്കൈവുകൾ മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ. + } +expiredTitle = ഈ ലിങ്ക് കാലഹരണപ്പെട്ടു. +notSupportedDescription = ഈ ബ്രൌസറിൽ { -send-brand } പ്രവർത്തിക്കില്ല. { -send-short-brand } { -firefox }- ന്റെ ഏറ്റവും പുതിയ പതിപ്പിൽ വളരെ നന്നായി പ്രവർത്തിക്കുന്നു, കൂടാതെ മിക്ക ബ്രൌസറുകളുടെയും നിലവിലെ പതിപ്പിൽ പ്രവർത്തിക്കുകയും ചെയ്യും. +downloadFirefox = { -firefox } ഡൗണ്‍ലോഡ് ചെയ്യുക +legalTitle = { -send-short-brand } സ്വകാര്യതാ അറിയിപ്പ് +legalDateStamp = 2019 മാർച്ച് 12 തീയതിയിൽ പതിപ്പ് 1.0 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ദിവസം { $hours } മണിക്കൂർ { $minutes } മിനിറ്റ് +addFilesButton = അപ്‌ലോഡ് ചെയ്യാനുള്ള ഫയലുകൾ തിരഞ്ഞെടുക്കുക +uploadButton = അപ്‍ലോഡ് +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ഫയലുകൾ വലിച്ചിടുക +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = അല്ലെങ്കിൽ { $size } വരെ അയയ്ക്കുന്നതിന് അമർത്തുക +addPassword = രഹസ്യവാക്ക് ഉപയോഗിച്ച് സംരക്ഷിക്കുക +emailPlaceholder = നിങ്ങളുടെ ഇമെയിൽ നൽകുക +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size } വരെയുള്ള ഫയലുകൾ അയയ്ക്കുന്നതിന് പ്രവേശിക്കുക +signInOnlyButton = പ്രവേശിയ്ക്കുക +accountBenefitTitle = ഒരു { -firefox } അക്കൗണ്ട് സൃഷ്ടിക്കുക അല്ലെങ്കിൽ പ്രവേശിക്കുക +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } വരെയുള്ള ഫയലുകൾ പങ്കിടുക +accountBenefitDownloadCount = കൂടുതൽ ആളുകളുമായി ഫയലുകൾ പങ്കിടുക +accountBenefitTimeLimit = + { $count -> + [one] ഒരു ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക + *[other] { $count } ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക + } +accountBenefitSync = ഏതൊരു ഉപകരണത്തിൽ നിന്നും പങ്കിട്ട ഫയലുകൾ കൈകാര്യം ചെയ്യുക +accountBenefitMoz = മറ്റ് { -mozilla } സേവനങ്ങളെക്കുറിച്ച് അറിയുക +signOut = പുറത്തിറങ്ങുക +okButton = ശരി +downloadingTitle = ഡൌണ്‍ലോഡ് ചെയ്യുന്നു +noStreamsWarning = ഇത്ര വലിയ ഫയൽ ബ്രൌസറില്‍ ഡീക്രിപ്റ്റ് ചെയ്യാൻ കഴിഞ്ഞേക്കില്ല. +noStreamsOptionCopy = മറ്റൊരു ബ്രൗസറിൽ തുറക്കുന്നതിന് ലിങ്ക് പകർത്തുക +noStreamsOptionFirefox = ഞങ്ങളുടെ പ്രിയപ്പെട്ട ബ്രൗസർ പരീക്ഷിക്കുക +noStreamsOptionDownload = ഈ ബ്രൗസറിൽ തുടരുക +downloadFirefoxPromo = എറ്റവും പുതിയ { -firefox } { -send-short-brand } മുഖേന നിങ്ങൾക്ക് എത്തിച്ചിരിക്കുന്നു. +# the next line after the colon contains a file name +shareLinkDescription = നിങ്ങളുടെ ഫയലിനുള്ള കണ്ണി പങ്കിടുക: +shareLinkButton = കണ്ണി പങ്കിടുക +# $name is the name of the file +shareMessage = "{ -send-brand }" ഉപയോഗിച്ച് { $name } ഡൌൺലോഡ് ചെയ്യുക: ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടൽ diff --git a/public/locales/ms/send.ftl b/public/locales/ms/send.ftl index b15d7c26..5d02d2b4 100644 --- a/public/locales/ms/send.ftl +++ b/public/locales/ms/send.ftl @@ -1,7 +1,5 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send +title = Send siteSubtitle = experimen web -siteFeedback = Maklum balas uploadPageHeader = Peribadi, Perkongsian Fail Dienkrip uploadPageExplainer = Hantar fail melalui pautan yang selamat, peribadi dan dienkrip, yang akan luput secara automatik untuk memastikan fail anda itu tidak terus berada dalam talian selama-lamanya. uploadPageLearnMore = Ketahui selanjutnya @@ -25,29 +23,42 @@ uploadingFileNotification = Maklumkan saya apabila muat naik selesai. uploadSuccessConfirmHeader = Sedia untuk Hantar uploadSvgAlt = Muat naik uploadSuccessTimingHeader = Pautan ke fail anda akan luput selepas 1 muat turun atau dalam 24 jam. +expireInfo = Pautan ke fail anda akan luput selepas { $downloadCount } atau { $timespan }. +downloadCount = + { $num -> + *[other] { $num } muat turun + } +timespanHours = + { $num -> + *[other] { $num } jam + } copyUrlFormLabelWithName = Salin dan kongsi pautan untuk menghantar fail anda: { $filename } copyUrlFormButton = Salin ke Klipbod copiedUrl = Disalin! deleteFileButton = Buang Fail sendAnotherFileLink = Hantar fail lain -// Alternative text used on the download link/button (indicates an action). +# Alternative text used on the download link/button (indicates an action). downloadAltText = Muat turun +downloadsFileList = Muat turun +# Used as header in a column indicating the amount of time left before a +# download link expires (e.g. "10h 5m") +timeFileList = Masa +# Used as header in a column indicating the number of times a file has been +# downloaded downloadFileName = Muat turun { $filename } downloadFileSize = ({ $size }) unlockInputLabel = Masukkan Kata Laluan unlockInputPlaceholder = Kata laluan unlockButtonLabel = Buka downloadFileTitle = Muat turun Fail Enkripsi -// Firefox Send is a brand name and should not be localized. -downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Firefox Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya. -// Text and title used on the download link/button (indicates an action). +downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya. +# Text and title used on the download link/button (indicates an action). downloadButtonLabel = Muat turun downloadNotification = Muat turun anda sudah siap. downloadFinish = Muat turun Selesai -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } daripada { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Cuba Firefox Send +sendYourFilesLink = Cuba Send downloadingPageProgress = Memuat turun { $filename } ({ $size }) downloadingPageMessage = Sila biarkan tab ini terbuka semasa kami mengambil fail anda dan menghuraikannya. errorAltText = Ralat memuat naik @@ -58,34 +69,43 @@ fileTooBig = Fail terlalu besar untuk dimuat naik. Perlu kurang daripada { $size linkExpiredAlt = Pautan sudah luput expiredPageHeader = Pautan ini sudah luput atau pun tidak pernah wujud! notSupportedHeader = Pelayar anda tidak disokong. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Firefox Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox! +notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox! notSupportedLink = Kenapa pelayar saya tidak disokong? -notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Firefox Send. Anda perlu mengemaskini pelayar anda. +notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Send. Anda perlu mengemaskini pelayar anda. updateFirefox = Kemaskini Firefox downloadFirefoxButtonSub = Muat turun Percuma uploadedFile = Fail copyFileList = Salin URL -// expiryFileList is used as a column header +# expiryFileList is used as a column header expiryFileList = Luput Pada deleteFileList = Buang nevermindButton = Tak apalah legalHeader = Terma & Privasi -legalNoticeTestPilot = Firefox Send adalah eksperimen Ujian Perintis, dan tertakluk kepada Terma Perkhidmatan dan Notis Privasi Ujian Perintis. Anda boleh ketahui selanjutnya perihal eksperimen ini dan pengumpulan data di sini. -legalNoticeMozilla = Penggunaan laman web Firefox Send juga tertakluk kepada Notis Privasi Laman web dan Terma Penggunaan Laman web Mozilla. +legalNoticeTestPilot = Send adalah eksperimen Ujian Perintis, dan tertakluk kepada Terma Perkhidmatan dan Notis Privasi Ujian Perintis. Anda boleh ketahui selanjutnya perihal eksperimen ini dan pengumpulan data di sini. +legalNoticeMozilla = Penggunaan laman web Send juga tertakluk kepada Notis Privasi Laman web dan Terma Penggunaan Laman web Mozilla. deletePopupText = Buang fail ini? deletePopupYes = Ya deletePopupCancel = Batal deleteButtonHover = Buang copyUrlHover = Salin URL -footerLinkLegal = Perundangan -// Test Pilot is a proper name and should not be localized. +# Test Pilot is a proper name and should not be localized. footerLinkAbout = Perihal Ujian Perintis -footerLinkPrivacy = Privasi footerLinkTerms = Terma -footerLinkCookies = Kuki requirePasswordCheckbox = Perlu kata laluan untuk memuat turun fail ini addPasswordButton = Tambah Kata laluan +changePasswordButton = Tukar passwordTryAgain = Kata laluan tidak betul. Cuba lagi. -// This label is followed by the password needed to download a file -passwordResult = Kata laluan: { $password } +reportIPInfringement = Lapor Pencerobohan IP +javascriptRequired = Send perlukan JavaScript +whyJavascript = Kenapa Send perlukan JavaScript? +enableJavascript = Sila dayakan JavaScript dan cuba lagi. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when a password is successfully set +passwordIsSet = Kata laluan ditetapkan +# A short status message shown when the user enters a long password +maxPasswordLength = Panjang kata laluan maksimum: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Kata laluan ini tidak boleh ditetapkan diff --git a/public/locales/nb-NO/send.ftl b/public/locales/nb-NO/send.ftl index 826cf5d0..93ca52ec 100644 --- a/public/locales/nb-NO/send.ftl +++ b/public/locales/nb-NO/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = netteksperiment -siteFeedback = Tilbakemelding -uploadPageHeader = Privat, kryptert fildeling -uploadPageExplainer = Send filer gjennom en sikker, privat og kryptert lenke som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid. -uploadPageLearnMore = Les mer -uploadPageDropMessage = Slipp din fil her for å starte opplastingen -uploadPageSizeMessage = For den mest problemfrie bruken, er det best å holde filen under 1 GB -uploadPageBrowseButton = Velg en fil på din datamaskin -uploadPageBrowseButton1 = Velg en fil til å laste opp -uploadPageMultipleFilesAlert = Opplasting av flere filer eller en mappe støttes ikke for øyeblikket. -uploadPageBrowseButtonTitle = Last opp fil -uploadingPageProgress = Laster opp { $filename } ({ $size }) +title = Send importingFile = Importerer… -verifyingFile = Verifiserer... encryptingFile = Krypterer... decryptingFile = Dekrypterer... -notifyUploadDone = Opplastingen din er ferdig. -uploadingPageMessage = Når filopplastingen din er ferdig, kan du angi utløpsalternativer. -uploadingPageCancel = Avbryt opplasting -uploadCancelNotification = Din opplasting ble avbrutt -uploadingPageLargeFileMessage = Denne filen er stor, og det kan ta litt tid å laste opp. Vent litt! -uploadingFileNotification = Varsle meg når opplastingen er ferdig. -uploadSuccessConfirmHeader = Klar til å sende -uploadSvgAlt = Last opp -uploadSuccessTimingHeader = Lenken til filen din utløper etter 1 nedlasting eller om 24 timer. -copyUrlFormLabelWithName = Kopier og del linken for å sende filen: { $filename } -copyUrlFormButton = Kopier til utklippstavle +downloadCount = + { $num -> + [one] 1 nedlasting + *[other] { $num } nedlastinger + } +timespanHours = + { $num -> + [one] 1 time + *[other] { $num } timer + } copiedUrl = Kopiert! -deleteFileButton = Slett fil -sendAnotherFileLink = Send en annen fil -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Last ned -downloadFileName = Last ned { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Skriv inn passord unlockInputPlaceholder = Passord unlockButtonLabel = Lås opp -downloadFileTitle = Last ned kryptert fil -// Firefox Send is a brand name and should not be localized. -downloadMessage = Din venn sender deg en fil med Firefox Send, en tjeneste som lar deg dele filer med en sikker, privat og kryptert lenke, som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Last ned -downloadNotification = Nedlastingen er fullført. downloadFinish = Nedlastingen er fullført. -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } av { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prøv Firefox Send -downloadingPageProgress = Laster ned { $filename } ({ $size }) -downloadingPageMessage = La denne fanen være åpen mens vi henter filen og dekrypterer den. -errorAltText = Opplastingsfeil +sendYourFilesLink = Prøv Send errorPageHeader = Det oppstod en feil. -errorPageMessage = Det har oppstått en feil under opplasting av filen. -errorPageLink = Send en annen fil fileTooBig = Filen er for stor til å laste opp. Det må være mindre enn { $size }. linkExpiredAlt = Lenke utløpt -expiredPageHeader = Denne lenken er utløpt eller har aldri eksistert i utgangspunktet! notSupportedHeader = Din nettleser er ikke støttet. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Dessverre støtter denne nettleseren ikke webteknologien som driver Firefox Send. Du må prøve en annen nettleser. Vi anbefaler Firefox! notSupportedLink = Hvorfor er ikke nettleseren min støttet? -notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Firefox Send. Du trenger å oppdatere nettleseren din. +notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Send. Du trenger å oppdatere nettleseren din. updateFirefox = Oppdater Firefox -downloadFirefoxButtonSub = Gratis nedlasting -uploadedFile = Fil -copyFileList = Kopier URL -// expiryFileList is used as a column header -expiryFileList = Utløper om -deleteFileList = Slett -nevermindButton = Glem det -legalHeader = Vilkår og personvern -legalNoticeTestPilot = Firefox Send er for øyeblikket et Test Pilot-eksperiment, og er underlagt Test Pilots tjenestevilkår og personvernbestemmelser. Du kan lære mer om dette eksperimentet og datainnsamlingen her. -legalNoticeMozilla = Bruk av Firefox Send-nettsiden er også underlagt Mozillas personvernbestemmelser for nettsider og brukervilkår for nettsider. -deletePopupText = Slette denne filen? -deletePopupYes = Ja deletePopupCancel = Avbryt deleteButtonHover = Slett -copyUrlHover = Kopier URL -footerLinkLegal = Juridisk informasjon -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Om Test Pilot -footerLinkPrivacy = Personvern -footerLinkTerms = Vilkår -footerLinkCookies = Infokapsler -requirePasswordCheckbox = Krever et passord for å laste ned denne filen -addPasswordButton = Legg til passord passwordTryAgain = Feil passord. Prøv igjen. -// This label is followed by the password needed to download a file -passwordResult = Passord: { $password } +javascriptRequired = Send krever JavaScript. +whyJavascript = Hvorfor krever Send JavaScript? +enableJavascript = Slå på JavaScript og prøv igjen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }t { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum passordlengde: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dette passordet kunne ikke settes + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildeling +introDescription = { -send-brand } lar deg dele filer via en tidsbegrenset lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samtidig være trygg på at filene dine ikke blir liggende på nettet for alltid. +notifyUploadEncryptDone = Filen din er kryptert og klar til å sende +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Utløper etter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutt + *[other] { $num } minutter + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dager + } +timespanWeeks = + { $num -> + [one] 1 uke + *[other] { $num } uker + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total størrelse: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopier lenken for å dele filen din: +copyLinkButton = Kopier lenke +downloadTitle = Last ned filer +downloadDescription = Denne filen ble delt via { -send-brand } med ende-til-ende-kryptering og en lenke som automatisk utløper. +trySendDescription = Prøv { -send-brand } for enkel, sikker fildeling. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Kun 1 fil kan lastes opp om gangen. + *[other] Kun { $count } filer kan lastes opp om gangen. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Kun 1 arkiv er tillatt. + *[other] Kun { $count } arkiver er tillatt. + } +expiredTitle = Denne lenken er utløpt. +notSupportedDescription = { -send-brand } virker ikke med denne nettleseren. { -send-short-brand } fungerer best med den nyeste versjonen av { -firefox }, og vil fungere med den nyeste versjonen av de fleste nettlesere. +downloadFirefox = Last ned { -firefox } +legalTitle = { -send-short-brand } Personvernerklæring +legalDateStamp = Versjon 1.0, datert den 12. mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m +addFilesButton = Velg filer du vil laste opp +uploadButton = Last opp +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dra og slipp filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klikk for å sende filer på opptil { $size } +addPassword = Beskytt med passord +emailPlaceholder = Skriv inn e-postadressen din +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logg inn for å sende opptil { $size } +signInOnlyButton = Logg inn +accountBenefitTitle = Opprett en { -firefox }-konto eller logg inn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Del filer på opptil { $size } +accountBenefitDownloadCount = Del filer med flere personer +accountBenefitTimeLimit = + { $count -> + [one] Hold lenker aktiv opptil 1 dag + *[other] Hold lenker aktiv opptil { $count } dager + } +accountBenefitSync = Behandle delte filer fra en hvilken som helst enhet +accountBenefitMoz = Les om andre { -mozilla }-tjenester +signOut = Logg ut +okButton = OK +downloadingTitle = Laster ned +noStreamsWarning = Denne nettleseren kan kanskje ikke dekryptere en så stor fil. +noStreamsOptionCopy = Kopier lenken for å åpne den i en annen nettleser +noStreamsOptionFirefox = Prøv favorittnettleseren vår +noStreamsOptionDownload = Fortsett med denne nettleseren +downloadFirefoxPromo = { -send-short-brand } presenteres for deg av den helt nye { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Del lenken til filen din: +shareLinkButton = Del lenke +# $name is the name of the file +shareMessage = Last ned ‹{ $name }› med { -send-brand }: enkel, trygg fildeling +trailheadPromo = Det finnes en måte å ta vare på personvernet ditt. Bruk Firefox. +learnMore = Les mer. diff --git a/public/locales/nl/send.ftl b/public/locales/nl/send.ftl index f60f97aa..15f091d4 100644 --- a/public/locales/nl/send.ftl +++ b/public/locales/nl/send.ftl @@ -1,91 +1,156 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webexperiment -siteFeedback = Feedback -uploadPageHeader = Privé, versleuteld bestanden delen -uploadPageExplainer = Stuur bestanden via een veilige, private en versleutelde koppeling die automatisch verloopt, zodat u zeker weet dat uw zaken niet onbeperkt online blijven. -uploadPageLearnMore = Meer info -uploadPageDropMessage = Sleep uw bestand hiernaartoe om het te uploaden -uploadPageSizeMessage = Voor de meest betrouwbare werking kunt u uw bestand het beste onder de 1 GB houden -uploadPageBrowseButton = Selecteer een bestand op uw computer -uploadPageBrowseButton1 = Selecteer een bestand om te uploaden -uploadPageMultipleFilesAlert = Het uploaden van meerdere bestanden of een map wordt momenteel niet ondersteund. -uploadPageBrowseButtonTitle = bestand uploaden -uploadingPageProgress = { $filename } ({ $size }) wordt geüpload +title = Send importingFile = Importeren… -verifyingFile = Verifiëren… encryptingFile = Versleutelen… -decryptingFile = Ontcijferen… -notifyUploadDone = Uw upload is voltooid. -uploadingPageMessage = Zodra uw bestand wordt geüpload, kunt u vervalopties instellen. -uploadingPageCancel = Uploaden annuleren -uploadCancelNotification = Uw upload is geannuleerd. -uploadingPageLargeFileMessage = Dit bestand is groot en het uploaden kan even duren. Even geduld… -uploadingFileNotification = Mij waarschuwen zodra het uploaden is voltooid -uploadSuccessConfirmHeader = Gereed voor verzending -uploadSvgAlt = Uploaden -uploadSuccessTimingHeader = De koppeling naar uw bestand zal na 1 download of 24 uur verlopen. -copyUrlFormLabelWithName = Kopieer en deel de koppeling om uw bestand te verzenden: { $filename } -copyUrlFormButton = Kopiëren naar klembord +decryptingFile = Ontsleutelen… +downloadCount = + { $num -> + [one] 1 download + *[other] { $num } downloads + } +timespanHours = + { $num -> + [one] 1 uur + *[other] { $num } uur + } copiedUrl = Gekopieerd! -deleteFileButton = Bestand verwijderen -sendAnotherFileLink = Nog een bestand verzenden -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Downloaden -downloadFileName = { $filename } downloaden -downloadFileSize = ({ $size }) -unlockInputLabel = Voer wachtwoord in unlockInputPlaceholder = Wachtwoord unlockButtonLabel = Ontgrendelen -downloadFileTitle = Versleuteld bestand downloaden -// Firefox Send is a brand name and should not be localized. -downloadMessage = Uw vriend(in) stuurt u een bestand met Firefox Send, een dienst waarmee u bestanden kunt verzenden met een veilige, private en versleutelde koppeling die automatisch verloopt, zodat u zeker weet dat uw zaken niet onbeperkt online blijven. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Downloaden -downloadNotification = Uw download is voltooid. downloadFinish = Downloaden voltooid -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } van { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send proberen -downloadingPageProgress = { $filename } ({ $size }) wordt gedownload -downloadingPageMessage = Laat dit tabblad geopend terwijl uw bestand wordt opgehaald en ontcijferd. -errorAltText = Uploadfout +sendYourFilesLink = Send proberen errorPageHeader = Er is iets misgegaan! -errorPageMessage = Er is een fout opgetreden bij het uploaden van het bestand. -errorPageLink = Nog een bestand verzenden fileTooBig = Dat bestand is te groot om te worden geüpload. Het moet kleiner zijn dan { $size }. linkExpiredAlt = Koppeling verlopen -expiredPageHeader = Deze koppeling is verlopen of heeft überhaupt nooit bestaan! notSupportedHeader = Uw browser wordt niet ondersteund. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Helaas ondersteunt deze browser de webtechnologie die Firefox Send gebruikt niet. U dient een andere browser te proberen. Firefox wordt aanbevolen! notSupportedLink = Waarom wordt mijn browser niet ondersteund? -notSupportedOutdatedDetail = Helaas ondersteunt deze versie van Firefox de webtechnologie die Firefox Send gebruikt niet. U dient uw browser bij te werken. +notSupportedOutdatedDetail = Helaas ondersteunt deze versie van Firefox de webtechnologie die Send gebruikt niet. U dient uw browser bij te werken. updateFirefox = Firefox bijwerken -downloadFirefoxButtonSub = Gratis download -uploadedFile = Bestand -copyFileList = URL kopiëren -// expiryFileList is used as a column header -expiryFileList = Verloopt over -deleteFileList = Verwijderen -nevermindButton = Maakt niet uit -legalHeader = Voorwaarden en privacy -legalNoticeTestPilot = Firefox Send is momenteel een Test Pilot-experiment en onderhevig aan de Servicevoorwaarden en Privacyverklaring van Test Pilot. Hier vindt u meer info over dit experiment en de gegevensverzameling ervan. -legalNoticeMozilla = Gebruik van de Firefox Send-website is ook onderhevig aan de Privacyverklaring voor websites en Servicevoorwaarden voor websites van Mozilla. -deletePopupText = Dit bestand verwijderen? -deletePopupYes = Ja deletePopupCancel = Annuleren deleteButtonHover = Verwijderen -copyUrlHover = URL kopiëren -footerLinkLegal = Juridisch -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Over Test Pilot -footerLinkPrivacy = Privacy -footerLinkTerms = Voorwaarden -footerLinkCookies = Cookies -requirePasswordCheckbox = Een wachtwoord vereisen om dit bestand te downloaden -addPasswordButton = Wachtwoord toevoegen +footerText = Niet gelieerd aan Mozilla of Firefox. +footerLinkDonate = Doneren +footerLinkCli = CLI +footerLinkDmca = DMCA +footerLinkSource = Broncode passwordTryAgain = Onjuist wachtwoord. Probeer het opnieuw. -// This label is followed by the password needed to download a file -passwordResult = Wachtwoord: { $password } +javascriptRequired = Send vereist JavaScript +whyJavascript = Waarom vereist Send JavaScript? +enableJavascript = Schakel JavaScript in en probeer het opnieuw. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }u { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximale wachtwoordlengte: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dit wachtwoord kon niet worden ingesteld + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Bestanden delen, eenvoudig en privé +introDescription = Met { -send-brand } kunt u bestanden delen met end-to-endversleuteling en een koppeling die automatisch verloopt. Hierdoor kunt u privé houden wat u wilt delen en er zeker van zijn dat uw zaken niet voor altijd online blijven. +notifyUploadEncryptDone = Uw bestand is versleuteld en klaar voor verzending +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Verloopt na { $downloadCount } of { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuut + *[other] { $num } minuten + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dagen + } +timespanWeeks = + { $num -> + [one] 1 week + *[other] { $num } weken + } +fileCount = + { $num -> + [one] 1 bestand + *[other] { $num } bestanden + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Totale grootte: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopieer de koppeling om uw bestand te delen: +copyLinkButton = Koppeling kopiëren +downloadTitle = Bestanden downloaden +downloadDescription = Dit bestand is gedeeld via { -send-brand } met end-to-endversleuteling en een koppeling die automatisch verloopt. +trySendDescription = Probeer { -send-brand } voor eenvoudig, veilig bestanden delen. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Er kan slechts één bestand tegelijk worden geüpload. + *[other] Er kunnen slechts { $count } bestanden tegelijk worden geüpload. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Slechts één archief is toegestaan. + *[other] Slechts { $count } archieven zijn toegestaan. + } +expiredTitle = Deze koppeling is verlopen. +notSupportedDescription = { -send-brand } werkt niet met deze browser. { -send-short-brand } werkt het beste met de nieuwste versie van { -firefox }, en werkt met de huidige versie van de meeste browsers. +downloadFirefox = { -firefox } downloaden +legalTitle = Privacybeleid van { -send-short-brand } +legalDateStamp = Versie 1.0 d.d. 12 maart 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }u { $minutes }m +addFilesButton = Selecteer te uploaden bestanden +uploadButton = Uploaden +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Versleep bestanden +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = of klik om tot { $size } te versturen +addPassword = Beveiligen met wachtwoord +emailPlaceholder = Voer uw e-mailadres in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Meld u aan om tot { $size } te versturen +signInOnlyButton = Aanmelden +accountBenefitTitle = Maak een { -firefox }-account of meld u aan +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bestanden tot { $size } delen +accountBenefitDownloadCount = Bestanden met meerdere personen delen +accountBenefitTimeLimit = + { $count -> + [one] Koppelingen tot één dag actief houden + *[other] Koppelingen tot { $count } dagen actief houden + } +accountBenefitSync = Gedeelde bestanden vanaf andere apparaten beheren +accountBenefitMoz = Info over andere services van { -mozilla } +signOut = Afmelden +okButton = OK +downloadingTitle = Downloaden +noStreamsWarning = Deze browser kan een bestand van deze omvang mogelijk niet ontcijferen. +noStreamsOptionCopy = Koppeling kopiëren om in een andere browser te openen +noStreamsOptionFirefox = Onze favoriete browser proberen +noStreamsOptionDownload = Doorgaan met deze browser +downloadFirefoxPromo = { -send-short-brand } wordt u aangeboden door het volledig vernieuwde { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Deel de koppeling naar uw bestand: +shareLinkButton = Koppeling delen +# $name is the name of the file +shareMessage = Download ‘{ $name }’ met { -send-brand }: eenvoudig, veilig bestanden delen +trailheadPromo = Er is een manier om uw privacy te beschermen. Doe mee met Firefox. +learnMore = Meer info. + +sponsoredByThunderbird = Gesponsord door Thunderbird diff --git a/public/locales/nn-NO/send.ftl b/public/locales/nn-NO/send.ftl index 391444e3..962991e7 100644 --- a/public/locales/nn-NO/send.ftl +++ b/public/locales/nn-NO/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = netteksperiment -siteFeedback = Tilbakemelding -uploadPageHeader = Privat, kryptert fildeling -uploadPageExplainer = Send filer gjennom ei sikker, privat og kryptert lenke som automatisk går ut, for å sikre at ting ikkje vert verande på nettet for alltid. -uploadPageLearnMore = Les meir -uploadPageDropMessage = Slepp fila di her for å starte opplastinga -uploadPageSizeMessage = For mest problemfrie bruk, er det best å halde fila under 1 GB -uploadPageBrowseButton = Vel ei fil på datamaskina di -uploadPageBrowseButton1 = Vel ei fil å laste opp -uploadPageMultipleFilesAlert = Opplasting av fleire filer eller ei mappe er for tida ikkje støtta. -uploadPageBrowseButtonTitle = Last opp fil -uploadingPageProgress = Lastar opp { $filename } ({ $size }) +title = Send importingFile = Importerer… -verifyingFile = Stadfestar… encryptingFile = Krypterer… decryptingFile = Dekrypterer... -notifyUploadDone = Opplastinga di er ferdig. -uploadingPageMessage = Når filopplastinga di er ferdig, kan du spesifisere utgått-alternativ. -uploadingPageCancel = Avbryt opplasting -uploadCancelNotification = Opplastinga di vart avbroten -uploadingPageLargeFileMessage = Denne fila er stor, og det kan ta litt tid å laste henne opp. Ver tolmodig! -uploadingFileNotification = Varsle meg når opplastinga er ferdig. -uploadSuccessConfirmHeader = Klår til å senda -uploadSvgAlt = Last opp -uploadSuccessTimingHeader = Lenka til fila di går ut etter 1 nedlasting eller om 24 timar. -copyUrlFormLabelWithName = Kopier og del lenka for å sende fila: { $filename } -copyUrlFormButton = Kopier til utklippstavla +downloadCount = + { $num -> + [one] 1 nedlasting + *[other] { $num } nedlastingar + } +timespanHours = + { $num -> + [one] 1 time + *[other] { $num } timar + } copiedUrl = Kopiert! -deleteFileButton = Slett fil -sendAnotherFileLink = Send ei anna fil -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Last ned -downloadFileName = Last ned { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Skriv inn passord unlockInputPlaceholder = Passord unlockButtonLabel = Lås opp -downloadFileTitle = Last ned kryptert fil -// Firefox Send is a brand name and should not be localized. -downloadMessage = Vennen din sender deg eni fil med Firefox Send, ei teneste som lar deg dele filer med ei sikker, privat og kryptert lenke, som automatisk går ut, for å sikre at ting ikkje vert verande på nettet for alltid. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Last ned -downloadNotification = Nedlastinga er fullført. downloadFinish = Nedlastinga er fullført. -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } av { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prøv Firefox Send -downloadingPageProgress = Lastar ned { $filename } ({ $size }) -downloadingPageMessage = La denne fana vere open mens vi hentar filen og dekrypterar henne. -errorAltText = Opplastingsfeil +sendYourFilesLink = Prøv Send errorPageHeader = Noko gjekk gale! -errorPageMessage = Dett oppstod ein feil under opplasting av fila. -errorPageLink = Send ei anna fil fileTooBig = Fila er for stor, og kan ikkje lastast opp. Ho må vere mindre enn { $size }. linkExpiredAlt = Lenka har gått ut -expiredPageHeader = Denne lenka har gått ut eller har aldri eksistert i utgangspunktet! notSupportedHeader = Nettlesaren din er ikkje støtta. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Diverre støttar denne nettlesaren ikkje webteknologien som driv Firefox Send. Du må prøve ein annan nettleser. Vi tilrår Firefox! notSupportedLink = Kvifor er ikkje nettlesaren min støtta? -notSupportedOutdatedDetail = Dessverre støttar ikkje denne versjonen av Firefox nett-teknologien som driv Firefox Send. Du må å oppdatere nettlesaren din. +notSupportedOutdatedDetail = Dessverre støttar ikkje denne versjonen av Firefox nett-teknologien som driv Send. Du må å oppdatere nettlesaren din. updateFirefox = Oppdater Firefox -downloadFirefoxButtonSub = Gratis nedlasting -uploadedFile = Fil -copyFileList = Kopier URL -// expiryFileList is used as a column header -expiryFileList = Går ut om -deleteFileList = Slett -nevermindButton = Gløym det -legalHeader = Vilkår og personvern -legalNoticeTestPilot = Firefox Send er for tida eit Test Pilot-eksperiment, og er underlagt tenestevilkåra og personvernvilkåra til Test Pilot. Du kan lære meir om dette eksperimentet og datainnsamlinga her. -legalNoticeMozilla = Bruk av Firefox Send-nettsida er også underlagt Mozillas personvernvilkår for nettsider og brukarvilkår for nettsider. -deletePopupText = Slette denne fila? -deletePopupYes = Ja deletePopupCancel = Avbryt deleteButtonHover = Slett -copyUrlHover = Kopier URL -footerLinkLegal = Juridisk informasjon -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Om Test Pilot -footerLinkPrivacy = Personvern -footerLinkTerms = Vilkår -footerLinkCookies = Infokapslar -requirePasswordCheckbox = Krev eit passord for å laste ned denne fila -addPasswordButton = Legg til passord passwordTryAgain = Feil passord. Prøv på nytt. -// This label is followed by the password needed to download a file -passwordResult = Passord: { $password } +javascriptRequired = Send krev JavaScript. +whyJavascript = Kvifor krev Send JavaScript? +enableJavascript = Slå på JavaScript og prøv igjen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }t { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum passordlengde: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dette passordet kunne ikkje stillast inn + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildeling +introDescription = { -send-brand } lèt deg dele filer via ei tidsavgrensa lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samstundes vere trygg på at det ikkje ligg på nettet for alltid. +notifyUploadEncryptDone = Fila di er kryptert og klar til å bli sendt +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Går ut etter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutt + *[other] { $num } minutt + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dagar + } +timespanWeeks = + { $num -> + [one] 1 veke + *[other] { $num } veker + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total storleik: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopier lenka for å dele fila di: +copyLinkButton = Kopier lenke +downloadTitle = Last ned filer +downloadDescription = Denne fila vart delt via { -send-brand }, med ende-til-ende-kryptering, og ei lenke som automatisk går ut. +trySendDescription = Prøv { -send-brand } for enkel og sikker fildeling. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Berre 1 fil kan lastast opp om gongen. + *[other] Berre { $count } filer kan lastast opp om gongen. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Berre 1 arkiv er lov. + *[other] Berre { $count } arkiv er lov. + } +expiredTitle = Denne lenka har gått ut. +notSupportedDescription = { -send-brand } fungerer ikkje med denne nettlesaren. { -send-short-brand } fungerer best med siste versjon av { -firefox } og med dei fleste andre nye nettlesarar. +downloadFirefox = Last ned { -firefox } +legalTitle = { -send-short-brand }, om personvernpraksis +legalDateStamp = Versjon 1.0, datert den 12 mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m +addFilesButton = Vel filer som skal lastast opp +uploadButton = Last opp +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dra og slepp filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klikk for å sende filer på opptil { $size } +addPassword = Vern med passord +emailPlaceholder = Skriv inn e-postadressa di +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logg inn for å sende filer på opptil { $size } +signInOnlyButton = Logg inn +accountBenefitTitle = Lag ein { -firefox }-konto eller logg inn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Del filer på opptil { $size } +accountBenefitDownloadCount = Del filer med fleire personar +accountBenefitTimeLimit = + { $count -> + [one] Hald lenka aktiv opptil 1 dag + *[other] Hald lenker aktive opptil { $count } dagar + } +accountBenefitSync = Handter delte filer frå kva som helst eining +accountBenefitMoz = Les om andre { -mozilla }-tenster +signOut = Logg ut +okButton = OK +downloadingTitle = Lastar ned +noStreamsWarning = Denne nettlesaren kan kanskje ikkje dekryptere ei så stor fil. +noStreamsOptionCopy = Kopier lenka for å opne henne i ein annan nettlesar +noStreamsOptionFirefox = Prøv favorittnettlesaren vår +noStreamsOptionDownload = Fortset med denne nettlesaren +downloadFirefoxPromo = { -send-short-brand } vert presentert for deg av den heilt nye { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Del lenka til fila di: +shareLinkButton = Del lenke +# $name is the name of the file +shareMessage = Last ned "{ $name }" med { -send-brand }: enkel, trygg fildelning +trailheadPromo = Det finst ein måte å ta vare på personvernet ditt. Ver med Firefox på ferda. +learnMore = Les meir. diff --git a/public/locales/oc/send.ftl b/public/locales/oc/send.ftl new file mode 100644 index 00000000..5dce3358 --- /dev/null +++ b/public/locales/oc/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Importacion… +encryptingFile = Chiframent… +decryptingFile = Deschiframent… +downloadCount = + { $num -> + [one] 1 telecargament + *[other] { $num } telecargaments + } +timespanHours = + { $num -> + [one] 1 ora + *[other] { $num } oras + } +copiedUrl = Copiat ! +unlockInputPlaceholder = Senhal +unlockButtonLabel = Desverrolhar +downloadButtonLabel = Telecargar +downloadFinish = Telecargament acabat +fileSizeProgress = ({ $partialSize } sus { $totalSize }) +sendYourFilesLink = Ensajar Send +errorPageHeader = I a quicòm que truca. +fileTooBig = Aqueste fichièr es tròp gròs per l’enviar. Sa talha deu èsser inferiora a { $size }. +linkExpiredAlt = Lo ligam a expirat +notSupportedHeader = Vòstre navegador es pas compatible. +notSupportedLink = Perqué mon navegador es pas compatible ? +notSupportedOutdatedDetail = Aquesta version de Firefox es pas compatibla amb la tecnologia web amb la quala fonciona Send. Vos cal metre a jorn lo navegador. +updateFirefox = Metre a jorn Firefox +deletePopupCancel = Anullar +deleteButtonHover = Suprimir +passwordTryAgain = Senhal incorrècte. Tornatz ensajar. +javascriptRequired = Send requesís JavaScript +whyJavascript = Perque Send requesís JavaScript ? +enableJavascript = Volgatz activar lo JavaScript e ensajatz tornamai. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Talha maximala del senhal : { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Aqueste senhal a pas pogut èsser definit + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partatge simple e privat de fichièrs +introDescription = { -send-brand } vos permet de partejar de fichièr amb un chiframent del cap a la fin e un ligam qu’expira automaticament. Atal podètz gardar privat çò que partejatz e vos assegurar que demorarà pas en linha per totjorn. +notifyUploadEncryptDone = Vòstre fichièr es chifrat e prèst per mandadís +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira aprèp { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuta + *[other] { $num } minutas + } +timespanDays = + { $num -> + [one] 1 jorn + *[other] { $num } jorns + } +timespanWeeks = + { $num -> + [one] 1 setmana + *[other] { $num } setmanas + } +fileCount = + { $num -> + [one] 1 fichièr + *[other] { $num } fichièrs + } +# byte abbreviation +bytes = o +# kibibyte abbreviation +kb = Ko +# mebibyte abbreviation +mb = Mo +# gibibyte abbreviation +gb = Go +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Talha totala : { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiatz lo ligam per partejar vòstre fichièr : +copyLinkButton = Copiar lo ligam +downloadTitle = Telecargar los fichièrs +downloadDescription = Aqueste fichièr foguèt partejat via { -send-brand } amb chiframent del cap a la fin e un ligam qu’expira automaticament. +trySendDescription = Ensajatz { -send-brand } per un partiment de fichièrs simple e segur. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Òm pòt pas qu’enviar 1 fichièr al còp. + *[other] Òm pòt pas qu’enviar { $count } fichièrs al còp. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Pas qu’un archiu es autorizat. + *[other] Pas que { $count } archius son autorizats. + } +expiredTitle = Aqueste ligam a expirat. +notSupportedDescription = { -send-brand } foncionarà pas amb aqueste navegador. { -send-short-brand } fonciona melhor amb la darrièra version de { -firefox } e foncionarà amb la version mai recenta de la màger part dels navegadors. +downloadFirefox = Telecargar { -firefox } +legalTitle = Avís de confidencialitat de { -send-short-brand } +legalDateStamp = Version 1.0 del 12 de març de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } j { $hours } h { $minutes } min +addFilesButton = Seleccionatz los fichièrs de mandar +uploadButton = Enviar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Lisatz-depausatz de fichièrs +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o clicatz per enviar fins a { $size } +addPassword = Protegir amb un senhal +emailPlaceholder = Picatz vòstra adreça electronica +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Connectatz-vos per enviar fins a { $size } +signInOnlyButton = Connexion +accountBenefitTitle = Creatz un compte { -firefox } o connectatz-vos +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partejatz de fichièrs fins a { $size } +accountBenefitDownloadCount = Partejatz de fichièrs amb mai de personas +accountBenefitTimeLimit = + { $count -> + [one] Mantenètz los ligams actius fins a 1 jorn + *[other] Mantenètz los ligams actius fins a { $count } jorns + } +accountBenefitSync = Gerissètz los fichièrs partejats de qualque siá periferic estant +accountBenefitMoz = Aprenètz-ne mai suls autres servicis { -mozilla } +signOut = Desconnexion +okButton = D'acòrd +downloadingTitle = Telecargament +noStreamsWarning = Pòt arribar qu’aqueste navegador pòsca pas deschifrar un fichièr tan gròs. +noStreamsOptionCopy = Copiatz lo ligam per lo dobrir dins un autre navegador +noStreamsOptionFirefox = Ensajatz nòstre navegador preferit +noStreamsOptionDownload = Contunhar amb aqueste navegador +downloadFirefoxPromo = Lo nòu { -firefox } vos provesís { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Partejatz lo ligam cap a vòstre fichièr : +shareLinkButton = Partejar lo ligam +# $name is the name of the file +shareMessage = Telecargar « { $name } » amb { -send-brand } : un biais simple e segur de partejar de fichièrs. +trailheadPromo = Existís un biais de protegir vòstra vida privada. Rejonhètz Firefox. +learnMore = Ne saber mai. diff --git a/public/locales/pa-IN/send.ftl b/public/locales/pa-IN/send.ftl new file mode 100644 index 00000000..b61e0a78 --- /dev/null +++ b/public/locales/pa-IN/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = ...ਦਰਾਮਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +encryptingFile = ...ਇੰਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +decryptingFile = ...ਡਿਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +downloadCount = + { $num -> + [one] 1 ਡਾਊਨਲੋਡ + *[other] { $num } ਡਾਊਨਲੋਡ + } +timespanHours = + { $num -> + [one] 1 ਘੰਟਾ + *[other] { $num } ਘੰਟੇ + } +copiedUrl = ਨਕਲ ਕੀਤਾ! +unlockInputPlaceholder = ਪਾਸਵਰਡ +unlockButtonLabel = ਅਣ-ਲਾਕ ਕਰੋ +downloadButtonLabel = ਡਾਊਨਲੋਡ ਕਰੋ +downloadFinish = ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ +fileSizeProgress = ({ $totalSize } ਵਿੱਚੋਂ { $partialSize }) +sendYourFilesLink = Send ਵਰਤੋ +errorPageHeader = ਕੁਝ ਗਲਤ ਵਾਪਰਿਆ! +fileTooBig = ਇਹ ਫਾਇਲ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਬਹੁਤ ਵੱਡੀ ਹੈ। ਇਸ { $size } ਤੋਂ ਘੱਟ ਚਾਹੀਦੀ ਹੈ +linkExpiredAlt = ਲਿੰਕ ਦੀ ਮਿਆਦ ਪੁੱਗੀ +notSupportedHeader = ਤੁਹਾਡਾ ਬਰਾਊਜ਼ਰ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। +notSupportedLink = ਮੇਰਾ ਬਰਾਊਜ਼ਰ ਸਹਾਇਕ ਕਿਉ ਨਹੀਂ ਹੈ? +notSupportedOutdatedDetail = ਅਫ਼ਸੋਸ ਹੈ ਕਿ ਫਾਇਰਫਾਕਸ ਦਾ ਇਹ ਵਰਜ਼ਨ ਵੈੱਬ ਤਕਨਾਲੋਜੀ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ, ਜੋ ਕਿ Send ਨੂੰ ਬਣਾਉਂਦੀਆਂ ਹਨ। ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ। +updateFirefox = ਫਾਇਰਫਾਕਸ ਅੱਪਡੇਟ ਕਰੋ +deletePopupCancel = ਰੱਦ ਕਰੋ +deleteButtonHover = ਹਟਾਓ +passwordTryAgain = ਗਲਤ ਪਾਸਵਰਡ ਹੈ। ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +javascriptRequired = Send ਲਈ ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਚਾਹੀਦੀ ਹੈ +whyJavascript = Send ਨੂੰ ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਦੀ ਲੋੜ ਕਿਓ ਹੈ? +enableJavascript = ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਸਮਰੱਥ ਕਰੋ ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ਘੰ { $minutes }ਮਿੰ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ਮਿੰ +# A short status message shown when the user enters a long password +maxPasswordLength = ਵੱਧ ਤੋਂ ਵੱਧ ਪਾਸਵਰਡ ਦੀ ਲੰਬਾਈ: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ਇਹ ਪਾਸਵਰਡ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = ਭੇਜੋ +-firefox = ਫਾਇਰਫਾਕਸ +-mozilla = ਮੋਜ਼ੀਲਾ +introTitle = ਸੌਖਾ, ਪ੍ਰਾਈਵੇਟ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ +introDescription = { -send-brand } ਤੁਹਾਨੂੰ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇੰਕ੍ਰਿਪਸ਼ਨ ਨਾਲ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰਨ ਦਿੰਦਾ ਹੈ ਅਤੇ ਲਿੰਕ ਦੀ ਮਿਆਦ ਆਪਣੇ ਆਪ ਪੁੱਗ ਜਾਂਦੀ ਹੈ। ਇਸ ਕਰਕੇ ਤੁਸੀਂ ਤੁਹਾਡੇ ਵਲੋਂ ਸਾਂਝੇ ਕੀਤੇ ਨੂੰ ਨਿੱਜੀ ਬਣਾਈ ਰੱਖਦੇ ਹੋ ਅਤੇ ਪੱਕਾ ਕਰਦੇ ਹੋ ਕਿ ਤੁਹਾਡਾ ਸਾਮਾਨ ਹਮੇਸ਼ਾਂ ਆਨਲਾਈਨ ਨਹੀਂ ਰਹਿੰਦਾ ਹੈ। +notifyUploadEncryptDone = ਤੁਹਾਡਾ ਫਾਇਲ ਇੰਕ੍ਰਿਪਟ ਕੀਤੀ ਗਈ ਤੇ ਭੇਜਣ ਲਈ ਤਿਆਰ ਹੈ +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } ਜਾਂ { $timespan } ਦੇ ਬਾਅਦ ਮਿਆਦ ਪੁੱਗਦੀ ਹੈ +timespanMinutes = + { $num -> + [one] 1 ਮਿੰਟ + *[other] { $num } ਮਿੰਟ + } +timespanDays = + { $num -> + [one] 1 ਦਿਨ + *[other] { $num } ਦਿਨ + } +timespanWeeks = + { $num -> + [one] 1 ਹਫ਼ਤਾ + *[other] { $num } ਹਫ਼ਤੇ + } +fileCount = + { $num -> + [one] 1 ਫ਼ਾਇਲ + *[other] { $num } ਫ਼ਾਇਲ + } +# byte abbreviation +bytes = ਬਾਈਟ +# kibibyte abbreviation +kb = ਕਿਲੋਬਾਈਟ +# mebibyte abbreviation +mb = ਮੈਗਾਬਾਈਟ +# gibibyte abbreviation +gb = ਗੀਗਾਬਾਈਟ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ਕੁੱਲ ਆਕਾਰ: { $size } +# the next line after the colon contains a file name +copyLinkDescription = ਆਪਣੀ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨ ਲਈ ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ: +copyLinkButton = ਲਿੰਕ ਕਾਪੀ ਕਰੋ +downloadTitle = ਫਾਇਲਾਂ ਡਾਊਨਲੋਡ ਕਰੋ +downloadDescription = ਇਹ ਫਾਇਲ ਨੂੰ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇੰਕ੍ਰਿਪਟ ਕਰਕੇ { -send-brand } ਸਾਂਝਾ ਕੀਤਾ ਗਿਆ ਸੀ ਅਤੇ ਲਿੰਕ ਆਪਣੇ-ਆਪ ਮਿਆਦ ਪੁੱਗਦੀ ਹੈ। +trySendDescription = ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰਨ ਲਈ { -send-brand } ਵਰਤ ਕੇ ਵੇਕੋ। +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ਇੱਕ ਵੇਲੇ ਸਿਰਫ਼ 1 ਫਾਇਲ ਹੀ ਅੱਪਲੋਡ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। + *[other] ਇੱਕ ਵੇਲੇ ਸਿਰਫ਼ { $count } ਫਾਇਲਾਂ ਨੂੰ ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] ਸਿਰਫ਼ 1 ਅਕਾਇਵ ਦੀ ਇਜਾਜ਼ਤ ਹੈ। + *[other] ਸਿਰਫ਼ { $count } ਅਕਾਇਵਾਂ ਦੀ ਇਜਾਜ਼ਤ ਹੈ। + } +expiredTitle = ਇਹ ਲਿੰਕ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੈ। +notSupportedDescription = { -send-brand } ਇਸ ਬਰਾਊਜ਼ਰ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦਾ ਹੈ। { -send-short-brand } { -firefox } ਦੇ ਨਵੇਂ ਵਰਜ਼ਨ ਨਾਲ ਸਭ ਤੋਂ ਵਧੀਆ ਕੰਮ ਕਰਦਾ ਹੈ ਅਤੇ ਬਹੁਤੇ ਬਰਾਊਜ਼ਰ ਦੇ ਮੌਜੂਦਾ ਵਰਜ਼ਨ ਨਾਲ ਕੰਮ ਕਰਦਾ ਹੈ। +downloadFirefox = { -firefox } ਡਾਊਨਲੋਡ ਕਰੋ +legalTitle = { -send-short-brand } ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ +legalDateStamp = ਵਰਜ਼ਨ 1.0, ਮਿਤੀ 12 ਮਾਰਚ 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ਦਿਨ { $hours } ਘੰ { $minutes } ਮਿੰ +addFilesButton = ਚੁਣੀਆਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ +uploadButton = ਅੱਪਲੋਡ ਕਰੋ +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ਫਾਇਲਾਂ ਖਿੱਚੋ ਅਤੇ ਸੁੱਟੋ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ਜਾਂ { $size } ਤੱਕ ਭੇਜਣ ਲਈ ਕਲਿੱਕ ਕਰੋ +addPassword = ਪਾਸਵਰਡ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ +emailPlaceholder = ਆਪਣੀ ਈਮੇਲ ਦਿਓ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size } ਤੱਕ ਭੇਜਣ ਲਈ ਸਾਇਨ ਅੱਪ ਕਰੋ +signInOnlyButton = ਸਾਇਨ ਇਨ +accountBenefitTitle = { -firefox } ਖਾਤਾ ਬਣਾਓ ਜਾਂ ਸਾਇਨ ਕਰੋ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } ਤੱਕ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰੋ +accountBenefitDownloadCount = ਹੋਰ ਲੋਕਾਂ ਨਾਲ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰੋ +accountBenefitTimeLimit = + { $count -> + [one] ਲਿੰਕਾਂ ਨੂੰ 1 ਦਿਨ ਲਈ ਸਰਗਰਮ ਰੱਖੋ + *[other] ਲਿੰਕਾਂ ਨੂੰ { $count } ਦਿਨਾਂ ਲਈ ਸਰਗਰਮ ਰੱਖੋ + } +accountBenefitSync = ਕਿਸੇ ਵੀ ਡਿਵਾਇਸ ਤੋਂ ਸਾਂਝੀਆਂ ਕੀਤੀਆਂ ਫਾਇਲਾਂ ਦਾ ਬੰਦੋਬਸਤ ਕਰੋ +accountBenefitMoz = ਹੋਰ { -mozilla } ਸੇਵਾਵਾਂ ਬਾਰੇ ਜਾਣੋ +signOut = ਸਾਈਨ ਆਉਟ +okButton = ਠੀਕ ਹੈ +downloadingTitle = ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +noStreamsWarning = ਇਹ ਬਰਾਊਜ਼ਰ ਨੂੰ ਇਸ ਵੱਡੀ ਫਾਇਲ ਨੂੰ ਡਿਕ੍ਰਿਪਟ ਕਰਨ ਲਈ ਸਮਰੱਥ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ। +noStreamsOptionCopy = ਹੋਰ ਬਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹਣ ਲਈ ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ +noStreamsOptionFirefox = ਸਾਡੇ ਮਨਪਸੰਦ ਬਰਾਊਜ਼ਰ ਵਰਤ ਕੇ ਵੇਖੋ +noStreamsOptionDownload = ਇਸ ਬਰਾਊਜ਼ਰ ਨਾਲ ਜਾਰੀ ਰੱਖੋ +downloadFirefoxPromo = { -send-short-brand } ਤੁਹਾਡੇ ਲਈ ਬਿਲਕੁਲ ਨਵਾਂ { -firefox } ਹੈ। +# the next line after the colon contains a file name +shareLinkDescription = ਆਪਣੀ ਫਾਇਲ ਲਈ ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ: +shareLinkButton = ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ +# $name is the name of the file +shareMessage = { -send-brand } ਨਾਲ "{ $name }" ਡਾਊਨਲੋਡ ਕਰੋ: ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ +trailheadPromo = ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਦੀ ਸੁਰੱਖਿਆ ਦਾ ਢੰਗ ਹੈ। ਫਾਇਰਫਾਕਸ ਨਾਲ ਜੁੜੋ। +learnMore = ਹੋਰ ਸਿੱਖੋ diff --git a/public/locales/pai/send.ftl b/public/locales/pai/send.ftl new file mode 100644 index 00000000..1cea95bc --- /dev/null +++ b/public/locales/pai/send.ftl @@ -0,0 +1,3 @@ + +## Send version 2 strings + diff --git a/public/locales/pl/send.ftl b/public/locales/pl/send.ftl new file mode 100644 index 00000000..5e474c44 --- /dev/null +++ b/public/locales/pl/send.ftl @@ -0,0 +1,158 @@ +title = Send +importingFile = Importowanie… +encryptingFile = Szyfrowanie… +decryptingFile = Odszyfrowywanie… +downloadCount = + { $num -> + [one] 1 pobraniu + [few] { $num } pobraniach + *[many] { $num } pobraniach + } +timespanHours = + { $num -> + [one] godzinie + [few] { $num } godzinach + *[many] { $num } godzinach + } +copiedUrl = Skopiowano +unlockInputPlaceholder = Hasło +unlockButtonLabel = Odblokuj +downloadButtonLabel = Pobierz +downloadFinish = Ukończono pobieranie +fileSizeProgress = ({ $partialSize } z { $totalSize }) +sendYourFilesLink = Wypróbuj Send +errorPageHeader = Coś się nie udało. +fileTooBig = Ten plik jest za duży, aby go wysłać. Musi być mniejszy niż { $size } +linkExpiredAlt = Odnośnik wygasł +notSupportedHeader = Używana przeglądarka nie jest obsługiwana. +notSupportedLink = Dlaczego ta przeglądarka nie jest obsługiwana? +notSupportedOutdatedDetail = Ta wersja Firefoksa nie obsługuje technologii internetowej, która napędza Send. Należy uaktualnić przeglądarkę. +updateFirefox = Uaktualnij Firefoksa +deletePopupCancel = Anuluj +deleteButtonHover = Usuń +passwordTryAgain = Niepoprawne hasło. Spróbuj ponownie. +javascriptRequired = Send wymaga języka JavaScript +whyJavascript = Dlaczego Send wymaga języka JavaScript? +enableJavascript = Włącz obsługę języka JavaScript i spróbuj ponownie. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } godz. { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Maksymalna długość hasła: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nie można ustawić tego hasła + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Proste, prywatne udostępnianie plików +introDescription = { -send-brand } umożliwia udostępnianie plików za pomocą szyfrowania typu „end-to-end” i odnośników, które automatycznie wygasają. Dzięki temu możesz mieć pewność, że to co udostępniasz jest bezpieczne i nie pozostanie w Internecie na zawsze. +notifyUploadEncryptDone = Plik jest zaszyfrowany i gotowy do wysłania +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Wygasa po { $downloadCount } lub { $timespan } +timespanMinutes = + { $num -> + [one] minucie + [few] { $num } minutach + *[many] { $num } minutach + } +timespanDays = + { $num -> + [one] dniu + [few] { $num } dniach + *[many] { $num } dniach + } +timespanWeeks = + { $num -> + [one] tygodniu + [few] { $num } tygodniach + *[many] { $num } tygodniach + } +fileCount = + { $num -> + [one] 1 plik + [few] { $num } pliki + *[many] { $num } plików + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Całkowity rozmiar: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Skopiuj odnośnik, aby udostępnić plik: +copyLinkButton = Kopiuj odnośnik +downloadTitle = Pobierz pliki +downloadDescription = Ten plik został udostępniony przez { -send-brand } za pomocą szyfrowania typu „end-to-end” i odnośnika, który automatycznie wygasa. +trySendDescription = Wypróbuj { -send-brand }, aby prosto i bezpiecznie udostępniać pliki. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Jednocześnie można wysyłać tylko jeden plik. + [few] Jednocześnie można wysyłać tylko { $count } pliki. + *[many] Jednocześnie można wysyłać tylko { $count } plików. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Dozwolone jest tylko jedno archiwum. + [few] Dozwolone są tylko { $count } archiwa. + *[many] Dozwolonych jest tylko { $count } archiwów. + } +expiredTitle = Ten odnośnik wygasł. +notSupportedDescription = { -send-brand } nie będzie działać w tej przeglądarce. { -send-short-brand } najlepiej działa w najnowszej wersji przeglądarki { -firefox }, ale będzie działać także w aktualnych wersjach większości przeglądarek. +downloadFirefox = Pobierz przeglądarkę { -firefox } +legalTitle = Zasady ochrony prywatności serwisu { -send-short-brand } +legalDateStamp = Wersja 1.0 z 12 marca 2019 r. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d. { $hours } godz. { $minutes } min +addFilesButton = Wybierz pliki do wysłania +uploadButton = Wyślij +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Przeciągnij pliki +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = lub kliknij, aby wysłać do { $size } +addPassword = Chroń hasłem +emailPlaceholder = Wpisz adres e-mail +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Zaloguj się, aby wysłać do { $size } +signInOnlyButton = Zaloguj się +accountBenefitTitle = Utwórz konto { -firefox } lub zaloguj się +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Udostępniaj pliki do { $size } +accountBenefitDownloadCount = Udostępniaj pliki większej liczbie osób +accountBenefitTimeLimit = + { $count -> + [one] Odnośniki aktywne przez jeden dzień + [few] Odnośniki aktywne przez { $count } dni + *[many] Odnośniki aktywne przez { $count } dni + } +accountBenefitSync = Zarządzaj udostępnionymi plikami z każdego urządzenia +accountBenefitMoz = Poznaj inne serwisy organizacji { -mozilla } +signOut = Wyloguj się +okButton = OK +downloadingTitle = Pobieranie +noStreamsWarning = Ta przeglądarka może nie być w stanie odszyfrować tak dużego pliku. +noStreamsOptionCopy = Skopiuj odnośnik, aby otworzyć w innej przeglądarce +noStreamsOptionFirefox = Wypróbuj naszą ulubioną przeglądarkę +noStreamsOptionDownload = Kontynuuj za pomocą tej przeglądarki +downloadFirefoxPromo = { -send-short-brand } jest oferowany przez zupełnie nową przeglądarkę { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Udostępnij odnośnik do pliku: +shareLinkButton = Udostępnij odnośnik +# $name is the name of the file +shareMessage = Pobierz „{ $name }” za pomocą { -send-brand }: prostego i bezpiecznego udostępniania plików +trailheadPromo = Jest sposób na ochronę swojej prywatności. Dołącz do Firefoksa. +learnMore = Więcej informacji. diff --git a/public/locales/ppl/send.ftl b/public/locales/ppl/send.ftl new file mode 100644 index 00000000..faab4594 --- /dev/null +++ b/public/locales/ppl/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Mukalaktia nemi… +encryptingFile = Tikichtakawiat tinemit… +decryptingFile = Tikichtakapuat tinemit… +downloadCount = + { $num -> + [one] temultijtuk + *[other] { $num } temultijtuk + } +timespanHours = + { $num -> + [one] oraj + *[other] { $num } oraj + } +copiedUrl = Muishkupintuk! +unlockInputPlaceholder = Ichtakatajkwilul +unlockButtonLabel = Shiktapua +downloadButtonLabel = Shiktemulti +downloadFinish = Senkiska mutemultij +fileSizeProgress = ({ $partialSize } ipal { $totalSize }) +sendYourFilesLink = Shikejeku Send +errorPageHeader = IJtakawtuk! +fileTooBig = Ini tajkwilul sujsul etek pal tiktejkultia. Ma nemi san { $size }. +linkExpiredAlt = Ne ilpika pulijtuk +notSupportedHeader = Te tikishmatit ne mutachialuni. +notSupportedLink = Taika te ankishmatit nutachialuni? +notSupportedOutdatedDetail = Ini tamakalis ipal Firefox tesu kimati ne tzawaltekitilis ne kiyulitia Send. Nemi pal tikyankwilia ne mutachialuni. +updateFirefox = Shikyankwili Firefox +deletePopupCancel = Shikilwi tesu +deleteButtonHover = Shikpulu +passwordTryAgain = Ne ichtakatajkwilul tesu yek. Shikejeku uksenpa. +javascriptRequired = Send muneki JavaScript +whyJavascript = Taika Send muneki JavaScript? +enableJavascript = Shichiwa ma JavaScript tekiti wan shikejeku uksenpa. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Ne iweyaka ne ichtakatajkwilul muneki: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Te tiweliket tiktaliat ini ichtakataketzalis + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Shiktitani +-firefox = Firefox +-mozilla = Mozilla +introTitle = Shikmajmaka se tajkwilul, te uij wan ichtaka +introDescription = { -send-brand } metzpalewia tikmajmaka se tajkwilul iwan taichtakawilis wan se ilpika puliwi nemanha. Yajika, tikpia muichtakayu pal tikmajmaka wan tesu naka senpa mutajtatka tik matapan. +notifyUploadEncryptDone = Ne archivoj nemi ichtakawijtuk wan weli tiktitania +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Puliwi kwak ajsi { $downloadCount } ush { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minutoj + *[other] { $num } minutoj + } +timespanDays = + { $num -> + [one] { $num } tunal + *[other] { $num } tunal + } +timespanWeeks = + { $num -> + [one] { $num } semanaj + *[other] { $num } semanaj + } +fileCount = + { $num -> + [one] { $num } tajkwilul + *[other] { $num } tajkwilul + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Itamachiwka: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Shikishkupina ne ilpika pal tikmajmaka mutajkwilul: +copyLinkButton = Shikishkupina ne ilpika +downloadTitle = Shiktemulti tajkwilul +downloadDescription = Ini tajkwilul kiski itech { -send-brand } iwan taichtakawilis wan se ilpika ka puliwi nemanha. +trySendDescription = Shikejeku { -send-brand } wan shiktakuli ichtaka wan te uij. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Semaya se tajkwilul weli pal tiktejkultia sansepa. + *[other] Semaya { $count } tajkwilul weli pal tiktejkultia sansepa. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Semaya se amapial weli mutitania. + *[other] Semaya { $count } amapial weli mutitania. + } +expiredTitle = Ne ilpika puliwik. +notSupportedDescription = { -send-brand } tesu yawi tekiti iwan ini tachialuni. { -send-short-brand } tekiti sujsul yek iwan ne tipan tamakalis ipal { -firefox }, wan nusan iwan ne tipan tamakalis ipal miak tachialuni. +downloadFirefox = Shiktemulti { -firefox } +legalTitle = { -send-short-brand } Tanawatilis ipanpa teichtakayu +legalDateStamp = Tamakalis 1.0, tik marzoj 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } t { $hours } h { $minutes } m +addFilesButton = Shikpejpena ne tajkwilul pal tiktejkultia +uploadButton = Shiktejkulti +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Shiktilana wan shikmayawi ne tajkwilul +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = u shikpachu pal tiktitania { $size } +addPassword = Shiktajpia iwan ichtakatajkwilul +emailPlaceholder = Shiktali mutepusamaw +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Shiktali mutukay pal tiktitania { $size } +signInOnlyButton = Shiktali mutukay +accountBenefitTitle = Shikchiwa se mutapujka tik { -firefox } ush shiktali mutukay +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Shiktakuli tajtajkwilul ka { $size } +accountBenefitDownloadCount = Shiktakuli tajtajkwilul iwan seuk +accountBenefitTimeLimit = + { $count -> + [one] Shikpia ne ilpika tapujtuk 1 tunal + *[other] Shikpia ne ilpika tapujtuk { $count } tunal + } +accountBenefitSync = Shiktajpia ne tajkwilul takulijtuk ka kanaj +accountBenefitMoz = Shikmati ipanpa ukse { -mozilla } tayekultilis +signOut = Shikisa +okButton = Yek +downloadingTitle = Kitemultia nemi +noStreamsWarning = Ini tachialuni anka te weli kichtakapua ini tajkwilul wey. +noStreamsOptionCopy = Shikishkupina ne ilpika pal tiktapua tik ukse tachialuni +noStreamsOptionFirefox = Shikejeku ne tachialuni tikishwelitat +noStreamsOptionDownload = Ma ninemi senpa iwan ini tachialuni +downloadFirefoxPromo = Ne yankwik { -firefox } metzwikilia { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Shiktakuli ne ilpika ipal mutajkwilul: +shareLinkButton = Shiktakuli ne ilpika +# $name is the name of the file +shareMessage = Shiktemulti “{ $name }” iwan { -send-brand }: ichtaka wan te uij +trailheadPromo = Nemi ken pal tiktajpia ne muichtakayu. Shimuishtuka iwan Firefox. +learnMore = Shimumachti ukchupi. diff --git a/public/locales/pt-BR/send.ftl b/public/locales/pt-BR/send.ftl index bd20960e..5bb78f71 100644 --- a/public/locales/pt-BR/send.ftl +++ b/public/locales/pt-BR/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Opinião -uploadPageHeader = Compartilhamento de arquivos privados e criptografados -uploadPageExplainer = Envie arquivos por meio de um link seguro, privado e criptografado que expira automaticamente para garantir que as suas coisas não permaneçam on-line para sempre. -uploadPageLearnMore = Saiba mais -uploadPageDropMessage = Arraste o arquivo para cá para iniciar o envio -uploadPageSizeMessage = Para uma operação mais confiável, é melhor manter seu arquivo menor que 1GB -uploadPageBrowseButton = Selecione um arquivo em seu computador -uploadPageBrowseButton1 = Selecione um arquivo para carregar -uploadPageMultipleFilesAlert = Enviar múltiplos arquivos ou uma pasta ainda não é suportado. -uploadPageBrowseButtonTitle = Enviar arquivo -uploadingPageProgress = Enviando { $filename } ({ $size }) +title = Send importingFile = Importando… -verifyingFile = Verificando… encryptingFile = Criptografando… decryptingFile = Descriptografando… -notifyUploadDone = Arquivo enviado. -uploadingPageMessage = Uma vez que seu arquivo seja enviado você poderá definir opções de expiração. -uploadingPageCancel = Cancelar envio -uploadCancelNotification = Você cancelou o envio. -uploadingPageLargeFileMessage = Esse arquivo é grande e pode demorar para ser enviado. Aguarde! -uploadingFileNotification = Me avise quando completar o envio. -uploadSuccessConfirmHeader = Pronto para enviar -uploadSvgAlt = Enviado -uploadSuccessTimingHeader = O link para o seu arquivo expirará após 1 download ou em 24 horas. -copyUrlFormLabelWithName = Copie e compartilhe o link para enviar o seu arquivo: { $filename } -copyUrlFormButton = Copiar para área de transferência +downloadCount = + { $num -> + [one] baixar 1 vez + *[other] baixar { $num } vezes + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } copiedUrl = Copiado! -deleteFileButton = Excluir arquivo -sendAnotherFileLink = Enviar outro arquivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Baixar -downloadFileName = Baixar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Insira a senha unlockInputPlaceholder = Senha unlockButtonLabel = Desbloquear -downloadFileTitle = Baixar arquivo criptografado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Seu amigo está te enviando um arquivo através do Firefox Send, um serviço que permite compartilhar arquivos com um link seguro, privado e criptografado que automaticamente expira para garantir que suas coisas não permaneçam on-line eternamente. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Baixar -downloadNotification = Seu download terminou. -downloadFinish = Download completo -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Download concluído fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Experimente o Firefox Send -downloadingPageProgress = Baixando { $filename } ({ $size }) -downloadingPageMessage = Por favor, deixe essa aba aberta enquanto buscamos seu arquivo e o descriptografamos. -errorAltText = Erro no envio +sendYourFilesLink = Experimente o Send errorPageHeader = Oops, ocorreu um erro! -errorPageMessage = Houve um erro ao enviar o arquivo. -errorPageLink = Enviar outro arquivo -fileTooBig = Esse arquivo é muito grande. Ele deve ser menor que { $size }. -linkExpiredAlt = Link expirou -expiredPageHeader = Esse link expirou, ou talvez nunca tenha existido! -notSupportedHeader = Seu navegador não tem suporte. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Infelizmente esse navegador não suporta a tecnologia utilizada pelo Firefox Send. Tente com outro navegador. Nós recomendamos o Firefox! ;-) +fileTooBig = Esse arquivo ou grupo de arquivos é grande demais para ser enviado. Deve ser menor que { $size }. +linkExpiredAlt = Link expirado +notSupportedHeader = Seu navegador não é suportado. notSupportedLink = Por que meu navegador não é suportado? -notSupportedOutdatedDetail = Infelizmente essa versão do Firefox não suporta a tecnologia web que faz o Firefox Send funcionar. Você precisa atualizar o seu navegador. +notSupportedOutdatedDetail = Infelizmente essa versão do Firefox não suporta a tecnologia web que faz o Send funcionar. Você precisa atualizar o seu navegador. updateFirefox = Atualizar o Firefox -downloadFirefoxButtonSub = Download gratuito -uploadedFile = Arquivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira em -deleteFileList = Excluir -nevermindButton = Esqueça -legalHeader = Termos e privacidade -legalNoticeTestPilot = Firefox Send é um experimento do Test Pilot, e sujeito aos Termos de Serviço e Políticas de Privacidade do Test Pilot. Você pode aprender mais sobre esse experimento e a coleta de dados aqui. -legalNoticeMozilla = O uso do site Firefox Send também está sujeito a Política de Privacidade e ao Termos de Uso de Sites da Mozilla. -deletePopupText = Excluir este arquivo? -deletePopupYes = Sim deletePopupCancel = Cancelar -deleteButtonHover = Excluir -copyUrlHover = Copiar URL -footerLinkLegal = Jurídico -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Sobre o Test Pilot -footerLinkPrivacy = Privacidade -footerLinkTerms = Termos -footerLinkCookies = Cookies -requirePasswordCheckbox = Para baixar esse arquivo é necessário uma senha -addPasswordButton = Adicionar senha +deleteButtonHover = Remover da lista passwordTryAgain = Senha incorreta. Tente novamente. -// This label is followed by the password needed to download a file -passwordResult = Senha: { $password } +javascriptRequired = O Send requer JavaScript +whyJavascript = Por que o Send precisa do JavaScript? +enableJavascript = Ative o JavaScript e tente novamente. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }min +# A short status message shown when the user enters a long password +maxPasswordLength = Tamanho máximo da senha: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Essa senha não pôde ser definida + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartilhamento de arquivos fácil e privativo +introDescription = O { -send-brand } permite compartilhar arquivos com criptografia de ponta a ponta através de um link que expira automaticamente. Assim você pode proteger o que compartilha e ter certeza que suas coisas não ficarão online para sempre. +notifyUploadEncryptDone = Seu arquivo foi criptografado e está pronto para ser enviado +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira após { $downloadCount } ou { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 dia + *[other] { $num } dias + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 arquivo + *[other] { $num } arquivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamanho total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copie o link para compartilhar seu arquivo: +copyLinkButton = Copiar link +downloadTitle = Baixar arquivos +downloadDescription = Este arquivo foi compartilhado via { -send-brand } com criptografia de ponta a ponta e um link que expira automaticamente. +trySendDescription = Experimente o { -send-brand } para compartilhar arquivos com simplicidade e segurança. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Somente 1 arquivo pode ser enviado por vez. + *[other] Somente { $count } arquivos podem ser enviados por vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Só é permitido 1 pacote. + *[other] Só são permitidos { $count } pacotes. + } +expiredTitle = Este link expirou. +notSupportedDescription = O { -send-brand } não funciona com este navegador. O { -send-short-brand } funciona melhor com a versão mais recente do { -firefox } e funcionará com a versão atual da maioria dos navegadores. +downloadFirefox = Baixar o { -firefox } +legalTitle = Aviso de privacidade do { -send-short-brand } +legalDateStamp = Versão 1.0, de 12 de março de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selecionar arquivos para enviar +uploadButton = Enviar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arraste e solte arquivos aqui +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ou clique para enviar até { $size } +addPassword = Proteger com senha +emailPlaceholder = Informe seu e-mail +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Entre na sua conta para enviar até { $size } +signInOnlyButton = Entrar +accountBenefitTitle = Crie uma Conta { -firefox } ou entre se já tiver +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartilhe arquivos até { $size }. +accountBenefitDownloadCount = Compartilhe arquivos com mais pessoas. +accountBenefitTimeLimit = + { $count -> + [one] Mantenha links ativos por até 1 dia. + *[other] Mantenha links ativos por até { $count } dias. + } +accountBenefitSync = Gerencie arquivos compartilhados a partir de qualquer dispositivo. +accountBenefitMoz = Conheça outros serviços da { -mozilla }. +signOut = Sair +okButton = OK +downloadingTitle = Baixando +noStreamsWarning = Este navegador pode não conseguir descriptografar um arquivo tão grande. +noStreamsOptionCopy = Copiar o link para abrir em outro navegador +noStreamsOptionFirefox = Experimente nosso navegador preferido +noStreamsOptionDownload = Continuar com este navegador +downloadFirefoxPromo = O { -send-short-brand } é apresentado pelo novo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Compartilhe o link para o seu arquivo: +shareLinkButton = Compartilhar link +# $name is the name of the file +shareMessage = Baixe "{ $name }" com o { -send-brand }: compartilhamento de arquivos simples e seguro +trailheadPromo = Existe um meio de proteger sua privacidade. Use o Firefox. +learnMore = Saiba mais. diff --git a/public/locales/pt-PT/send.ftl b/public/locales/pt-PT/send.ftl index b6d1fc13..be03a258 100644 --- a/public/locales/pt-PT/send.ftl +++ b/public/locales/pt-PT/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experiência web -siteFeedback = Feedback -uploadPageHeader = Partilha de ficheiros privada e encriptada -uploadPageExplainer = Envie ficheiros através de uma ligação segura, privada e encriptada que expira automaticamente para garantir que as suas coisas não fiquem online para sempre. -uploadPageLearnMore = Saber mais -uploadPageDropMessage = Largue o seu ficheiro aqui para começar a carregar -uploadPageSizeMessage = Para uma operação mais confiável, é melhor manter o seu ficheiro abaixo de 1GB -uploadPageBrowseButton = Selecionar um ficheiro no seu computador -uploadPageBrowseButton1 = Selecione um ficheiro a enviar -uploadPageMultipleFilesAlert = Carregar múltiplos ficheiros ou uma pasta não é atualmente suportado. -uploadPageBrowseButtonTitle = Carregar ficheiro -uploadingPageProgress = A carregar { $filename } ({ $size }) +title = Send importingFile = A importar... -verifyingFile = A verificar... encryptingFile = A encriptar... decryptingFile = A desencriptar... -notifyUploadDone = O seu carregamento terminou. -uploadingPageMessage = Assim que o seu ficheiro carregar irá poder definir as opções de expiração. -uploadingPageCancel = Cancelar carregamento -uploadCancelNotification = O seu carregamento foi cancelado. -uploadingPageLargeFileMessage = Este ficheiro é grande e pode demorar um pouco a carregar. Fique onde está! -uploadingFileNotification = Notificar-me quando o carregamento estiver completo. -uploadSuccessConfirmHeader = Pronto para enviar -uploadSvgAlt = Carregar -uploadSuccessTimingHeader = A ligação para o seu ficheiro irá expirar depois de 1 descarga ou em 24 horas. -copyUrlFormLabelWithName = Copie e partilhe a ligação para enviar o seu ficheiro: { $filename } -copyUrlFormButton = Copiar para a área de transferência +downloadCount = + { $num -> + [one] 1 transferência + *[other] { $num } transferências + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } copiedUrl = Copiado! -deleteFileButton = Apagar ficheiro -sendAnotherFileLink = Enviar outro ficheiro -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descarregar -downloadFileName = Descarregar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Digitar palavra-passe unlockInputPlaceholder = Palavra-passe unlockButtonLabel = Desbloquear -downloadFileTitle = Descarregar ficheiro encriptado -// Firefox Send is a brand name and should not be localized. -downloadMessage = O seu amigo está a enviar-lhe um ficheiro com o Firefox Send, um serviço que lhe permite partilhar ficheiro com uma ligação segura, privada e encriptada que expira automaticamente para garantir que as suas coisas não fiquem online para sempre. -// Text and title used on the download link/button (indicates an action). -downloadButtonLabel = Descarregar -downloadNotification = A sua descarga foi completada. -downloadFinish = Descarga completada -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadButtonLabel = Transferir +downloadFinish = Transferência concluída fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Tentar o Firefox Send -downloadingPageProgress = A descarregar { $filename } ({ $size }) -downloadingPageMessage = Por favor deixe este separador aberto enquanto obtemos o seu ficheiro e o desencriptamos. -errorAltText = Erro ao carregar +sendYourFilesLink = Experimentar o Send errorPageHeader = Algo correu mal. -errorPageMessage = Houve um erro ao carregar o ficheiro. -errorPageLink = Enviar outro ficheiro fileTooBig = Esse ficheiro é muito grande para carregar. Deve ser menor do que { $size }. linkExpiredAlt = Ligação expirada -expiredPageHeader = Esta ligação expirou ou nunca existiu em primeiro lugar! notSupportedHeader = O seu navegador não é suportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Infelizmente este navegador não suporta a tecnologia web que faz o Firefox Send funcionar. Irá precisar de tentar outro navegador. Nós recomendamos o Firefox! notSupportedLink = Porque é que o meu navegador não é suportado? -notSupportedOutdatedDetail = Infelizmente esta versão do Firefox não suporta a tecnologia web que faz o Firefox Send funcionar. Precisa de atualizar o seu navegador. +notSupportedOutdatedDetail = Infelizmente esta versão do Firefox não suporta a tecnologia web que faz o Send funcionar. Precisa de atualizar o seu navegador. updateFirefox = Atualizar o Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Ficheiro -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira em -deleteFileList = Apagar -nevermindButton = Esquecer -legalHeader = Termos e privacidade -legalNoticeTestPilot = O Firefox Send é atualmente uma experiência do Test Pilot, e sujeita aos Termos de serviço e Aviso de privacidade do Test Pilot. Pode saber mais acerca desta experiência e a sua recolha de dados aqui. -legalNoticeMozilla = A utilização do website do Firefox Send está também sujeita ao Aviso de privacidade dos websites e Termos de serviço dos websites da Mozilla. -deletePopupText = Apagar este ficheiro? -deletePopupYes = Sim deletePopupCancel = Cancelar deleteButtonHover = Apagar -copyUrlHover = Copiar URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca do Test Pilot -footerLinkPrivacy = Privacidade -footerLinkTerms = Termos -footerLinkCookies = Cookies -requirePasswordCheckbox = Requerer uma palavra-passe para descarregar este ficheiro -addPasswordButton = Adicionar palavra-passe passwordTryAgain = Palavra-passe incorreta. Tente novamente. -// This label is followed by the password needed to download a file -passwordResult = Palavra-passe: { $password } +javascriptRequired = O Send requer JavaScript +whyJavascript = Porque é que o Send requer JavaScript? +enableJavascript = Por favor ative o JavaScript e tente novamente. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Comprimento máximo de palavra-passe: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Esta palavra-passe não pôde ser definida + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partilha de ficheiros simples e privada +introDescription = O { -send-brand } permite partilhar ficheiros com encriptação de ponta a ponta e uma ligação que expira automaticamente. Para que possa manter o que partilha privado e garantir que as suas coisas não fiquem online para sempre. +notifyUploadEncryptDone = O seu ficheiro está encriptado e pronto a enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira após { $downloadCount } ou { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 dia + *[other] { $num } dias + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 ficheiro + *[other] { $num } ficheiros + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamanho total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copie a ligação para partilhar o seu ficheiro: +copyLinkButton = Copiar ligação +downloadTitle = Transfira ficheiros +downloadDescription = Este ficheiro foi partilhado via { -send-brand } com encriptação de ponta a ponta e uma ligação que expira automaticamente. +trySendDescription = Experimente o { -send-brand } para uma partilha de ficheiros simples e segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Apenas 1 ficheiro pode ser carregado de cada vez. + *[other] Apenas { $count } ficheiros podem ser carregados de cada vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Apenas 1 ficheiro é permitido. + *[other] Apenas { $count } ficheiros são permitidos. + } +expiredTitle = Esta ligação expirou. +notSupportedDescription = O { -send-brand } não funciona com este navegador. O { -send-short-brand } funciona melhor com a versão mais recente do { -firefox } e irá funcionar com a versão atual da maioria dos navegadores. +downloadFirefox = Transferir o { -firefox } +legalTitle = Aviso de privacidade do { -send-short-brand } +legalDateStamp = Versão 1.0, de 12 de março de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selecionar ficheiros para carregar +uploadButton = Carregar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arraste e largue ficheiros +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ou clique para enviar até { $size } +addPassword = Proteger com palavra-passe +emailPlaceholder = Introduzir o seu email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Iniciar sessão para enviar até { $size } +signInOnlyButton = Iniciar sessão +accountBenefitTitle = Crie uma Conta { -firefox } ou inicie sessão +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partilhe ficheiros até { $size } +accountBenefitDownloadCount = Partilhe ficheiros com mais pessoas +accountBenefitTimeLimit = + { $count -> + [one] Mantenha ligações ativas até 1 dia + *[other] Mantenha ligações ativas até { $count } dias + } +accountBenefitSync = Gira ficheiros partilhas a partir de qualquer dispositivo +accountBenefitMoz = Saiba mais acerca de outros serviços da { -mozilla } +signOut = Terminar sessão +okButton = OK +downloadingTitle = A transferir +noStreamsWarning = Este navegador pode não conseguir desencriptar um ficheiro tão grande. +noStreamsOptionCopy = Copie a ligação para abrir noutro navegador +noStreamsOptionFirefox = Experimente o nosso navegador favorito +noStreamsOptionDownload = Continuar com este navegador +downloadFirefoxPromo = O { -send-short-brand } é trazido a si pelo novo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Partilhe a ligação para o seu ficheiro: +shareLinkButton = Partilhar ligação +# $name is the name of the file +shareMessage = Transferir “{ $name }“ com o { -send-brand }: partilha de ficheiros simples e segura +trailheadPromo = Existe um modo para proteger a sua privacidade. Adira ao Firefox. +learnMore = Saiba mais. diff --git a/public/locales/quc/send.ftl b/public/locales/quc/send.ftl new file mode 100644 index 00000000..6bedc49b --- /dev/null +++ b/public/locales/quc/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Ujek'ik… +encryptingFile = Uwiqik… +decryptingFile = Usolik… +downloadCount = + { $num -> + [one] 1 uqasaxik + *[other] { $num } taq uqasaxik + } +timespanHours = + { $num -> + [one] 1 ramaj + *[other] { $num } taq ramaj + } +copiedUrl = Copied! +unlockInputPlaceholder = Retokib'al +unlockButtonLabel = Utzoqopixik +downloadButtonLabel = Uqasaxik +downloadFinish = Tz'aqat uqasaxik +fileSizeProgress = ({ $partialSize } rech { $totalSize }) +sendYourFilesLink = Chak'amb'ejaj Send +errorPageHeader = K'o man utz ta xub'ano +fileTooBig = Le kemk'olib'al sib'alaj nim chech upaqab'isaxik. Rajawaxik nitz' chi uwach{ $size } +linkExpiredAlt = Xq'ax uq'ijol kemwiqb'al +notSupportedHeader = Man toq'am ta le anik'onel +notSupportedLink = ¿Jasche man toq'am ta le nunik'onel? +notSupportedOutdatedDetail = Chakuyu' we okib'al rech Firefox man kutoq'aj ta le k'ak'eta'm rech web' le kuya' uchuq'ab' Send. Rajawaxik kak'ak'arisaj le anik'onel. +updateFirefox = Chak'ak'arisaj Firefox +deletePopupCancel = Uq'atexik +deleteButtonHover = Uchupik +passwordTryAgain = Man utz ta le retokib'al. Chab'ana' chi jumul. +javascriptRequired = Le Send kajawataj JavaScript chech +whyJavascript = ¿jasche kajawataj JavaScript chech Send? +enableJavascript = Chatzija' JavaScript k'ate k'u ri' chab'ana' chi jumul. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Nimalaj unimal retokib'al: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Man kkowimb'ex ta ujeqeb'axik le retokib'al + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Utaqik +-firefox = Firefox +-mozilla = Mozilla +introTitle = Man k'ax taj, ukomonexik taq kemk'olib'al pa echeb'alil +introDescription = { -send-brand } kuya' bé chi awech kakomonej taq kemk'olib'al ruk' wiqitajem chi'l jun kemwiqb'al le kq'ax uq'ijol pa utukelam. Are chi man katzaq ta le kakomone'j pa echeb'alil chi'l chasuk'ub'a' rilik chi le taq ajastaq man kk'oji' ta pa nimk'atz pa junelik. +notifyUploadEncryptDone = Le akemk'olib'al wiqitalik chi'l utz chi kataqo +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Kq'ax uq'ijol chi rij { $downloadCount } on { $timespan } +timespanMinutes = + { $num -> + [one] 1 kajb'al + *[other] { $num } taq kajb'al + } +timespanDays = + { $num -> + [one] 1 q'ij + *[other] { $num } taq q'ij + } +timespanWeeks = + { $num -> + [one] 1 wuqq'ij + *[other] { $num } taq wuqq'ij + } +fileCount = + { $num -> + [one] 1 kemk'olib'al + *[other] { $num } taq kemk'olib'al + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ronojel unimal: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Chawinaqirisaj uwach le kemwiqb'al chech ukomone'xik le akemk'olib'al: +copyLinkButton = Relesaxik uwach kemwiqb'al +downloadTitle = Uqasaxik taq kemwiqb'al +downloadDescription = We kemk'olib'al xkomone'x pa { -send-brand } ruk' wiqitajem pa xkut chi xkut chi'l jun kemwiqb'al le kq'ax uq'ijol pa utukelam. +trySendDescription = Chak'amb'ejaj { -send-brand } chech man k'ax taj, ukomonexik kemk'olib'al pa chajib'al. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Xa 1 kemk'olib'al kkowinb'ex upaqab'isaxik pa jun uq'ijol. + *[other] Xew { $count } taq kemk'olib'al kkowinb'ex upaqab'isaxik pa jun uq'ijol. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Xew 1 kemk'olib'al ya'om b'e chech. + *[other] Xew { $count } taq kemk'olib'al ya'om b'e chech + } +expiredTitle = Xq'ax uq'ijol we kemwiqb'al +notSupportedDescription = { -send-brand } man kchakun ta ruk' we nik'onel. { -send-short-brand } are qas utz uchakunem ruk' le maja naj okib'al rech { -firefox }, xuquje' kchakun ruk' le okib'al rech chanim rech nima ronojel taq nik'onelab'. +downloadFirefox = Uqasaxik { -firefox } +legalTitle = { -send-short-brand } ub'ixikil rech echeb'alil +legalDateStamp = Okib'al 1.0, uq'ijol rech urox ik' 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Ucha'ik taq kemk'olib'al chech upaqab'isaxik +uploadButton = Upaqab'isaxik +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Uchararexik chi'l utzoqopixik taq kemk'olib'al +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = on chapitz'a' chech utaqik chech { $size } +addPassword = Chajital rumal retokib'al +emailPlaceholder = Chach'apa' le ataqoqxa'nib'al +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Chamajij kemchak chech utaqik chech { $size } +signInOnlyButton = Chamajij kemchak +accountBenefitTitle = Chawinaqirisaj jun { -firefox } kemb'i'aj on chamajij kemchak +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Chakomone'j taq kemk'olib'al kq'ax pa uwi' { $size } +accountBenefitDownloadCount = Chakomone'j taq kemk'olib'al kuk' nik'aj chi winaq +accountBenefitTimeLimit = + { $count -> + [one] Chatzija' taq kemwiqb'al are chi kq'ax pa uwi' 1 q'ij + *[other] Chatzija' taq kemwiqb'al are chi kq'ax pa uwi' { $count } taq q'ij + } +accountBenefitSync = Chawilawachij komone'tal taq kemk'olib'al pa apachike wiqkemchakub'al +accountBenefitMoz = Chaweta'maj chi rij jun chi { -mozilla } taq patanib'al +signOut = Chatz'apij kemchak +okButton = Ja'e +downloadingTitle = Ktajin uqasaxik +noStreamsWarning = We nik'onel wene man kkowin taj kusol jun jewa' unimal kemk'olib'al +noStreamsOptionCopy = Chawelesaj uwach le kemwiqb'al chech ujaqik jun chi nik'onel +noStreamsOptionFirefox = Chak'amb'ejaj le ajawatal nik'onel +noStreamsOptionDownload = Chab'ana' na ruk' we nik'onel +downloadFirefoxPromo = { -send-short-brand } k'amom la chi awech rumal le k'ak' { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Chakomone'j le kemwiqb'al chech le akemk'olib'al: +shareLinkButton = Chakomone'j kemwiqb'al +# $name is the name of the file +shareMessage = Chaqasaj “{ $name }” ruk' { -send-brand }: man k'ax ta ub'anik, ukomone'xik kemk'olib'al pa chajib'al +trailheadPromo = K'o jun ub'e'al chech uchajixik le a'echeb'alil. Chat'iqa' awib' pa. Firefox. +learnMore = Chaweta'maj nik'aj chik diff --git a/public/locales/ro/send.ftl b/public/locales/ro/send.ftl index 9d487b64..b954da60 100644 --- a/public/locales/ro/send.ftl +++ b/public/locales/ro/send.ftl @@ -1,76 +1,158 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = un experiment web -siteFeedback = Feedback -uploadPageHeader = Partajare de fișiere privată și criptată -uploadPageLearnMore = Află mai multe -uploadPageDropMessage = Aruncă fișierul aici pentru a începe încărcarea. -uploadPageBrowseButton = Alege un fișier din calculator. -uploadPageBrowseButton1 = Selectează un fișier pentru încărcare -uploadPageMultipleFilesAlert = Încărcarea mai multor fișiere deodată sau a dosarelor nu este suportată. -uploadPageBrowseButtonTitle = Încarcă fișier -uploadingPageProgress = Se încarcă { $filename } ({ $size }) +title = Send importingFile = Se importă… -verifyingFile = Se verifică... encryptingFile = Se criptează… decryptingFile = Se decriptează… -notifyUploadDone = Încărcarea s-a finalizat. -uploadingPageMessage = -uploadingPageCancel = Anulează încărcarea -uploadCancelNotification = Încărcarea a fost anulată. -uploadingPageLargeFileMessage = Stai calm! Acest fișier este mare. S-ar putea să dureze un timp încărcarea. -uploadingFileNotification = Notifică-mă când încărcarea este încheiată. -uploadSuccessConfirmHeader = Pregătit pentru trimitere -uploadSvgAlt = Încarcă -uploadSuccessTimingHeader = Linkul către fișierul tău va expira după 1 descărcare sau în 24 de ore. -copyUrlFormButton = Copiază în clipboard +downloadCount = + { $num -> + [one] 1 descărcare + [few] { $num } descărcări + *[other] { $num } de descărcări + } +timespanHours = + { $num -> + [one] 1 oră + [few] { $num } ore + *[other] { $num } de ore + } copiedUrl = Copiat! -deleteFileButton = Șterge fișierul -sendAnotherFileLink = Trimite un alt fișier -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descarcă -downloadFileName = Descarcă { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Introdu parola unlockInputPlaceholder = Parolă unlockButtonLabel = Deblochează -downloadFileTitle = Descarcă fișierul criptat -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descarcă -downloadNotification = Descărcarea s-a încheiat. downloadFinish = Descărcare încheiată -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } din { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Încearcă Firefox Send -downloadingPageProgress = Se descarcă { $filename } ({ $size }) -errorAltText = Eroare la încărcare -errorPageHeader = Ceva a mers prost! -errorPageMessage = A apărut o eroare la încărcarea fișierului. -errorPageLink = Trimite un alt fișier -fileTooBig = Acest fișier este prea mare. Trebuie să fie sub { $size }. +sendYourFilesLink = Încearcă Send +errorPageHeader = Ceva nu a funcționat! +fileTooBig = Acest fișier este prea mare. Ar trebuie să fie sub { $size }. linkExpiredAlt = Link expirat -expiredPageHeader = Acest link a expirat sau nu a existat de la bun început! notSupportedHeader = Browserul tău nu este suportat. notSupportedLink = De ce browserul meu nu este suportat? +notSupportedOutdatedDetail = Din păcate, această versiune de Firefox nu suportă tehnologiile web din spatele Send. Va trebui să actualizezi browserul. updateFirefox = Actualizează Firefox -downloadFirefoxButtonSub = Descărcare gratuită -uploadedFile = Fișier -copyFileList = Copiază URL-ul -// expiryFileList is used as a column header -expiryFileList = Expiră în -deleteFileList = Șterge -nevermindButton = Uită -legalHeader = Termeni de utilizare și politica de confidențialitate -deletePopupText = Ștergi aceast fișier? -deletePopupYes = Da deletePopupCancel = Renunță deleteButtonHover = Șterge -copyUrlHover = Copiază URL-ul -footerLinkLegal = Mențiuni legale -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Despre Test Pilot -footerLinkPrivacy = Confidențialitate -footerLinkTerms = Termeni -footerLinkCookies = Cookie-uri -addPasswordButton = Adaugă parolă +passwordTryAgain = Parolă incorectă. Încearcă din nou. +javascriptRequired = Send necesită JavaScript +whyJavascript = De ce Send necesită JavaScript? +enableJavascript = Te rugăm să reactivezi JavaScript și să încerci din nou. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Lungime minimă a parolei: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Această parolă nu a putut fi setată + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partajare de fișiere simplă și privată +introDescription = { -send-brand } îți permite să partajezi fișiere cu criptare capăt-la-capăt și un link care expiră automat. Deci, poți păstra confidențial ceea ce partajezi și te poți asigura că ce ai partajat nu rămâne online pentru totdeauna. +notifyUploadEncryptDone = Fișierul tău este criptat și gata de trimitere +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expiră după { $downloadCount } sau { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + [few] { $num } minute + *[other] { $num } de minute + } +timespanDays = + { $num -> + [one] 1 zi + [few] { $num } zile + *[other] { $num } de zile + } +timespanWeeks = + { $num -> + [one] 1 săptămână + [few] { $num } săptămâni + *[other] { $num } de săptămâni + } +fileCount = + { $num -> + [one] 1 fișier + [few] { $num } fișiere + *[other] { $num } de fișiere + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Mărime totală: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiază linkul pentru partajarea fișierului: +copyLinkButton = Copiază linkul +downloadTitle = Descarcă fișierele +downloadDescription = Acest fișier a fost partajat prin { -send-brand }, cu criptare capăt-la-capăt și un link care expiră automat. +trySendDescription = Încearcă { -send-brand } pentru o partajare simplă și sigură a fișierelor. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Numai 1 fișier poate fi încărcat simultan. + [few] Numai { $count } fișiere pot fi încărcate simultan. + *[other] Numai { $count } de fișiere pot fi încărcate simultan. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Numai 1 arhivă este permisă. + [few] Numai { $count } arhive sunt permise. + *[other] Numai { $count } de arhive sunt permise. + } +expiredTitle = Acest link a expirat. +notSupportedDescription = { -send-brand } nu va funcționa pe acest browser. { -send-short-brand } funcționează cel mai bine cu ultima versiune de { -firefox } și va funcționa cu versiunea curentă a majorității browserelor. +downloadFirefox = Descarcă { -firefox } +legalTitle = Declarație de confidențialitate { -send-short-brand } +legalDateStamp = Versiunea 1.0 din data de 12 martie 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }z { $hours }h { $minutes }m +addFilesButton = Selectează fișierele pentru încărcare +uploadButton = Încarcă +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Trage și plasează fișierele +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = sau dă clic pentru a trimite până la { $size } +addPassword = Protejează cu parolă +emailPlaceholder = Introdu e-mailul tău +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Autentifică-te pentru a trimite până la { $size } +signInOnlyButton = Autentificare +accountBenefitTitle = Creează un cont { -firefox } sau autentifică-te +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partajează fișiere de până la { $size } +accountBenefitDownloadCount = Partajează fișiere cu mai multe persoane +accountBenefitTimeLimit = + { $count -> + [one] Păstrează linkurile active până la 1 zi + [few] Păstrează linkurile active până la { $count } zile + *[other] Păstrează linkurile active până la { $count } de zile + } +accountBenefitSync = Gestionează fișierele partajate de pe orice dispozitiv +accountBenefitMoz = Află despre celelalte servicii { -mozilla } +signOut = Deconectare +okButton = Ok +downloadingTitle = Se descarcă +noStreamsWarning = Este posibil ca acest browser să nu poată decripta un fișier atât de mare. +noStreamsOptionCopy = Copiază linkul pentru a-l deschide într-un alt browser +noStreamsOptionFirefox = Încearcă browserul nostru favorit +noStreamsOptionDownload = Continuă cu acest browser +downloadFirefoxPromo = { -send-short-brand } îți este adus de noul { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Partajează linkul către fișier: +shareLinkButton = Partajează linkul +# $name is the name of the file +shareMessage = Descarcă „{ $name }” cu { -send-brand }: partajare simplă și sigură a fișierelor +trailheadPromo = Există o modalitate de a-ți proteja viața privată. Folosește Firefox. +learnMore = Află mai multe. diff --git a/public/locales/ru/send.ftl b/public/locales/ru/send.ftl index aad3e540..0221fce0 100644 --- a/public/locales/ru/send.ftl +++ b/public/locales/ru/send.ftl @@ -1,91 +1,158 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = веб-эксперимент -siteFeedback = Отзывы -uploadPageHeader = Приватный, зашифрованный обмен файлами -uploadPageExplainer = Отсылайте файлы, используя безопасные, приватные и зашифрованные ссылки, по истечении срока действия которых ваши файлы не останутся в сети навсегда. -uploadPageLearnMore = Подробнее -uploadPageDropMessage = Перетащите свой файл сюда, чтобы начать загрузку -uploadPageSizeMessage = Для более надёжной работы сервиса, размер вашего файла не должен превышать 1ГБ. -uploadPageBrowseButton = Выбрать файл с моего компьютера -uploadPageBrowseButton1 = Выбрать файл для загрузки -uploadPageMultipleFilesAlert = Загрузка нескольких файлов или папок в настоящее время не поддерживается. -uploadPageBrowseButtonTitle = Загрузить файл -uploadingPageProgress = Загружаю { $filename } ({ $size }) +title = Send importingFile = Импортирование... -verifyingFile = Проверка... encryptingFile = Шифрование... decryptingFile = Расшифровка... -notifyUploadDone = Ваша загрузка завершена. -uploadingPageMessage = Как только вы загрузите свой файл, вы сможете установить срок хранения. -uploadingPageCancel = Отменить загрузку -uploadCancelNotification = Ваша загрузка была отменена. -uploadingPageLargeFileMessage = Этот файл довольно большой и его загрузка может занять продолжительное время. Держитесь! -uploadingFileNotification = Оповестить меня, когда загрузка завершится. -uploadSuccessConfirmHeader = Готов к отправке -uploadSvgAlt = Загрузить -uploadSuccessTimingHeader = Ссылка на ваш файл станет недоступна после 1 загрузки файла или через 24 часа. -copyUrlFormLabelWithName = Скопировать и поделиться ссылкой на отправку вашего файла: { $filename } -copyUrlFormButton = Скопировать в буфер обмена +downloadCount = + { $num -> + [one] { $num } загрузки + [few] { $num } загрузок + *[other] { $num } загрузок + } +timespanHours = + { $num -> + [one] { $num } час + [few] { $num } часа + *[other] { $num } часов + } copiedUrl = Скопировано! -deleteFileButton = Удалить файл -sendAnotherFileLink = Отправить другой файл -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Загрузить -downloadFileName = Загрузить { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Введите пароль unlockInputPlaceholder = Пароль unlockButtonLabel = Разблокировать -downloadFileTitle = Загрузить зашифрованный файл -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ваш друг отправил вам файл с помощью Firefox Send, сервиса, который позволяет вам делиться файлами, используя безопасные, приватные и зашифрованные ссылки, по истечении срока действия которых ваши файлы не остаются в сети навсегда. -// Text and title used on the download link/button (indicates an action). -downloadButtonLabel = Скачать -downloadNotification = Ваша загрузка завершена. +downloadButtonLabel = Загрузить downloadFinish = Загрузка завершена -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } из { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Попробовать Firefox Send -downloadingPageProgress = Загрузка { $filename } ({ $size }) -downloadingPageMessage = Пожалуйста, оставьте эту вкладку открытой, пока мы загружаем ваш файл и расшифровываем его. -errorAltText = Ошибка загрузки +sendYourFilesLink = Попробовать Send errorPageHeader = Что-то пошло не так! -errorPageMessage = Произошла ошибка при загрузке файла. -errorPageLink = Отправить другой файл. -fileTooBig = Этот файл слишком большой для загрузки. Он должен быть меньше { $size }. +fileTooBig = Файл слишком большой. Он должен быть меньше { $size }. linkExpiredAlt = Истёк срок действия ссылки -expiredPageHeader = Истёк срок действия ссылки или ее никогда не существовало! notSupportedHeader = Ваш браузер не поддерживается. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = К сожалению, этот браузер не поддерживает веб-технологию, благодаря которой работает Firefox Send. Ваш нужно попробовать использовать другой браузер. Мы рекомендуем Firefox! notSupportedLink = Почему мой браузер не поддерживается? -notSupportedOutdatedDetail = К сожалению, эта версия Firefox не поддерживает веб-технологию, благодаря которой работает Firefox Send. Ваш нужно обновить свой браузер. +notSupportedOutdatedDetail = К сожалению, эта версия Firefox не поддерживает веб-технологию, благодаря которой работает Send. Ваш нужно обновить свой браузер. updateFirefox = Обновить Firefox -downloadFirefoxButtonSub = Бесплатная загрузка -uploadedFile = Файл -copyFileList = Скопировать URL -// expiryFileList is used as a column header -expiryFileList = Срок действия истекает через -deleteFileList = Удалить -nevermindButton = Неважно -legalHeader = Условия и конфиденциальность -legalNoticeTestPilot = Firefox Send в настоящее время является экспериментом лётчика-испытателя, и поэтому подпадает под условия службы и уведомление о приватности лётчика-испытателя. Вы можете узнать больше об этом эксперименте и его сборе данных здесь. -legalNoticeMozilla = Использование сайта Firefox Send также подпадает под уведомление о конфиденциальности веб-сайтов и правила использования веб-сайтов Mozilla. -deletePopupText = Удалить этот файл? -deletePopupYes = Да deletePopupCancel = Отмена deleteButtonHover = Удалить -copyUrlHover = Скопировать URL -footerLinkLegal = Права -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = О программе лётчика-испытателя -footerLinkPrivacy = Приватность -footerLinkTerms = Условия -footerLinkCookies = Куки -requirePasswordCheckbox = Требовать пароль для загрузки этого файла -addPasswordButton = Добавить пароль passwordTryAgain = Неверный пароль. Попробуйте снова. -// This label is followed by the password needed to download a file -passwordResult = Пароль: { $password } +javascriptRequired = Для Send необходим JavaScript +whyJavascript = Почему Send требуется JavaScript? +enableJavascript = Пожалуйста, включите JavaScript и попробуйте снова. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } ч. { $minutes } мин. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } мин. +# A short status message shown when the user enters a long password +maxPasswordLength = Максимальная длина пароля: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Этот пароль не может быть установлен + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Простой и безопасный обмен файлами +introDescription = { -send-brand } позволяет вам делиться файлами со сквозным шифрованием и ограниченным сроком действия ссылки на загрузку. Так что, вы сможете делиться файлами приватно и они не останутся в сети навсегда. +notifyUploadEncryptDone = Ваш файл зашифрован и готов к отправке +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Удалить после { $downloadCount } или через { $timespan } +timespanMinutes = + { $num -> + [one] { $num } минуту + [few] { $num } минуты + *[other] { $num } минут + } +timespanDays = + { $num -> + [one] { $num } день + [few] { $num } дня + *[other] { $num } дней + } +timespanWeeks = + { $num -> + [one] { $num } неделю + [few] { $num } недели + *[other] { $num } недель + } +fileCount = + { $num -> + [one] { $num } файл + [few] { $num } файла + *[other] { $num } файлов + } +# byte abbreviation +bytes = Б +# kibibyte abbreviation +kb = КБ +# mebibyte abbreviation +mb = МБ +# gibibyte abbreviation +gb = ГБ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Всего: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Скопируйте ссылку, чтобы поделиться своим файлом: +copyLinkButton = Копировать ссылку +downloadTitle = Загрузить файлы +downloadDescription = Этот файл был отправлен через { -send-brand } со сквозным шифрованием и ограниченным сроком действия ссылки на загрузку. +trySendDescription = Испытайте простой и безопасный обмен файлами с помощью { -send-brand }. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Только { $count } файл может загружаться одновременно. + [few] Только { $count } файла могут загружаться одновременно. + *[other] Только { $count } файлов могут загружаться одновременно. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Только { $count } архив разрешён. + [few] Только { $count } архива разрешено. + *[other] Только { $count } архивов разрешено. + } +expiredTitle = Срок действия этой ссылки истёк. +notSupportedDescription = { -send-brand } не будет работать в этом браузере. { -send-short-brand } лучше всего работает с последней версией { -firefox }, и будет работать с последними версиями популярных браузеров. +downloadFirefox = Загрузить { -firefox } +legalTitle = Уведомление о конфиденциальности { -send-short-brand } +legalDateStamp = Версия 1.0, от 12 марта 2019 года +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } дн. { $hours } ч. { $minutes } мин. +addFilesButton = Добавить +uploadButton = Выгрузить +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Перетащите файлы сюда +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = или кликните сюда для отправки файлов до { $size } +addPassword = Защитить паролем +emailPlaceholder = Введите ваш адрес электронной почты +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Войдите, чтобы отправлять файлы до { $size } +signInOnlyButton = Войти +accountBenefitTitle = Создайте Аккаунт { -firefox } или войдите +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Делитесь файлами до { $size } +accountBenefitDownloadCount = Делитесь файлами с несколькими людьми +accountBenefitTimeLimit = + { $count -> + [one] Оставить ссылку активной в течение { $count } дня + [few] Оставить ссылку активной в течение { $count } дней + *[other] Оставить ссылку активной в течение { $count } дней + } +accountBenefitSync = Управляйте своими файлами с любого устройства +accountBenefitMoz = Узнайте о других службах { -mozilla } +signOut = Выйти +okButton = OK +downloadingTitle = Загрузка +noStreamsWarning = Этот браузер может не иметь возможности расшифровать такой большой файл. +noStreamsOptionCopy = Скопируйте ссылку, чтобы открыть в другом браузере +noStreamsOptionFirefox = Попробуйте наш любимый браузер +noStreamsOptionDownload = Продолжить в этом браузере +downloadFirefoxPromo = { -send-short-brand } доступен вам в полностью новом { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Поделитесь ссылкой на ваш файл: +shareLinkButton = Поделиться ссылкой +# $name is the name of the file +shareMessage = Загрузите «{ $name }» с { -send-brand }: простой и безопасный обмен файлами +trailheadPromo = Существует способ защитить вашу приватность. Присоединяйтесь к Firefox. +learnMore = Подробнее. diff --git a/public/locales/sk/send.ftl b/public/locales/sk/send.ftl index 9c8c8ced..23c3ef6e 100644 --- a/public/locales/sk/send.ftl +++ b/public/locales/sk/send.ftl @@ -1,91 +1,158 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experiment pre web -siteFeedback = Spätná väzba -uploadPageHeader = Súkromné a šifrované zdieľanie súborov -uploadPageExplainer = Odosielajte súbory pomocou bezpečného, súkromného a šifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory nezostanú na internete naveky. -uploadPageLearnMore = Ďalšie informácie -uploadPageDropMessage = Presunutím súboru sem začnete nahrávanie -uploadPageSizeMessage = Pre zaistenie čo najväčšej spoľahlivosti vám odporúčame nahrávať súbory menšie než 1GB. -uploadPageBrowseButton = Vyberte súbor vo vašom počítači -uploadPageBrowseButton1 = Vyberte súbor na nahratie -uploadPageMultipleFilesAlert = Nahrávanie viacerých súborov alebo priečinkov momentálne nie je podporované. -uploadPageBrowseButtonTitle = Nahrať súbor -uploadingPageProgress = Nahrávanie súboru { $filename } ({ $size }) +title = Send importingFile = Importuje sa… -verifyingFile = Overuje sa… encryptingFile = Šifruje sa… decryptingFile = Dešifruje sa… -notifyUploadDone = Vaše nahrávanie sa dokončilo. -uploadingPageMessage = Po nahratí súboru budete môcť nastaviť vypršanie platnosti. -uploadingPageCancel = Zrušiť nahrávanie -uploadCancelNotification = Vaše nahrávanie bolo zrušené. -uploadingPageLargeFileMessage = Tento súbor je veľký. Nahrávanie tak môže chvíľu trvať. -uploadingFileNotification = Upozorniť ma na ukončenie nahrávania -uploadSuccessConfirmHeader = Pripravené na odoslanie -uploadSvgAlt = Nahrať -uploadSuccessTimingHeader = Platnosť odkazu vyprší po 1 prevzatí alebo po uplynutí 24 hodín. -copyUrlFormLabelWithName = Skopírovaním a zdieľaním odkazu odošlete váš súbor: { $filename } -copyUrlFormButton = Kopírovať do schránky +downloadCount = + { $num -> + [one] 1 prevzatí + [few] { $num } prevzatiach + *[other] { $num } prevzatiach + } +timespanHours = + { $num -> + [one] 1 hodine + [few] { $num } hodinách + *[other] { $num } hodinách + } copiedUrl = Skopírované! -deleteFileButton = Odstrániť súbor -sendAnotherFileLink = Odoslať ďalší súbor -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Prevziať -downloadFileName = Prevziať { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Zadajte heslo unlockInputPlaceholder = Heslo unlockButtonLabel = Odomknúť -downloadFileTitle = Prevziať šifrovaný súbor -// Firefox Send is a brand name and should not be localized. -downloadMessage = Váš priateľ vám odoslal súbor pomocou služby Firefox Send - táto vám umožňuje zdieľať súbory pomocou bezpečného, súkromného a zašifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory neostanú na internete naveky. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Prevziať -downloadNotification = Vaše preberanie bolo dokončené. downloadFinish = Preberanie bolo dokončené -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Vyskúšajte Firefox Send -downloadingPageProgress = Preberá sa { $filename } ({ $size }) -downloadingPageMessage = Prosím, ponechajte túto kartu otvorenú zatiaľ čo váš súbor prevezmeme a dešifrujeme. -errorAltText = Pri nahrávaní sa vyskytla chyba +sendYourFilesLink = Vyskúšajte Send errorPageHeader = Vyskytol sa problém. -errorPageMessage = Pri nahrávaní súboru nastala chyba. -errorPageLink = Odošlite ďalší súbor fileTooBig = Súbor je príliš veľký. Mal by byť menší než { $size }. linkExpiredAlt = Platnosť odkazu vypršala -expiredPageHeader = Platnosť tohto odkazu vypršala alebo daný odkaz nikdy neexistoval. notSupportedHeader = Váš prehliadač nie je podporovaný. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Žiaľ, tento prehliadač nepodporuje webovú technológiu, ktorá poháňa službu Firefox Send. Budete musieť vyskúšať iný prehliadač. My vám odporúčame Firefox! notSupportedLink = Prečo nie je môj prehliadač podporovaný? -notSupportedOutdatedDetail = Žiaľ, táto verzia Firefoxu nepodporuje webovú technológiu, ktorá poháňa Firefox Send. Budete musieť aktualizovať svoj prehliadač. +notSupportedOutdatedDetail = Žiaľ, táto verzia Firefoxu nepodporuje webovú technológiu, ktorá poháňa Send. Budete musieť aktualizovať svoj prehliadač. updateFirefox = Aktualizovať Firefox -downloadFirefoxButtonSub = Prevziať zadarmo -uploadedFile = Súbor -copyFileList = Kopírovať adresu URL -// expiryFileList is used as a column header -expiryFileList = Platnosť vyprší -deleteFileList = Odstrániť -nevermindButton = Zrušiť -legalHeader = Podmienky používania a súkromie -legalNoticeTestPilot = Firefox Send je v súčasnosti experimentom projektu Test Pilot a vzťahujú sa naň podmienky používania a zásady ochrany súkromia Test Pilotu. Viac sa o zbieraní údajov experimentami dozviete tu. -legalNoticeMozilla = Na použitie webovej stránky služby Firefox Send sa vzťahujú zásady ochrany súkromia na webových stránkach a podmienky použitia webových stránok Mozilly. -deletePopupText = Naozaj chcete odstrániť tento súbor? -deletePopupYes = Áno deletePopupCancel = Zrušiť deleteButtonHover = Odstrániť -copyUrlHover = Skopírovať adresu URL -footerLinkLegal = Právne informácie -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = O projekte Test Pilot -footerLinkPrivacy = Súkromie -footerLinkTerms = Podmienky používania -footerLinkCookies = Cookies -requirePasswordCheckbox = Pri preberaní súboru vyžadovať heslo -addPasswordButton = Pridať heslo passwordTryAgain = Nesprávne heslo. Skúste to znova. -// This label is followed by the password needed to download a file -passwordResult = Heslo: { $password } +javascriptRequired = Send vyžaduje JavaScript +whyJavascript = Prečo Send vyžaduje JavaScript? +enableJavascript = Prosím, povoľte JavaScript a skúste to znova. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } hod. { $minutes } min. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min. +# A short status message shown when the user enters a long password +maxPasswordLength = Maximálna dĺžka hesla: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Heslo nešlo nastaviť + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jednoduché a súkromné zdieľanie súborov +introDescription = S { -send-brand(case: "ins") } sú zdieľané súbory šifrované end-to-end, takže ani my nevieme, čo zdieľate. Platnosť odkazu je navyše obmedzená. Súbory tak môžete zdieľať súkromne a s istotou, že neostanú na internete naveky. +notifyUploadEncryptDone = Váš súbor je zašifrovaný a pripravený na odoslanie +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Platnosť odkazu vyprší po { $downloadCount } alebo po { $timespan } +timespanMinutes = + { $num -> + [one] 1 minúte + [few] { $num } minútach + *[other] { $num } minútach + } +timespanDays = + { $num -> + [one] 1 dni + [few] { $num } dňoch + *[other] { $num } dňoch + } +timespanWeeks = + { $num -> + [one] 1 týždni + [few] { $num } týždňoch + *[other] { $num } týždňoch + } +fileCount = + { $num -> + [one] 1 súbor + [few] { $num } súbory + *[other] { $num } súborov + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Celková veľkosť: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Súbor môžete zdieľať pomocou tohto odkazu: +copyLinkButton = Kopírovať odkaz +downloadTitle = Prevziať súbory +downloadDescription = Tento súbor bol zdieľaný prostredníctvom služby { -send-brand }, ktorá poskytuje end-to-end šifrovanie a odkazy s obmedzenou platnosťou. +trySendDescription = Vyskúšajte jednoduché a bezpečné zdieľanie súborov so službou { -send-brand } +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Naraz možno nahrávať len 1 súbor. + [few] Naraz možno nahrávať len { $count } súbory. + *[other] Naraz možno nahrávať len { $count } súborov. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Povolený je najviac 1 archív. + [few] Povolené sú najviac { $count } archívy. + *[other] Povolených je najviac { $count } archívov. + } +expiredTitle = Platnosť odkazu vypršala. +notSupportedDescription = { -send-brand } nebude v tomto prehliadači fungovať. { -send-short-brand } najlepšie funguje v najnovšej verzii { -firefox(case: "gen") } alebo aktuálnych verziách najpoužívanejších prehliadačov. +downloadFirefox = Prevziať { -firefox } +legalTitle = Zásady ochrany súkromia služby { -send-short-brand } +legalDateStamp = Verzia 1.0, z 12. marca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min +addFilesButton = Vyberte súbory pre nahratie +uploadButton = Nahrať +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Pretiahnutím súboru alebo kliknutím sem +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = môžete poslať až { $size } +addPassword = Chrániť heslom +emailPlaceholder = Zadajte e-mailovú adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Pre odoslanie súborov s veľkosťou až { $size }, sa, prosím, prihláste +signInOnlyButton = Prihlásiť sa +accountBenefitTitle = Vytvorte si účet { -firefox } alebo sa prihláste +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Zdieľanie súborov s veľkosťou až { $size } +accountBenefitDownloadCount = Zdieľanie súborov s viacerými ľuďmi +accountBenefitTimeLimit = + { $count -> + [one] Odkazy platné až 1 deň + [few] Odkazy platné až { $count } dni + *[other] Odkazy platné až { $count } dní + } +accountBenefitSync = Správa zdieľaných súborov z akéhokoľvek zariadenia +accountBenefitMoz = Ďalšie informácie o ďalších službách od { -mozilla(case: "gen") } +signOut = Odhlásiť sa +okButton = OK +downloadingTitle = Preberá sa +noStreamsWarning = Tento prehliadač nemusí byť schopný dešifrovať takto veľký súbor. +noStreamsOptionCopy = Skopírovať odkaz pre otvorenie v inom prehliadači +noStreamsOptionFirefox = Vyskúšajte náš obľúbený prehliadač +noStreamsOptionDownload = Pokračovať v tomto prehliadači +downloadFirefoxPromo = { -send-short-brand } vám prináša najnovší { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Zdieľajte odkaz na súbor: +shareLinkButton = Zdieľať odkaz +# $name is the name of the file +shareMessage = Prevezmite si súbor „{ $name }“ so službou { -send-brand } - jednoduché a bezpečné zdieľanie súborov +trailheadPromo = Existuje spôsob, ako chrániť vaše súkromie. Prihláste sa do Firefoxu. +learnMore = Ďalšie informácie. diff --git a/public/locales/sl/send.ftl b/public/locales/sl/send.ftl index 4e146ca7..9f8d18f3 100644 --- a/public/locales/sl/send.ftl +++ b/public/locales/sl/send.ftl @@ -1,91 +1,183 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = spletni poskus -siteFeedback = Povratne informacije -uploadPageHeader = Zasebno, šifrirano deljenje datotek -uploadPageExplainer = Pošljite datoteke preko varne, zasebne in šifrirane povezave, ki samodejno poteče, kar vam zagotavlja, da vaše datoteke ne bodo ostale za vedno na spletu. -uploadPageLearnMore = Več o tem -uploadPageDropMessage = Tukaj spustite datoteko za začetek nalaganja -uploadPageSizeMessage = Za zanesljivo delovanje je najbolje, da datoteka ne presega 1 GB -uploadPageBrowseButton = Izberite datoteko na računalniku -uploadPageBrowseButton1 = Izberite datoteko za nalaganje -uploadPageMultipleFilesAlert = Nalaganje več datotek ali map trenutno ni podprto. -uploadPageBrowseButtonTitle = Naloži datoteko -uploadingPageProgress = Nalaganje { $filename } ({ $size }) +title = Send importingFile = Uvažanje … -verifyingFile = Preverjanje … encryptingFile = Šifriranje ... decryptingFile = Dešifriranje ... -notifyUploadDone = Nalaganje je končano. -uploadingPageMessage = Ko bo vaša datoteka naložena, boste lahko nastavili možnosti poteka. -uploadingPageCancel = Prekliči nalaganje -uploadCancelNotification = Nalaganje je preklicano. -uploadingPageLargeFileMessage = Datoteka je velika in lahko traja nekaj časa, da se naloži. Počakajte trenutek! -uploadingFileNotification = Obvesti me, ko bo nalaganje končano. -uploadSuccessConfirmHeader = Pripravljeno za pošiljanje -uploadSvgAlt = Naloži -uploadSuccessTimingHeader = Povezava do vaše datoteke bo potekla po enem prenosu ali v 24 urah. -copyUrlFormLabelWithName = Kopirajte in delite to povezavo, da pošljete datoteko: { $filename } -copyUrlFormButton = Kopiraj v odložišče +downloadCount = + { $num -> + [one] 1 prenosu + [two] { $num } prenosih + [few] { $num } prenosih + *[other] { $num } prenosih + } +timespanHours = + { $num -> + [one] 1 uro + [two] { $num } uri + [few] { $num } ure + *[other] { $num } ur + } copiedUrl = Kopirano! -deleteFileButton = Izbriši datoteko -sendAnotherFileLink = Pošlji drugo datoteko -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Prenesi -downloadFileName = Prenesi { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Vnesite geslo unlockInputPlaceholder = Geslo unlockButtonLabel = Odkleni -downloadFileTitle = Prenesi šifrirano datoteko -// Firefox Send is a brand name and should not be localized. -downloadMessage = Prijatelj vam pošilja datoteko preko storitve Firefox Send, ki vam omogoča deljenje datotek preko varne, zasebne in šifrirane povezave, ki samodejno poteče, kar vam zagotavlja, da vaše stvari ne ostanejo na spletu za vedno. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Prenesi -downloadNotification = Vaš prenos je končan. downloadFinish = Prenos končan -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } od { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Preskusite Firefox Send -downloadingPageProgress = Prenašanje { $filename } ({ $size }) -downloadingPageMessage = Medtem ko pridobivamo vašo datoteko in jo dešifriramo, pustite ta zavihek odprt. -errorAltText = Napaka pri nalaganju +sendYourFilesLink = Preskusite Send errorPageHeader = Prišlo je do težave! -errorPageMessage = Pri nalaganju vaše datoteke je prišlo do napake. -errorPageLink = Pošlji drugo datoteko fileTooBig = Ta datoteka je prevelika za nalaganje. Največja možna velikost je { $size }. linkExpiredAlt = Povezava je potekla -expiredPageHeader = Ta povezava je potekla ali pa sploh ni obstajala! notSupportedHeader = Vaš brskalnik ni podprt. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ta brskalnik na žalost ne podpira tehnologije, na kateri temelji Firefox Send. Uporabiti boste morali drug brskalnik. Priporočamo Firefox! notSupportedLink = Zakaj moj brskalnik ni podprt? -notSupportedOutdatedDetail = Ta brskalnik žal ne podpira tehnologije, na kateri temelji Firefox Send. Svoj brskalnik boste morali posodobiti. +notSupportedOutdatedDetail = Ta brskalnik žal ne podpira tehnologije, na kateri temelji Send. Svoj brskalnik boste morali posodobiti. updateFirefox = Posodobi Firefox -downloadFirefoxButtonSub = Brezplačen prenos -uploadedFile = Datoteka -copyFileList = Kopiraj spletni naslov -// expiryFileList is used as a column header -expiryFileList = Poteče -deleteFileList = Izbriši -nevermindButton = Pozabi -legalHeader = Pogoji in zasebnost -legalNoticeTestPilot = Firefox Send je trenutno poskus projekta Test Pilot ter zanj veljajo pogoji uporabe in obvestilo o zasebnosti Test Pilota. Več o tem poskusu in njegovem zbiranju podatkov lahko izveste tukaj. -legalNoticeMozilla = Za uporabo spletne strani Firefox Send veljajo Mozillini obvestilo o zasebnosti za spletne strani in pogoji uporabe spletnih strani. -deletePopupText = Izbrišem to datoteko? -deletePopupYes = Da deletePopupCancel = Prekliči deleteButtonHover = Izbriši -copyUrlHover = Kopiraj spletni naslov -footerLinkLegal = Pravno obvestilo -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = O programu Test Pilot -footerLinkPrivacy = Zasebnost -footerLinkTerms = Pogoji -footerLinkCookies = Piškotki -requirePasswordCheckbox = Zahtevaj geslo za prenos te datoteke -addPasswordButton = Dodaj geslo passwordTryAgain = Napačno geslo. Poskusite znova. -// This label is followed by the password needed to download a file -passwordResult = Geslo: { $password } +javascriptRequired = Send zahteva JavaScript +whyJavascript = Zakaj Send zahteva JavaScript? +enableJavascript = Omogočite JavaScript in poskusite znova. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Največja dolžina gesla: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Gesla ni mogoče nastaviti + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = + { $sklon -> + *[imenovalnik] Firefox + [rodilnik] Firefoxa + [dajalnik] Firefoxu + [tozilnik] Firefox + [mestnik] Firefoxu + [orodnik] Firefoxom + } +-mozilla = + { $sklon -> + *[imenovalnik] Mozilla + [rodilnik] Mozille + [dajalnik] Mozilli + [tozilnik] Mozillo + [mestnik] Mozilli + [orodnik] Mozillo + } +introTitle = Preprosto, zasebno deljenje datotek +introDescription = { -send-brand } vam omogoča v celoti šifrirano pošiljanje datotek s povezavo, ki samodejno poteče. Z njim lahko zasebno delite svoje datoteke in zagotovite, da ne bodo za vedno ostale na spletu. +notifyUploadEncryptDone = Vaša datoteka je šifrirana in pripravljena za pošiljanje +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Poteče po { $downloadCount } ali čez { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + [two] { $num } minuti + [few] { $num } minute + *[other] { $num } minut + } +timespanDays = + { $num -> + [one] 1 dan + [two] { $num } dni + [few] { $num } dni + *[other] { $num } dni + } +timespanWeeks = + { $num -> + [one] 1 teden + [two] { $num } tedna + [few] { $num } tedne + *[other] { $num } tednov + } +fileCount = + { $num -> + [one] 1 datoteka + [two] { $num } datoteki + [few] { $num } datoteke + *[other] { $num } datotek + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Skupna velikost: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopirajte povezavo za deljenje datoteke: +copyLinkButton = Kopiraj povezavo +downloadTitle = Prenesi datoteke +downloadDescription = Ta datoteka je bila v skupni rabi preko { -send-brand } s šifriranjem od konca do konca in povezavo, ki samodejno poteče. +trySendDescription = Preizkusite { -send-brand } za preprosto in varno deljenje datotek. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Naložite lahko največ 1 datoteko naenkrat. + [two] Naložite lahko največ { $count } datoteki naenkrat. + [few] Naložite lahko največ { $count } datoteke naenkrat. + *[other] Naložite lahko največ { $count } datotek naenkrat. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Dovoljen je največ 1 arhiv. + [two] Dovoljena sta največ { $count } arhiva. + [few] Dovoljeni so največ { $count } arhivi. + *[other] Dovoljenih je največ { $count } arhivov. + } +expiredTitle = Ta povezava je potekla. +notSupportedDescription = { -send-brand } v tem brskalniku ne bo deloval. { -send-short-brand } najbolje deluje v najnovejši različici { -firefox(sklon: "rodilnik") }, deloval pa bo tudi v trenutni različici večine brskalnikov. +downloadFirefox = Prenesite { -firefox } +legalTitle = Obvestilo o zasebnosti za { -send-short-brand } +legalDateStamp = Različica 1.0, v veljavi od 12. marca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Izberite datoteke za nalaganje +uploadButton = Naloži +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Povlecite in spustite datoteke +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ali kliknite za pošiljanje do { $size } +addPassword = Zaščiti z geslom +emailPlaceholder = Vnesite e-poštni naslov +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Prijavite se za pošiljanje do { $size } +signInOnlyButton = Prijava +accountBenefitTitle = Ustvarite { -firefox } Račun ali se prijavite +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Delite datoteke do velikosti { $size } +accountBenefitDownloadCount = Delite datoteke z več osebami +accountBenefitTimeLimit = + { $count -> + [one] Ohranite povezave dejavne do en dan + [two] Ohranite povezave dejavne do { $count } dni + [few] Ohranite povezave dejavne do { $count } dni + *[other] Ohranite povezave dejavne do { $count } dni + } +accountBenefitSync = Upravljajte deljene datoteke s katerekoli naprave +accountBenefitMoz = Več o drugih storitvah { -mozilla(sklon: "rodilnik") } +signOut = Odjava +okButton = V redu +downloadingTitle = Prenašanje +noStreamsWarning = Ta brskalnik morda ne bo zmogel dešifrirati tako velike datoteke. +noStreamsOptionCopy = Kopirajte povezavo, da jo odprete v drugem brskalniku +noStreamsOptionFirefox = Poskusite z našim najljubšim brskalnikom +noStreamsOptionDownload = Nadaljujte s tem brskalnikom +downloadFirefoxPromo = { -send-short-brand } vam omogoča čisto novi { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Delite povezavo do datoteke: +shareLinkButton = Deli povezavo +# $name is the name of the file +shareMessage = Prenesite "{ $name }" s { -send-brand }om: enostavno in varno deljenje datotek +trailheadPromo = Vašo zasebnost lahko zaščitite. Pridružite se Firefoxu. +learnMore = Več o tem. diff --git a/public/locales/sn/send.ftl b/public/locales/sn/send.ftl new file mode 100644 index 00000000..1dfcd0b7 --- /dev/null +++ b/public/locales/sn/send.ftl @@ -0,0 +1,15 @@ +title = Send +importingFile = Kutora faira +encryptingFile = Kuinikiriputa +enableJavascript = Ndinokumbira mubvumidze JavaScript moedza zvekare +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }maawa { $minutes }mineti +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }mineti +# A short status message shown when the user enters a long password +maxPasswordLength = Pasiwedhi haipfuuri mavara:{ $length } +# A short status message shown when there was an error setting the password +passwordSetError = Pasiwedhi haina kuita + +## Send version 2 strings + diff --git a/public/locales/sq/send.ftl b/public/locales/sq/send.ftl new file mode 100644 index 00000000..e545b22f --- /dev/null +++ b/public/locales/sq/send.ftl @@ -0,0 +1,149 @@ +title = Send +importingFile = Po importohet… +encryptingFile = Po fshehtëzohet… +decryptingFile = Po shfshehtëzohet… +downloadCount = + { $num -> + [one] 1 shkarkimi + *[other] { $num } shkarkimesh + } +timespanHours = + { $num -> + [one] 1 ore + *[other] { $num } orësh + } +copiedUrl = U kopjua! +unlockInputPlaceholder = Fjalëkalim +unlockButtonLabel = Zhbllokoje +downloadButtonLabel = Shkarkoje +downloadFinish = Shkarkim i Plotësuar +fileSizeProgress = ({ $partialSize } nga { $totalSize }) gjithsej +sendYourFilesLink = Provoni Send +errorPageHeader = Diç shkoi ters! +fileTooBig = Kjo kartelë është shumë e madhe për ngarkim. Do të duhej të ishte më pak se { $size }. +linkExpiredAlt = Lidhja skadoi +notSupportedHeader = Shfletuesi juaj nuk mbulohet. +notSupportedLink = Pse nuk mbulohet ky shfletues? +notSupportedOutdatedDetail = Mjerisht, ky version i Firefox-it nuk e mbulon teknologjinë web mbi të cilën bazohet Send. Do t’ju duhet të përditësoni shfletuesin tuaj. +updateFirefox = Përditësojeni Firefox-in +deletePopupCancel = Anuloje +deleteButtonHover = Fshije +passwordTryAgain = Fjalëkalim i pasaktë. Riprovoni. +javascriptRequired = Send lyp JavaScript +whyJavascript = Ç’i duhet Send-it JavaScript-i? +enableJavascript = Ju lutemi, aktivizoni JavaScript-in dhe riprovoni. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Gjatësi maksimum fjalëkalimi: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ky fjalëkalim s’u caktua dot + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Ndarje e thjeshtë, private, kartelash me të tjerët +introDescription = { -send-brand } ju lejon të ndani kartela me të tjerët, me fshehtëzim skaj-më-skaj dhe me një lidhje që skadon automatikisht. Kështu mund ta mbani private atë që ndani me të tjerë dhe të garantoni që gjërat tuaja s’do të qëndrojnë në linjë përgjithmonë. +notifyUploadEncryptDone = Kartela juaj është fshehtëzuar dhe gati për dërgim +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Skadon pas { $downloadCount } ose { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutë + *[other] { $num } minuta + } +timespanDays = + { $num -> + [one] 1 ditë + *[other] { $num } ditë + } +timespanWeeks = + { $num -> + [one] 1 javë + *[other] { $num } javë + } +fileCount = + { $num -> + [one] 1 kartelë + *[other] { $num } kartela + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Madhësia gjithsej: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopjoni lidhjen për dhënien e kartelës tuaj: +copyLinkButton = Kopjoje lidhjen +downloadTitle = Shkarkoni kartela +downloadDescription = Kjo kartelë u nda me të tjerët përmes { -send-brand }, me fshehtëzim skaj-më-skaj dhe një lidhje që skadon automatikisht. +trySendDescription = Provoni { -send-brand }, për ndarje të thjeshtë, të parrezik, kartelash me të tjerët. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Mund të ngarkohet vetëm 1 kartelë në herë. + *[other] Mund të ngarkohen vetëm { $count } kartela në herë. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Lejohet vetëm 1 arkiv. + *[other] Lejohen vetëm { $count } arkiva. + } +expiredTitle = Kjo lidhje ka skaduar. +notSupportedDescription = { -send-brand } s’do të funksionojë me këtë shfletues. { -send-short-brand } funksionin më mirë me versionin më të ri të { -firefox }, dhe do të funksionojë me versionin e tanishëm të shumicës së shfletuesve. +downloadFirefox = Shkarkoni { -firefox } +legalTitle = Njoftim Privatësie Për { -send-short-brand } +legalDateStamp = Version 1.0, daton 12 mars, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Përzgjidhni kartela për ngarkim +uploadButton = Ngarkoje +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Tërhiqni dhe lini kartela +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ose klikoni që të dërgohen deri në { $size } +addPassword = Mbrojini me fjalëkalim +emailPlaceholder = Jepni email-in tuaj +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Bëni hyrjen që të dërgoni deri më { $size } +signInOnlyButton = Hyni +accountBenefitTitle = Krijoni një Llogari { -firefox } ose bëni hyrjen në një të tillë +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ndani me të tjerët kartela deri { $size } +accountBenefitDownloadCount = Ndani kartela me më tepër persona +accountBenefitTimeLimit = + { $count -> + [one] Mbaji aktive lidhjet për deri 1 ditë + *[other] Mbaji aktive lidhjet për deri { $count } ditë + } +accountBenefitSync = Administroni nga çfarëdo pajisje kartela të përbashkëta +accountBenefitMoz = Mësoni më tepër rreth shërbimesh { -mozilla } +signOut = Dilni +okButton = OK +downloadingTitle = Shkarkim +noStreamsWarning = Ky shfletues mund të mos jetë në gjendje të shfshehtëzojë një kartelë kaq të madhe. +noStreamsOptionCopy = Kopjoje lidhjen për ta hapur në një tjetër shfletues +noStreamsOptionFirefox = Provoni shfletuesin tonë të parapëlqyer +noStreamsOptionDownload = Vazhdo me këtë shfletues +downloadFirefoxPromo = { -send-short-brand } ju vjen nga { -firefox }-i i ri fringo. +# the next line after the colon contains a file name +shareLinkDescription = Ndani me të tjerët lidhjen për te kartela juaj: +shareLinkButton = Ndani me të tjerët lidhjen +# $name is the name of the file +shareMessage = Shkarkojeni “{ $name }” me { -send-brand }: shkëmbim kartelash dhe thjesht dhe pa rrezik +trailheadPromo = Ka një rrugë për të mbrojtur privatësinë tuaj. Bëhuni pjesë e Firefox-it. +learnMore = Mësoni më tepër. diff --git a/public/locales/sr/send.ftl b/public/locales/sr/send.ftl index e09528cc..68cf78da 100644 --- a/public/locales/sr/send.ftl +++ b/public/locales/sr/send.ftl @@ -1,91 +1,158 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = веб експеримент -siteFeedback = Повратне информације -uploadPageHeader = Приватно и шифровано дељење датотека -uploadPageExplainer = Шаљите датотеке преко безбедне, приватне и шифроване везе која самостално истиче да ваше ствари не би остале на нету заувек. -uploadPageLearnMore = Сазнајте више -uploadPageDropMessage = Превуците ваше датотеке овде да бисте кренули са отпремањем -uploadPageSizeMessage = За бољи рад предлажемо да датотека не буде већа од 1GB -uploadPageBrowseButton = Изаберите датотеку на рачунару -uploadPageBrowseButton1 = Изаберите датотеку за отпремање -uploadPageMultipleFilesAlert = Отпремање фасцикли или више датотека тренутно није подржано. -uploadPageBrowseButtonTitle = Отпреми датотеку -uploadingPageProgress = Отпремам { $filename } ({ $size }) +title = Send importingFile = Увозим… -verifyingFile = Потврђујем… encryptingFile = Шифрујем… decryptingFile = Дешифрујем… -notifyUploadDone = Ваше отпремање је завршено. -uploadingPageMessage = Након што се ваша датотека отпреми, моћи ћете да подесите опције истека. -uploadingPageCancel = Откажи отпремање -uploadCancelNotification = Ваше отпремање је отказано. -uploadingPageLargeFileMessage = Ово је велика датотека и отпремање може потрајати. Будите стрпљиви! -uploadingFileNotification = Обавести ме када се отпремање заврши. -uploadSuccessConfirmHeader = Спреман за слање -uploadSvgAlt = Отпреми -uploadSuccessTimingHeader = Веза ка вашој датотеци ће истећи након једног преузимања или након 24 сата. -copyUrlFormLabelWithName = Ископирајте и поделите везу да бисте послали вашу датотеку: { $filename } -copyUrlFormButton = Копирај у оставу +downloadCount = + { $num -> + [one] { $num } преузимања + [few] { $num } преузимања + *[other] { $num } преузимања + } +timespanHours = + { $num -> + [one] { $num } сата + [few] { $num } сата + *[other] { $num } сати + } copiedUrl = Ископирано! -deleteFileButton = Обриши датотеку -sendAnotherFileLink = Пошаљи другу датотеку -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Преузми -downloadFileName = Преузимање датотеке { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Унесите лозинку unlockInputPlaceholder = Лозинка unlockButtonLabel = Откључај -downloadFileTitle = Преузми шифровану датотеку -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ваш пријатељ вам је послао датотеку преко услуге Firefox Send која вам омогућава да делите датотеке преко безбедне, приватне и шифроване везе која самостално истиче да ваше ствари не би остале на нету заувек. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Преузми -downloadNotification = Ваше преузимање је завршено. downloadFinish = Преузимање је завршено. -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } од { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Испробајте Firefox Send -downloadingPageProgress = Преузимам датотеку { $filename } ({ $size }) -downloadingPageMessage = Оставите овај језичак отвореним док не добавимо вашу датотеку и док је не дешифрујемо. -errorAltText = Грешка при отпремању +sendYourFilesLink = Испробајте Send errorPageHeader = Нешто је пошло наопако! -errorPageMessage = Догодила се грешка приликом отпремања датотеке. -errorPageLink = Пошаљи другу датотеку fileTooBig = Та датотека је превелика за отпремање. Треба да буде мања од { $size }. linkExpiredAlt = Веза је истекла -expiredPageHeader = Веза је или истекла, или никада није ни постојала! notSupportedHeader = Ваш прегледач није подржан. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Нажалост, овај прегледач не подржава веб технологију која омогућава Firefox Send. Мораћете да пробате са другим прегледачем. Ми предлажемо Firefox! notSupportedLink = Зашто мој прегледач није подржан? -notSupportedOutdatedDetail = Нажалост, ово издање Firefox-a не подржава веб технологију која омогућава Firefox Send. Мораћете да ажурирате ваш прегледач. +notSupportedOutdatedDetail = Нажалост, ово издање Firefox-a не подржава веб технологију која омогућава Send. Мораћете да ажурирате ваш прегледач. updateFirefox = Ажурирај Firefox -downloadFirefoxButtonSub = Бесплатно преузимање -uploadedFile = Датотека -copyFileList = URL за копирање -// expiryFileList is used as a column header -expiryFileList = Истиче за -deleteFileList = Брисање -nevermindButton = Занемари -legalHeader = Услови и приватност -legalNoticeTestPilot = Firefox Send је тренутно Тест Пилот експеримент и подложан је условима коришћења Тест Пилота и обавештењем о приватности. Можете сазнати више о овом експерименту и о његовом сакупљању података овде. -legalNoticeMozilla = Коришћење Firefox Send веб сајта подлеже Mozilla-ином обавештењу о приватности на веб сајтовима и условима коришћења веб сајтова. -deletePopupText = Обрисати ову датотеку? -deletePopupYes = Да deletePopupCancel = Откажи deleteButtonHover = Обриши -copyUrlHover = Ископирај URL -footerLinkLegal = Правни подаци -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = О Тест Пилоту -footerLinkPrivacy = Приватност -footerLinkTerms = Услови -footerLinkCookies = Колачићи -requirePasswordCheckbox = Захтевај лозинку да би преузео ову датотеку -addPasswordButton = Додај лозинку passwordTryAgain = Нетачна лозинка. Пробајте поново. -// This label is followed by the password needed to download a file -passwordResult = Лозинка: { $password } +javascriptRequired = За Send је потребан JavaScript +whyJavascript = Зашто је потребан JavaScript за Send? +enableJavascript = Омогућите JavaScript и пробајте поново. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ч { $minutes }м +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }м +# A short status message shown when the user enters a long password +maxPasswordLength = Највећа дужина лозинке: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Не можемо поставити ову лозинку + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Једноставно и приватно дељење датотека +introDescription = { -send-brand } вам дозвољава да делите датотеке које су шифроване с краја на крај преко везе која самостално истиче. Тако да можете приватно делити ваше ствари које неће остати на вебу заувек. +notifyUploadEncryptDone = Ваша датотека је шифрована и спремна за слање +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Истиче након { $downloadCount } или { $timespan } +timespanMinutes = + { $num -> + [one] { $num } минут + [few] { $num } минута + *[other] { $num } минута + } +timespanDays = + { $num -> + [one] { $num } дан + [few] { $num } дана + *[other] { $num } дана + } +timespanWeeks = + { $num -> + [one] { $num } недеља + [few] { $num } недеље + *[other] { $num } недеља + } +fileCount = + { $num -> + [one] { $num } датотека + [few] { $num } датотеке + *[other] { $num } датотека + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Укупна величина: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Копирајте везу да бисте поделили вашу датотеку: +copyLinkButton = Копирај везу +downloadTitle = Преузми датотеке +downloadDescription = Ова датотека је подељена преко услуге { -send-brand } која омогућава шифровање с краја на крај преко везе која самостално истиче. +trySendDescription = Пробајте { -send-brand } за једноставно и безбедно дељење датотека. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Можете отпремити само { $count } датотеку истовремено. + [few] Можете отпремити само { $count } датотеке истовремено. + *[other] Можете отпремити само { $count } датотека истовремено. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Дозвољена је само { $count } архива. + [few] Дозвољене су само { $count } архиве. + *[other] Дозвољено је само { $count } архива. + } +expiredTitle = Ова веза је истекла. +notSupportedDescription = { -send-brand } неће радити у овом прегледачу. { -send-short-brand } најбоље ради са последњим издањем прегледача { -firefox } и радиће са тренутним издањима већине других прегледача. +downloadFirefox = Преузми { -firefox } +legalTitle = Политика приватности услуге { -send-short-brand } +legalDateStamp = Издање 1.0, датум објављивања 12. март 2019. године +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }д { $hours }ч { $minutes }м +addFilesButton = Изаберите датотеке за отпремање +uploadButton = Отпреми +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Превуците и пустите датотеке +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = или кликните за слање садржаја великог до { $size } +addPassword = Заштитите лозинком +emailPlaceholder = Унесите вашу е-адресу +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Пријавите се да пошаљете садржај до { $size } +signInOnlyButton = Пријавите се +accountBenefitTitle = Направите { -firefox } налог или се пријавите +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Поделите датотеке велике до { $size } +accountBenefitDownloadCount = Поделите датотеке са више особа +accountBenefitTimeLimit = + { $count -> + [one] Остави везе активним највише { $count } дан + [few] Остави везе активним највише { $count } дана + *[other] Остави везе активним највише { $count } дана + } +accountBenefitSync = Управљајте подељеним датотекама са било ког уређаја +accountBenefitMoz = Сазнајте више о другим { -mozilla }-иним услугама +signOut = Одјава +okButton = У реду +downloadingTitle = Преузимам +noStreamsWarning = Овај прегледач можда неће моћи да дешифрује оволико велику датотеку. +noStreamsOptionCopy = Копирај везу за отварање у другом прегледачу +noStreamsOptionFirefox = Пробајте наш омиљени прегледач +noStreamsOptionDownload = Наставите у овом прегледачу +downloadFirefoxPromo = { -send-short-brand } вам је омогућен захваљући потпуно новом програму { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Поделите везу до датотеке: +shareLinkButton = Поделите везу +# $name is the name of the file +shareMessage = Преузмите „{ $name }“ помоћу програма { -send-brand }: једноставно и безбедно дељење датотека +trailheadPromo = Постоји начин да заштитите вашу приватност. Придружите се Firefox-у. +learnMore = Сазнајте више. diff --git a/public/locales/su/send.ftl b/public/locales/su/send.ftl new file mode 100644 index 00000000..188bdeaf --- /dev/null +++ b/public/locales/su/send.ftl @@ -0,0 +1,147 @@ +title = Send +importingFile = Ngimpor... +encryptingFile = Ngénkripsi... +decryptingFile = Ngadékripsi... +downloadCount = + { $num -> + *[other] { $num } undeuran + } +timespanHours = + { $num -> + *[other] { $num } jam + } +copiedUrl = Ditiron! +unlockInputPlaceholder = Kecap sandi +unlockButtonLabel = Laan konci +downloadButtonLabel = Undeur +downloadFinish = Undeuran anggeus +fileSizeProgress = ({ $partialSize } ti { $totalSize }) +sendYourFilesLink = Pecakan Send +errorPageHeader = Aya nu salah! +fileTooBig = Koropak unjalkeuneun badag teuing. Kudu kurang ti { $size }. +linkExpiredAlt = Tutumbu kadaluwarsa +notSupportedHeader = Panyungsi anjeun teu dirojong +notSupportedLink = Naha panyungsi kuring teu dirojong? +notSupportedOutdatedDetail = Hanjakal Firefox vérsi ieu teu ngarojong téhnologi wéb nu ngagerakkeun Send. Anjeun perlu ngapdét panyungsi anjeun. +updateFirefox = Apdét Firefox +deletePopupCancel = Bolay +deleteButtonHover = Pupus +passwordTryAgain = Kecap sandi salah. Pecakan deui. +javascriptRequired = Send merlukeun JavaScript +whyJavascript = Naha Send merlukeun JavaScript? +enableJavascript = Prak hurungkeun JavaScript sarta pecakan deui. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }j { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Panjang sandi maksimal: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ieu kecap sandi teu bisa disét + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simpel, babagi koropak privat +introDescription = { -send-brand } migampang anjeun babagi koropak kalawan énkripsi tungtung-ka-tungtung sarta tutumbu nu otomatis kadaluwarsa. Sahingga anjeun bisa ngaraksa naon nu ku anjeun bagi sacara privat jeung mastikeun banda anjeun teu salawasna daring. +notifyUploadEncryptDone = Koropak anjeun kaénkripsi sarta siap dikirim. +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Kadaluwarsa sanggeu { $downloadCount } atawa { $timespan } +timespanMinutes = + { $num -> + [one] samenit + *[other] { $num } menit + } +timespanDays = + { $num -> + [one] sapoé + *[other] { $num } poé + } +timespanWeeks = + { $num -> + [one] saminggu + *[other] { $num } minggu + } +fileCount = + { $num -> + [one] sakoropak + *[other] { $num } koropak + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ukuran total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Tiron tutumbu pikeun babagi koropak anjeun: +copyLinkButton = Tiron tutumbu +downloadTitle = Undeur koropak +downloadDescription = Ieu koropak geus dibagikeun liwat { -send-brand } kalawan énkripsi tungtung-ka-tungtung sarta tutumbuna otomatis kadaluwarsa. +trySendDescription = Pecakan { -send-brand } pikeun simpelna, babagi koropak aman. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ayeuna kur sakoropak nu bisa diunjal. + *[other] Ngan { $count } koropak nu bisa diunjal sakaligus. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Ngan saarsip nu diidinan. + *[other] Ngan { $count } arsip nu diidinan. + } +expiredTitle = Ieu tutumbu geus kadaluwarsa. +notSupportedDescription = { -send-brand } moal jalan di ieu panyungsi. { -send-short-brand } jalan naker dina { -firefox } vérsi pamganyarna, sarta bakal jalan di loba panyungsi vérsi kiwari. +downloadFirefox = Undeur { -firefox } +legalTitle = { -send-short-brand } Wawar Privasi +legalDateStamp = Versi 1.0, kaping 12 Maret 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }p { $hours }j { $minutes }m +addFilesButton = Pilih koropak unjalkeuneun +uploadButton = Unjal +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ésérkeun sarta ésotkeun koropak +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = atawa klik pikeun ngirim nika { $size } +addPassword = Piningan ku kecap sandi +emailPlaceholder = Asupkeun surélék anjeun +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Asup sangkan bisa ngirim nika { $size } +signInOnlyButton = Asup +accountBenefitTitle = Jieun akun { -firefox } atawa asup +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bagikeun koropak nika { $size } +accountBenefitDownloadCount = Bagikeun koropak ka balaréa +accountBenefitTimeLimit = + { $count -> + [one] Aktipkeun tutumbu jang sapoéeun + *[other] Aktipkeun tutumbu jang { $count } poé + } +accountBenefitSync = Kokolakeun koropak nu dibagikeun ti parangkat mana wé +accountBenefitMoz = Tengetan ngeunaan layanan { -mozilla } lianna +signOut = Kaluar +okButton = OKÉH +downloadingTitle = Ngundeur +noStreamsWarning = Ieu panyungsi kawasna mah teu bisa ngadékrip koropak badag kieu. +noStreamsOptionCopy = Tiron tutumbu jang bukaeun di panyungsi séjén +noStreamsOptionFirefox = Pecakan panyungsi karesep kami +noStreamsOptionDownload = Tuluykeun ku ieu panyungsi +downloadFirefoxPromo = { -send-short-brand } téh disanggakeun keur anjeun kalawan { -firefox } sarwa anyar. +# the next line after the colon contains a file name +shareLinkDescription = Bagikeun tutumbu ka koropak anjeun: +shareLinkButton = Bagikeun tutumbu +# $name is the name of the file +shareMessage = Undeur "{ $name }" ku { -send-brand }: simpel, babagi koropak aman +trailheadPromo = Aya cara pikeun ngamankeun privasi anjeun. Jabung jeung Firefox. +learnMore = Lenyepan. diff --git a/public/locales/sv-SE/send.ftl b/public/locales/sv-SE/send.ftl index cec2deb5..87437095 100644 --- a/public/locales/sv-SE/send.ftl +++ b/public/locales/sv-SE/send.ftl @@ -1,91 +1,149 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webbexperiment -siteFeedback = Återkoppling -uploadPageHeader = Privat, krypterad fildelning -uploadPageExplainer = Skicka filer via en säker, privat och krypterad länk som automatiskt upphör för att säkerställa att dina saker inte förblir på nätet för alltid. -uploadPageLearnMore = Läs mer -uploadPageDropMessage = Släpp filen här för att börja ladda upp -uploadPageSizeMessage = För den mest tillförlitliga driften är det bäst att hålla din fil under 1 GB -uploadPageBrowseButton = Välj en fil på din dator -uploadPageBrowseButton1 = Välj en fil att ladda upp -uploadPageMultipleFilesAlert = Överföring av flera filer eller en mapp stöds för närvarande inte. -uploadPageBrowseButtonTitle = Ladda upp fil -uploadingPageProgress = Laddar upp { $filename } ({ $size }) +title = Send importingFile = Importerar… -verifyingFile = Verifierar… encryptingFile = Krypterar… decryptingFile = Avkodar… -notifyUploadDone = Din uppladdning har slutförts. -uploadingPageMessage = När din filuppladdning är klar kommer du att kunna ange alternativ för upphörande. -uploadingPageCancel = Avbryt uppladdning -uploadCancelNotification = Din uppladdning avbröts. -uploadingPageLargeFileMessage = Den här filen är stor och kan ta ett tag att ladda upp. Ha tålamod! -uploadingFileNotification = Meddela mig när uppladdningen är klar. -uploadSuccessConfirmHeader = Klar för att skicka -uploadSvgAlt = Ladda upp -uploadSuccessTimingHeader = Länken till din fil upphör att gälla efter 1 nedladdning eller om 24 timmar. -copyUrlFormLabelWithName = Kopiera och dela länken för att skicka din fil: { $filename } -copyUrlFormButton = Kopiera till urklipp +downloadCount = + { $num -> + [one] 1 nedladdning + *[other] { $num } nedladdningar + } +timespanHours = + { $num -> + [one] 1 timme + *[other] { $num } timmar + } copiedUrl = Kopierad! -deleteFileButton = Ta bort fil -sendAnotherFileLink = Skicka en annan fil -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Ladda ner -downloadFileName = Ladda ner { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ange lösenord unlockInputPlaceholder = Lösenord unlockButtonLabel = Lås upp -downloadFileTitle = Hämta krypterad fil -// Firefox Send is a brand name and should not be localized. -downloadMessage = Din vän skickar dig en fil med Firefox Send, en tjänst som låter dig dela filer med en säker, privat och krypterad länk som automatiskt upphör för att säkerställa att dina saker inte förblir på nätet för alltid. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Ladda ner -downloadNotification = Din nedladdning har slutförts. downloadFinish = Nedladdning klar -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } av { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Testa Firefox Send -downloadingPageProgress = Laddar ner { $filename } ({ $size }) -downloadingPageMessage = Lämna den här fliken öppen medan vi laddar ner din fil och dekrypterar den. -errorAltText = Uppladdningsfel +sendYourFilesLink = Testa Send errorPageHeader = Något gick fel! -errorPageMessage = Det har uppstått ett fel vid uppladdning av filen. -errorPageLink = Skicka en annan fil fileTooBig = Den filen är för stor för att ladda upp. Det ska vara mindre än { $size }. linkExpiredAlt = Länk upphörd -expiredPageHeader = Den här länken har upphört eller har aldrig existerat i första hand! notSupportedHeader = Din webbläsare stöds inte. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Tyvärr stöder inte webbläsaren den webbteknologi som används av Firefox Send. Du måste försöka med en annan webbläsare. Vi rekommenderar Firefox! notSupportedLink = Varför stöds inte min webbläsare? -notSupportedOutdatedDetail = Tyvärr stödjer den här versionen av Firefox inte webbtekniken som driver Firefox Send. Du måste uppdatera din webbläsare. +notSupportedOutdatedDetail = Tyvärr stödjer den här versionen av Firefox inte webbtekniken som driver Send. Du måste uppdatera din webbläsare. updateFirefox = Uppdatera Firefox -downloadFirefoxButtonSub = Gratis nedladdning -uploadedFile = Fil -copyFileList = Kopiera URL -// expiryFileList is used as a column header -expiryFileList = Upphör -deleteFileList = Ta bort -nevermindButton = Glöm det -legalHeader = Villkor och sekretess -legalNoticeTestPilot = Firefox Send är för närvarande ett Test Pilot experiment och omfattas av Test Pilots användarvillkor och sekretesspolicy. Du kan läsa dig mer om detta experiment och dess datainsamling här. -legalNoticeMozilla = Användning av webbplatsen för Firefox Send är också föremål för Mozillas sekretesspolicy för webbplatser och användarvillkor för webbplatser. -deletePopupText = Ta bort den här filen? -deletePopupYes = Ja deletePopupCancel = Avbryt deleteButtonHover = Ta bort -copyUrlHover = Kopiera URL -footerLinkLegal = Juridisk information -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Om Test Pilot -footerLinkPrivacy = Sekretess -footerLinkTerms = Villkor -footerLinkCookies = Kakor -requirePasswordCheckbox = Kräver ett lösenord för att ladda ner den här filen -addPasswordButton = Lägg till lösenord passwordTryAgain = Felaktigt lösenord. Försök igen. -// This label is followed by the password needed to download a file -passwordResult = Lösenord: { $password } +javascriptRequired = Send kräver JavaScript +whyJavascript = Varför kräver Send JavaScript? +enableJavascript = Aktivera JavaScript och försök igen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }t { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximal lösenordslängd: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Det här lösenordet kunde inte ställas in + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildelning +introDescription = { -send-brand } låter dig dela filer med end-to-end-kryptering och en länk som automatiskt upphör. Så att du kan behålla det du delar privat och se till att dina saker inte stannar online för alltid. +notifyUploadEncryptDone = Din fil är krypterad och redo att skickas +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Förfaller efter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + *[other] { $num } minuter + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dagar + } +timespanWeeks = + { $num -> + [one] 1 vecka + *[other] { $num } veckor + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total storlek: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiera länken för att dela din fil: +copyLinkButton = Kopiera länk +downloadTitle = Ladda ner filer +downloadDescription = Den här filen delades via { -send-brand } med end-to-end-kryptering och en länk som automatiskt upphör. +trySendDescription = Prova { -send-brand } för enkel, säker fildelning. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Endast 1 fil kan laddas upp i taget. + *[other] Endast { $count } filer kan laddas upp i taget. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Endast 1 arkiv är tillåten. + *[other] Endast { $count } arkiv är tillåtna. + } +expiredTitle = Den här länken har upphört. +notSupportedDescription = { -send-brand } fungerar inte med den här webbläsaren. { -send-short-brand } fungerar bäst med den senaste versionen av { -firefox } och kommer att fungera med den nuvarande versionen av de flesta webbläsare. +downloadFirefox = Hämta { -firefox } +legalTitle = { -send-short-brand } sekretesspolicy +legalDateStamp = Version 1.0, daterad den 12 mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m +addFilesButton = Välj filer som ska laddas upp +uploadButton = Ladda upp +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dra och släpp filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klicka för att skicka upp till { $size } +addPassword = Skydda med lösenord +emailPlaceholder = Ange din e-postadress +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logga in för att skicka upp till { $size } +signInOnlyButton = Logga in +accountBenefitTitle = Skapa ett { -firefox }-konto eller logga in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dela filer upp till { $size } +accountBenefitDownloadCount = Dela filer med fler personer +accountBenefitTimeLimit = + { $count -> + [one] Håll länk aktiv i upp till 1 dag + *[other] Håll länkar aktiva i upp till { $count } dagar + } +accountBenefitSync = Hantera delade filer från vilken enhet som helst +accountBenefitMoz = Läs om andra { -mozilla }-tjänster +signOut = Logga ut +okButton = OK +downloadingTitle = Laddar ner +noStreamsWarning = Den här webbläsaren kanske inte kan dekryptera en så stor fil. +noStreamsOptionCopy = Kopiera länken för att öppna i en annan webbläsare +noStreamsOptionFirefox = Prova vår favoritwebbläsare +noStreamsOptionDownload = Fortsätt med den här webbläsaren +downloadFirefoxPromo = { -send-short-brand } presenteras för dig av den helt nya { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Dela länken till din fil: +shareLinkButton = Dela länk +# $name is the name of the file +shareMessage = Ladda ner "{ $name }" med { -send-brand }: enkel, säker fildelning +trailheadPromo = Det finns ett sätt att skydda din integritet. Gå med i Firefox. +learnMore = Läs mer. diff --git a/public/locales/te/send.ftl b/public/locales/te/send.ftl index ad523f2b..176f5ab3 100644 --- a/public/locales/te/send.ftl +++ b/public/locales/te/send.ftl @@ -1,79 +1,131 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = జాల ప్రయోగం -siteFeedback = అభిప్రాయం -uploadPageLearnMore = ఇంకా తెలుసుకోండి -uploadPageDropMessage = ఎగుమతిని ప్రారంభించడానికి మీ ఫైలును ఇక్కడ విడిచిపెట్టండి -uploadPageSizeMessage = అత్యంత నమ్మకమైన కార్యం కోసం, మీ ఫైలును 1GB కంటే తక్కువగా ఉంచడం ఉత్తమం -uploadPageBrowseButton = మీ కంప్యూటర్లో ఒక ఫైలును ఎంచుకోండి -uploadPageBrowseButton1 = ఎక్కించటానికి ఒక ఫైలును ఎంచుకోండి -uploadPageBrowseButtonTitle = ఫైలును ఎగుమతి చేయండి -uploadingPageProgress = { $filename } ({ $size }) ఎక్కుతోంది +title = Send importingFile = దిగుమతవుతోంది... -verifyingFile = పరిశీలిస్తున్నది… encryptingFile = గుప్తీకరిస్తోంది... decryptingFile = వ్యక్తపరుస్తోంది... -notifyUploadDone = మీ ఎగుమతి పూర్తయింది. -uploadingPageMessage = మీ ఫైలును మీరు ఎగుమతి చేసిన తర్వాత గడువు ఎంపికలను సరిగా ఏర్పాటు చేయగలరు. -uploadingPageCancel = ఎగుమతి రద్దు చేయండి -uploadCancelNotification = మీ ఎగుమతి రద్దు చేయబడింది. -uploadingPageLargeFileMessage = ఈ ఫైలు పెద్దగా ఉంది అందువలన ఎగుమతి చేయడానికి కొంత సమయం పట్టవచ్చు. వేచి ఉండండి! -uploadingFileNotification = ఎగుమతి పూర్తయినప్పుడు నాకు తెలియచేయండి. -uploadSuccessConfirmHeader = పంపించడానికి సిద్ధంగా ఉంది -uploadSvgAlt = ఎగుమతి చేయండి -uploadSuccessTimingHeader = మీ ఫైలు లంకె గడువు 1 దిగుమతి తరువాత లేదా 24 గంటల తరువాత ముగుస్తుంది. -copyUrlFormLabelWithName = మీ ఫైల్ను పంపడానికి లంకెను నకలు చేయండి మరియు పంచండి: { $filename } -copyUrlFormButton = క్లిప్బోర్డ్కు నకలు చేయండి +downloadCount = + { $num -> + [one] 1 దింపుకోలు + *[other] { $num } దింపుకోళ్ళు + } +timespanHours = + { $num -> + [one] 1 గంట + *[other] { $num } గంటలు + } copiedUrl = నకలు చేయబడింది! -deleteFileButton = ఫైలును తొలగించండి -sendAnotherFileLink = మరో ఫైలును పంపండి -// Alternative text used on the download link/button (indicates an action). -downloadAltText = దిగుమతి -downloadFileName = దిగుమతి { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = సంకేతపదాన్ని తెలపండి unlockInputPlaceholder = సంకేతపదం unlockButtonLabel = తాళం తీయి -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = దిగుమతి -downloadNotification = మీ దిగుమతి పూర్తయ్యింది. downloadFinish = దిగుమతి పూర్తయింది -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = { $totalSize }) యొక్క ({ $partialSize } -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox sendను ప్రయత్నించండి -downloadingPageProgress = దిగుమతిచేస్తున్నది { $filename } ({ $size }) -errorAltText = ఎగుమతిలో లోపం +sendYourFilesLink = sendను ప్రయత్నించండి errorPageHeader = ఏదో తప్పిదం జరిగింది! -errorPageMessage = ఫైల్ను ఎగుమతి చేయడంలో లోపం ఉంది. -errorPageLink = మరో ఫైలును పంపండి +fileTooBig = ఆ ఫైలు ఎక్కించడానికి చాలా పెద్దగా ఉంది. ఫైళ్ళు { $size } కంటే తక్కువ పరిమాణంలో ఉండాలి. linkExpiredAlt = లంకె గడువు ముగిసింది -expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు! notSupportedHeader = మీ విహారిణికి మద్దతు లేదు. notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు? notSupportedOutdatedDetail = దురదృష్టవశాత్తు Firefox యొక్క ఈ వెర్షన్ Firefox సాంకేతికతను పంపే వెబ్ సాంకేతికతకు మద్దతు ఇవ్వదు. మీరు మీ బ్రౌజర్ని నవీకరించాలి. updateFirefox = Firefoxను నవీకరించు -downloadFirefoxButtonSub = ఉచిత దిగుమతులు -uploadedFile = దస్త్రం -copyFileList = URL నకలుతీయి -// expiryFileList is used as a column header -expiryFileList = ఇంతలో గడువుతీరును -deleteFileList = తొలగించు -nevermindButton = పర్వాలేదు -legalHeader = నిబంధనలు మరియు గోప్యత -deletePopupText = ఈ ఫైలును తొలగించాలా? -deletePopupYes = అవును deletePopupCancel = రద్దుచేయి deleteButtonHover = తొలగించు -copyUrlHover = URLను నకలు చేయండి -footerLinkLegal = చట్టపరమైన -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = టెస్ట్ పైలట్ గురించి -footerLinkPrivacy = గోప్యత -footerLinkTerms = నియమాలు -footerLinkCookies = కుకీలు -requirePasswordCheckbox = ఈ ఫైల్ను దింపుకోటానికి సంకేతపదం అవసరం -addPasswordButton = సంకేతపదం జోడించండి passwordTryAgain = సరికాని సంకేతపదం. మళ్ళీ ప్రయత్నించండి. -// This label is followed by the password needed to download a file -passwordResult = సంకేతపదం: { $password } +javascriptRequired = Sendకి జావాస్క్రిప్టు కావాలి +whyJavascript = Sendకి జావాస్క్రిప్టు ఎందుకు కావాలి? +enableJavascript = జావాస్క్రిప్టు చేతనంచేసి మళ్ళీ ప్రయత్నించండి. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }గం { $minutes }ని +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ని +# A short status message shown when the user enters a long password +maxPasswordLength = సంకేతపదం గరిష్ఠ పొడవు: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ఈ సంకేతపదం పెట్టలేకపోయాం + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = పంపించు +-firefox = Firefox +-mozilla = Mozilla +notifyUploadEncryptDone = మీ ఫైలు గుప్తీకరించబడింది, పంపడానికి సిద్ధంగా ఉంది +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } లేదా { $timespan } తర్వాత కాలంచెల్లుతుంది +timespanMinutes = + { $num -> + [one] 1 నిమిషం + *[other] { $num } నిమిషాలు + } +timespanDays = + { $num -> + [one] 1 రోజు + *[other] { $num } రోజులు + } +timespanWeeks = + { $num -> + [one] 1 వారం + *[other] { $num } వారాలు + } +fileCount = + { $num -> + [one] 1 ఫైలు + *[other] { $num } ఫైళ్లు + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = మొత్తం పరిమాణం: { $size } +# the next line after the colon contains a file name +copyLinkDescription = మీ ఫైలును భాగస్వామ్యం చేయడానికి ఈ లంకెను నకలు చేయండి: +copyLinkButton = లంకెను నకలుతీయి +downloadTitle = ఫైళ్లను దింపుకోండి +expiredTitle = ఈ లంకె గడువు ముగిసింది. +downloadFirefox = { -firefox } ను దింపుకోండి +legalTitle = { -send-short-brand } గోప్యతా నోటీసు +legalDateStamp = వెర్షన్ 1.0, మార్చి 12, 2019 నాటిది +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = ఎక్కించడానికి ఫైళ్ళను ఎంచుకోండి +uploadButton = ఎక్కించు +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ఫైళ్ళను లాగండి మరియు వదలండి +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = లేదా { $size } వరకు పంపడానికి నొక్కండి +addPassword = సంకేతపదంతో రక్షించండి +emailPlaceholder = ఈ ఈమెయిలును ఇవ్వండి +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size } వరకు పంపడానికి ప్రవేశించండి +signInOnlyButton = ప్రవేశించండి +accountBenefitTitle = ఒక { -firefox } ఖాతాని సృష్టించండి లేదా ప్రవేశించండి +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } పరిమాణం ఫైళ్ళ వరకు పంచుకోండి +accountBenefitDownloadCount = ఫైళ్లను ఎక్కువ మందితో పంచుకోండి +accountBenefitTimeLimit = + { $count -> + *[other] లంకెలను { $count } రోజుల వరకు చేతనంగా ఉంచు + } +accountBenefitSync = ఏదైనా పరికరం నుండి పంచుకున్న ఫైళ్ళను నిర్వహించండి +accountBenefitMoz = ఇతర { -mozilla } సేవల గురించి తెలుసుకోండి +signOut = నిష్క్రమించు +okButton = సరే +downloadingTitle = దింపుకుంటోంది +noStreamsWarning = ఈ బ్రౌజర్ ఈ ఫైలును పెద్దగా డీక్రిప్ట్ చేయలేకపోవచ్చు. +noStreamsOptionCopy = మరొక బ్రౌజర్‌లో తెరవడానికి లంకెను నకలు చేయండి +noStreamsOptionFirefox = మా అభిమాన బ్రౌజర్‌ను ప్రయత్నించండి +noStreamsOptionDownload = ఈ బ్రౌజర్‌తో కొనసాగించండి +downloadFirefoxPromo = { -send-short-brand } క్రొత్త { -firefox } ద్వారా మీ ముందుకు తీసుకురాబడుతుంది. +# the next line after the colon contains a file name +shareLinkDescription = మీ ఫైలుకు లంకెను పంచుకోండి: +shareLinkButton = లంకెను పంచుకోండి +# $name is the name of the file +shareMessage = “{ $name }”‌ని { -send-brand }తో దించుకోండి: తేలికైన, సురక్షితమైన ఫైలు పంచుకోలు సేవ +trailheadPromo = మీ అంతరంగికతను కాపాడుకోడానికి ఓ మార్గం ఉంది. Firefoxతో చేరండి. +learnMore = ఇంకా తెలుసుకోండి. diff --git a/public/locales/th/send.ftl b/public/locales/th/send.ftl new file mode 100644 index 00000000..8188de54 --- /dev/null +++ b/public/locales/th/send.ftl @@ -0,0 +1,140 @@ +title = Send +importingFile = กำลังนำเข้า… +encryptingFile = กำลังเข้ารหัส… +decryptingFile = กำลังถอดรหัส… +downloadCount = + { $num -> + *[other] { $num } การดาวน์โหลด + } +timespanHours = + { $num -> + *[other] { $num } ชั่วโมง + } +copiedUrl = คัดลอกแล้ว! +unlockInputPlaceholder = รหัสผ่าน +unlockButtonLabel = ปลดล็อก +downloadButtonLabel = ดาวน์โหลด +downloadFinish = การดาวน์โหลดเสร็จสมบูรณ์ +fileSizeProgress = ({ $partialSize } จาก { $totalSize }) +sendYourFilesLink = ลองใช้ Send +errorPageHeader = มีบางอย่างผิดพลาด! +fileTooBig = ไฟล์นั้นใหญ่เกินกว่าจะอัปโหลดได้ ไฟล์ที่จะอัปโหลดควรมีขนาดน้อยกว่า { $size } +linkExpiredAlt = ลิงก์หมดอายุแล้ว +notSupportedHeader = ไม่รองรับเบราว์เซอร์ของคุณ +notSupportedLink = ทำไมจึงไม่รองรับเบราว์เซอร์ของฉัน? +notSupportedOutdatedDetail = น่าเสียดายที่ Firefox รุ่นนี้ไม่สนับสนุนเทคโนโลยีเว็บที่ขับเคลื่อน Send คุณจะต้องอัปเดตเบราว์เซอร์ของคุณ +updateFirefox = อัปเดต Firefox +deletePopupCancel = ยกเลิก +deleteButtonHover = ลบ +passwordTryAgain = รหัสผ่านไม่ถูกต้อง ลองอีกครั้ง +javascriptRequired = Send จำเป็นต้องใช้ JavaScript +whyJavascript = ทำไม Send จึงจำเป็นต้องใช้ JavaScript? +enableJavascript = โปรดเปิดใช้งาน JavaScript แล้วลองอีกครั้ง +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } ชม. { $minutes } นาที +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } นาที +# A short status message shown when the user enters a long password +maxPasswordLength = ความยาวรหัสผ่านสูงสุด: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ไม่สามารถตั้งรหัสผ่านนี้ได้ + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = การแบ่งปันไฟล์ที่ง่ายและเป็นส่วนตัว +introDescription = { -send-brand } ให้คุณแบ่งปันไฟล์ด้วยการเข้ารหัสจากต้นทางถึงปลายทางและลิงก์ที่หมดอายุโดยอัตโนมัติ คุณจึงสามารถเก็บสิ่งที่คุณแบ่งปันไว้เป็นส่วนตัวและตรวจสอบให้แน่ใจว่าข้อมูลของคุณจะไม่ออนไลน์ตลอดไป +notifyUploadEncryptDone = ไฟล์ของคุณได้รับการเข้ารหัสและพร้อมส่ง +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = หมดอายุหลังจาก { $downloadCount } หรือ { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } นาที + } +timespanDays = + { $num -> + *[other] { $num } วัน + } +timespanWeeks = + { $num -> + *[other] { $num } สัปดาห์ + } +fileCount = + { $num -> + *[other] { $num } ไฟล์ + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ขนาดรวม: { $size } +# the next line after the colon contains a file name +copyLinkDescription = คัดลอกลิงก์เพื่อแบ่งปันไฟล์ของคุณ: +copyLinkButton = คัดลอกลิงก์ +downloadTitle = ดาวน์โหลดไฟล์ +downloadDescription = ไฟล์นี้ถูกแบ่งปันผ่าน { -send-brand } พร้อมการเข้ารหัสจากต้นทางถึงปลายทางและลิงก์ที่หมดอายุโดยอัตโนมัติ +trySendDescription = ลองใช้ { -send-brand } สำหรับการแบ่งปันไฟล์ที่ง่ายและปลอดภัย +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] สามารถอัปโหลดได้ครั้งละ { $count } ไฟล์เท่านั้น + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] สามารถอัปโหลดไฟล์เก็บถาวรได้เพียง { $count } ไฟล์เท่านั้น + } +expiredTitle = ลิงก์นี้หมดอายุแล้ว +notSupportedDescription = { -send-brand } จะไม่ทำงานกับเบราว์เซอร์นี้ { -send-short-brand } จะทำงานได้ดีที่สุดกับ { -firefox } รุ่นล่าสุด และจะทำงานกับเบราว์เซอร์ส่วนใหญ่ที่เป็นรุ่นปัจจุบัน +downloadFirefox = ดาวน์โหลด { -firefox } +legalTitle = ประกาศความเป็นส่วนตัวของ { -send-short-brand } +legalDateStamp = รุ่น 1.0 วันที่ 12 มีนาคม 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } วัน { $hours } ชม. { $minutes } นาที +addFilesButton = เลือกไฟล์ที่จะอัปโหลด +uploadButton = อัปโหลด +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ลากแล้วปล่อยไฟล์ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = หรือคลิกเพื่อส่งได้ถึง { $size } +addPassword = ปกป้องด้วยรหัสผ่าน +emailPlaceholder = ป้อนอีเมลของคุณ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = ลงชื่อเข้าเพื่อส่งได้ถึง { $size } +signInOnlyButton = ลงชื่อเข้า +accountBenefitTitle = สร้างบัญชี { -firefox } หรือลงชื่อเข้า +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = แบ่งปันไฟล์สูงสุดถึง { $size } +accountBenefitDownloadCount = แบ่งปันไฟล์กับผู้คนมากขึ้น +accountBenefitTimeLimit = + { $count -> + *[other] ให้ลิงก์ใช้งานได้นานถึง { $count } วัน + } +accountBenefitSync = จัดการไฟล์ที่แบ่งปันจากอุปกรณ์ใด ๆ +accountBenefitMoz = เรียนรู้เกี่ยวกับบริการ { -mozilla } อื่น ๆ +signOut = ลงชื่อออก +okButton = ตกลง +downloadingTitle = กำลังดาวน์โหลด +noStreamsWarning = เบราว์เซอร์นี้อาจไม่สามารถถอดรหัสไฟล์ขนาดใหญ่เท่านี้ได้ +noStreamsOptionCopy = คัดลอกลิงก์เพื่อเปิดในเบราว์เซอร์อื่น +noStreamsOptionFirefox = ลองเบราว์เซอร์โปรดของเรา +noStreamsOptionDownload = ดำเนินการต่อด้วยเบราว์เซอร์นี้ +downloadFirefoxPromo = { -send-short-brand } สนับสนุนโดย { -firefox } โฉมใหม่ +# the next line after the colon contains a file name +shareLinkDescription = แบ่งปันลิงก์ไปยังไฟล์ของคุณ: +shareLinkButton = แบ่งปันลิงก์ +# $name is the name of the file +shareMessage = ดาวน์โหลด “{ $name }” ด้วย { -send-brand }: การแบ่งปันไฟล์ที่ง่ายและเป็นส่วนตัว +trailheadPromo = มีวิธีปกป้องความเป็นส่วนตัวของคุณ เข้าร่วม Firefox +learnMore = เรียนรู้เพิ่มเติม diff --git a/public/locales/tl/send.ftl b/public/locales/tl/send.ftl index de0e5e44..eb19ae61 100644 --- a/public/locales/tl/send.ftl +++ b/public/locales/tl/send.ftl @@ -1,91 +1,112 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Ipadala -siteSubtitle = eksperimento sa web -siteFeedback = Feedback -uploadPageHeader = Pribadong, Naka-encrypt na Pagbabahagi ng File -uploadPageExplainer = Magpadala ng mga file sa pamamagitan ng isang ligtas, pribado, at naka-encrypt na link na awtomatikong mawawalan ng bisa upang matiyak na ang iyong mga bagay-bagay ay hindi mananatiling online magpakailanman. -uploadPageLearnMore = Matuto ng higit pa -uploadPageDropMessage = I-drop ang iyong file dito upang simulan ang pag-upload -uploadPageSizeMessage = Para sa pinaka maaasahang operasyon, pinakamahusay na panatilihin ang iyong file sa ilalim ng 1GB -uploadPageBrowseButton = Pumili ng isang file sa iyong computer -uploadPageBrowseButton1 = Pumili ng isang file na mai-upload -uploadPageMultipleFilesAlert = Kasalukuyang hindi sinusuportahan ang pag-upload ng maramihang mga file o isang folder. -uploadPageBrowseButtonTitle = I-upload ang file -uploadingPageProgress = Uploading { $filename } ({ $size }) +title = Send importingFile = Importing… -verifyingFile = Pinatutunayan... encryptingFile = Encrypting… decryptingFile = Decrypting… -notifyUploadDone = Natapos na ang iyong pag-upload. -uploadingPageMessage = Sa sandaling mag-upload ang iyong file, makakapagtakda ka ng mga expire na pagpipilian. -uploadingPageCancel = Kanselahin ang pag-upload -uploadCancelNotification = Kinansela ang iyong pag-upload. -uploadingPageLargeFileMessage = Ang file na ito ay malaki at maaaring tumagal ng ilang sandali upang mag-upload. Umupo nang masikip! -uploadingFileNotification = Abisuhan ako kapag nakumpleto na ang pag-upload. -uploadSuccessConfirmHeader = Handa nang Ipadala -uploadSvgAlt = I-upload -uploadSuccessTimingHeader = Mag-e-expire ang link sa iyong file pagkatapos ng 1 pag-download o sa loob ng 24 na oras. -copyUrlFormLabelWithName = Kopyahin at ibahagi ang link upang ipadala ang iyong file: { $filename } -copyUrlFormButton = Kopyahin sa clipboard +downloadCount = + { $num -> + [one] 1 pag-download + *[other] { $num } na mga pag-download + } copiedUrl = Naikopya! -deleteFileButton = Burahin ang file -sendAnotherFileLink = Magpadala ng isang file -// Alternative text used on the download link/button (indicates an action). -downloadAltText = I-download -downloadFileName = I-download { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ilagay ang Password unlockInputPlaceholder = Password unlockButtonLabel = I-unlock -downloadFileTitle = I-download ang Na-encrypt na File -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ang iyong kaibigan ay nagpapadala sa iyo ng isang file na may Firefox Send, isang serbisyo na nagbibigay-daan sa iyo upang magbahagi ng mga file sa isang ligtas, pribado, at naka-encrypt na link na awtomatikong mawawalan ng bisa upang matiyak na ang iyong mga bagay-bagay ay hindi mananatiling online magpakailanman. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = I-download -downloadNotification = Nakumpleto na ang iyong pag-download. downloadFinish = Kumpleto ang Download -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } ng { $totalSize }) -// Firefox Send is a brand name and should not be localized. sendYourFilesLink = Subukan ang Firefox Ipadala -downloadingPageProgress = Downloading { $filename } ({ $size }) -downloadingPageMessage = Paki-iwan ang tab na ito habang binuksan namin ang iyong file at i-decrypt ito. -errorAltText = Mag-upload ng error errorPageHeader = May nagkamali! -errorPageMessage = Nagkaroon ng error sa pag-upload ng file. -errorPageLink = Magpadala ng isang file fileTooBig = Ang file na iyon ay masyadong malaki upang mag-upload. Dapat itong mas mababa sa { $size }. linkExpiredAlt = Nag-expire na ang link -expiredPageHeader = Nag-expire na ang link na ito o hindi kailanman umiiral sa unang lugar! notSupportedHeader = Ang iyong browser ay hindi suportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Sa kasamaang palad hindi sinusuportahan ng browser na ito ang teknolohiya sa web na nagpapagana ng Firefox Send. Kailangan mong subukan ang ibang browser. Inirerekomenda namin ang Firefox! notSupportedLink = Bakit hindi suportado ang aking browser? -notSupportedOutdatedDetail = Sa kasamaang palad ang bersyon na ito ng Firefox ay hindi sumusuporta sa teknolohiya ng web na nagpapagana ng Firefox Send. Kailangan mong i-update ang iyong browser. +notSupportedOutdatedDetail = Sa kasamaang palad ang bersyon na ito ng Firefox ay hindi sumusuporta sa teknolohiya ng web na nagpapagana ng Send. Kailangan mong i-update ang iyong browser. updateFirefox = I-update ang Firefox -downloadFirefoxButtonSub = Libreng Download -uploadedFile = File -copyFileList = Kopyahin ang URL -// expiryFileList is used as a column header -expiryFileList = Magtatapos Sa -deleteFileList = I-delete -nevermindButton = Hindi bale -legalHeader = Mga Tuntunin at Pagkapribado -legalNoticeTestPilot = Ang Firefox Ipadala ay kasalukuyang eksperimentong Test Pilot, at napapailalim sa Mga Tuntunin ng Serbisyo at Paunawa sa Privacy. Maaari kang matuto nang higit pa tungkol sa eksperimentong ito at ang koleksyon ng data nito dito. -legalNoticeMozilla = Ang paggamit ng website ng Ipadala ang Firefox ay napapailalim din sa Mga Patakaran sa Privacy ng Website ng Mozilla at Mga Tuntunin ng Paggamit ng Website. -deletePopupText = Tanggalin ang file na ito? -deletePopupYes = Oo deletePopupCancel = Kanselahin deleteButtonHover = I-delete -copyUrlHover = Kopyahin ang URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Tungkol sa Test Pilot -footerLinkPrivacy = Privacy -footerLinkTerms = Mga term -footerLinkCookies = Mga cookie -requirePasswordCheckbox = Mangailangan ng isang password upang i-download ang file na ito -addPasswordButton = Magdagdag ng password passwordTryAgain = Maling password. Subukan muli. -// This label is followed by the password needed to download a file -passwordResult = Password: { $password } +javascriptRequired = Nangangailangan ang Send ng JavaScript +whyJavascript = Bakit ang Send ay nangangailangan ng JavaScript? +enableJavascript = Mangyaring paganahin ang JavaScript at subukan muli. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Pinakamataas na haba ng password: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Hindi maitakda ang password na ito + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = I-send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simple, pribadong pagbabahagi ng file +notifyUploadEncryptDone = Ang iyong file ay naka-encrypt at handa na i-send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = mag-e-expire pagkatapos { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } mga minuto + } +timespanDays = + { $num -> + [one] 1 araw + *[other] { $num } mga araw + } +timespanWeeks = + { $num -> + [one] 1 linggo + *[other] { $num } mga linggo + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } mga file + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Kabuuang sukat: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopyahin ang link upang ibahagi ang iyong file: +copyLinkButton = Kopyahin ang link +downloadTitle = I-download ang mga file +expiredTitle = Ang link na ito ay nag-expire. +downloadFirefox = I-download { -firefox } +legalTitle = { -send-short-brand } Abiso sa Privacy +legalDateStamp = Bersyon 1.0, petsa ng Marso 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Piliin ang mga file na mai-upload +uploadButton = I-upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = I-drag at i-drop ang mga file +addPassword = Protektahan gamit ang password +emailPlaceholder = Ipasok ang iyong email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Mag-sign in upang magpadala ng hanggang sa { $size } +signInOnlyButton = Mag sign-in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ibahagi ang mga file hanggang sa { $size } +accountBenefitDownloadCount = Ibahagi ang mga file sa ibang tao +accountBenefitMoz = Alamin ang tungkol sa iba pang mga serbisyo ng { -mozilla } +signOut = Mag sign-out +okButton = OK +downloadingTitle = Pag-download +noStreamsWarning = Maaaring hindi mai-decrypt ng browser na ito ang isang file na malaki. +noStreamsOptionCopy = Kopyahin ang link upang buksan sa isa pang browser +noStreamsOptionFirefox = Subukan ang aming paboritong browser +noStreamsOptionDownload = Magpatuloy sa browser na ito +shareLinkButton = Ibahagi ang link +learnMore = Matuto ng higit pa. diff --git a/public/locales/tr/send.ftl b/public/locales/tr/send.ftl index 34e2904a..a216cf8d 100644 --- a/public/locales/tr/send.ftl +++ b/public/locales/tr/send.ftl @@ -1,91 +1,145 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = web deneyi -siteFeedback = Görüş bildir -uploadPageHeader = Kişiye özel, şifrelenmiş dosya paylaşımı -uploadPageExplainer = Dosyalarınızı güvenli, size özel, şifrelenmiş ve otomatik olarak silinen bir bağlantıyla gönderin. Özel dosyalarınız sonsuza dek internette kalmasın. -uploadPageLearnMore = Daha fazla bilgi alın -uploadPageDropMessage = Yüklemeyi başlatmak için dosyanızı buraya bırakın -uploadPageSizeMessage = Sorun yaşamamak adına dosyanızın 1 GB’den küçük olmasını öneririz -uploadPageBrowseButton = Bilgisayarınızdan bir dosya seçin -uploadPageBrowseButton1 = Yüklenecek dosyayı seçin -uploadPageMultipleFilesAlert = Birden fazla dosya veya klasör yükleme şimdilik desteklenmiyor. -uploadPageBrowseButtonTitle = Dosyayı yükle -uploadingPageProgress = { $filename } yükleniyor ({ $size }) +title = Send importingFile = İçe aktarılıyor… -verifyingFile = Doğrulanıyor… encryptingFile = Şifreleniyor… decryptingFile = Şifre çözülüyor… -notifyUploadDone = Yüklemeniz tamamlandı. -uploadingPageMessage = Dosyanız yüklendikten sonra zaman aşımını ayarlayabileceksiniz. -uploadingPageCancel = Yüklemeyi iptal et -uploadCancelNotification = Yüklemeniz iptal edildi. -uploadingPageLargeFileMessage = Bu dosya büyük olduğu için yüklenmesi zaman alabilir. Sayfayı kapatmayın! -uploadingFileNotification = Yükleme bitince bana haber ver. -uploadSuccessConfirmHeader = Göndermeye hazır -uploadSvgAlt = Yükle -uploadSuccessTimingHeader = Dosyanız 1 kez indirildikten veya 24 saat geçtikten sonra linkiniz geçersiz olacaktır. -copyUrlFormLabelWithName = { $filename } dosyanızı başkasına göndermek için aşağıdaki linki kopyalayın. -copyUrlFormButton = Panoya kopyala +downloadCount = { $num } indirme +timespanHours = + { $num -> + [one] 1 saat + *[other] { $num } saat + } copiedUrl = Kopyalandı! -deleteFileButton = Dosyayı sil -sendAnotherFileLink = Başka bir dosya daha gönder -// Alternative text used on the download link/button (indicates an action). -downloadAltText = İndir -downloadFileName = { $filename } dosyasını indir -downloadFileSize = ({ $size }) -unlockInputLabel = Parolayı yazın unlockInputPlaceholder = Parola unlockButtonLabel = Kilidi aç -downloadFileTitle = Şifrelenmiş dosyayı indir -// Firefox Send is a brand name and should not be localized. -downloadMessage = Arkadaşınız size Firefox Send ile bir dosya gönderdi. Firefox Send; dosyalarınızı güvenli, size özel, şifrelenmiş ve otomatik olarak silinen bir bağlantıyla paylaşmayı sağlar. Böylece özel dosyalarınız sonsuza dek internette kalmaz. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = İndir -downloadNotification = İndirme tamamlandı. downloadFinish = İndirme tamamlandı -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send’i deneyin -downloadingPageProgress = { $filename } indiriliyor ({ $size }) -downloadingPageMessage = Dosyanız indirilip şifresi çözülürken lütfen bu sekmeyi açık bırakın. -errorAltText = Yükleme hatası +sendYourFilesLink = Send’i deneyin errorPageHeader = Bir şeyler ters gitti! -errorPageMessage = Dosyanız yüklenirken bir hata oluştu. -errorPageLink = Başka bir dosya gönder fileTooBig = Dosyanız çok büyük. En fazla { $size } boyutunda olmalı. linkExpiredAlt = Bağlantı zaman aşımına uğramış -expiredPageHeader = Bu bağlantı zaman aşımına uğramış veya böyle bir bağlantı hiç yoktu. notSupportedHeader = Tarayıcınız desteklenmiyor. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ne yazık ki tarayıcınız Firefox Send için gereken web teknolojilerini desteklemiyor. Başka bir tarayıcıyla deneyebilirsiniz. Önerimiz tabii ki Firefox! notSupportedLink = Tarayıcım neden desteklenmiyor? -notSupportedOutdatedDetail = Kullandığınız Firefox sürümü Firefox Send için gereken web teknolojilerini desteklemiyor. Tarayıcınızı güncellemeniz gerekiyor. +notSupportedOutdatedDetail = Kullandığınız Firefox sürümü Send için gereken web teknolojilerini desteklemiyor. Tarayıcınızı güncellemeniz gerekiyor. updateFirefox = Firefox’u güncelle -downloadFirefoxButtonSub = Ücretsiz indirin -uploadedFile = Dosya -copyFileList = Adresi kopyala -// expiryFileList is used as a column header -expiryFileList = Bitiş süresi -deleteFileList = Sil -nevermindButton = Boş ver -legalHeader = Şart ve Koşullar -legalNoticeTestPilot = Firefox Send bir Test Pilotu deneyidir ve Test Pilotu Hizmet Koşulları ile Gizlilik Bildirimi’ne tabidir. Bu deney ve topladığı veriler hakkında daha fazla bilgi almak isterseniz buraya bakabilirsiniz. -legalNoticeMozilla = Firefox Send’i kullanmak Mozilla’nın Web Siteleri Gizlilik Bildirimi ve Web Siteleri Kullanım Koşulları’na da tabidir. -deletePopupText = Bu dosya silinsin mi? -deletePopupYes = Evet deletePopupCancel = Vazgeç deleteButtonHover = Sil -copyUrlHover = Adresi kopyala -footerLinkLegal = Yasal Bilgiler -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilotu hakkında -footerLinkPrivacy = Gizlilik -footerLinkTerms = Şartlar -footerLinkCookies = Çerezler -requirePasswordCheckbox = Bu dosyayı indirmek için parola iste -addPasswordButton = Parola ekle passwordTryAgain = Yanlış parola. Yeniden deneyin. -// This label is followed by the password needed to download a file -passwordResult = Parola: { $password } +javascriptRequired = Send için JavaScript gerekir +whyJavascript = Send neden JavaScript kullanıyor? +enableJavascript = Lütfen JavaScript'i etkinleştirip yeniden deneyin. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } sa { $minutes } dk +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } dk +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum parola uzunluğu: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Parola ayarlanamadı + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Basit ve gizli dosya paylaşımı +introDescription = { -send-brand } ile dosyalarınızı uçtan uca şifreleme ve otomatik olarak silinen bir bağlantıyla paylaşın. Böylece özel dosyalarınız güvenle saklanır, bir süre sonra kendi kendine silinir. +notifyUploadEncryptDone = Dosyanız şifrelendi ve gönderilmeye hazır +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } veya { $timespan } sonra silinecek +timespanMinutes = + { $num -> + [one] 1 dakika + *[other] { $num } dakika + } +timespanDays = + { $num -> + [one] 1 gün + *[other] { $num } gün + } +timespanWeeks = + { $num -> + [one] 1 hafta + *[other] { $num } hafta + } +fileCount = + { $num -> + [one] 1 dosya + *[other] { $num } dosya + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Toplam boyut: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Dosyanızı paylaşmak için bağlantıyı kopyalayın: +copyLinkButton = Bağlantıyı kopyala +downloadTitle = Dosyaları indir +downloadDescription = Bu dosya { -send-brand } üzerinden paylaşıldı. Uçtan uca şifreleme ve kendiliğinden silinen bağlantı koruması { -send-brand }’de. +trySendDescription = Basit ve güvenli dosya paylaşımı için { -send-brand }’i deneyin. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Bir kerede en fazla 1 dosya yükleyebilirsiniz. + *[other] Bir kerede en fazla { $count } dosya yükleyebilirsiniz. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] En fazla 1 arşive izin veriliyor. + *[other] En fazla { $count } arşive izin veriliyor. + } +expiredTitle = Bu bağlantının süresi doldu. +notSupportedDescription = { -send-brand } bu tarayıcıyı desteklemiyor. { -send-short-brand } en iyi şekilde { -firefox }’un son sürümüyle ve çoğu tarayıcının güncel sürümüyle çalışır. +downloadFirefox = { -firefox }’u indir +legalTitle = { -send-short-brand } Gizlilik Bildirimi +legalDateStamp = Sürüm 1.0, 12 Mart 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } g { $hours } sa { $minutes } dk +addFilesButton = Yüklenecek dosyaları seçin +uploadButton = Yükle +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dosyaları sürükleyip bırakarak +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = veya buraya tıklayarak { $size }’ye kadar dosyalarınızı gönderebilirsiniz +addPassword = Parola koruması ekle +emailPlaceholder = E-posta adresinizi yazın +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size }’ye kadar dosya göndermek için giriş yapın +signInOnlyButton = Giriş yap +accountBenefitTitle = { -firefox } Hesabı açın veya giriş yapın +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } boyutlu dosyaları paylaşma +accountBenefitDownloadCount = Daha fazla kişiyle dosya paylaşma +accountBenefitTimeLimit = + { $count -> + [one] Bağlantıları 1 güne kadar aktif tutma + *[other] Bağlantıları { $count } güne kadar aktif tutma + } +accountBenefitSync = Paylaştığınız dosyaları başka cihazlardan yönetebilme +accountBenefitMoz = Diğer { -mozilla } servisleri hakkında bilgi alma +signOut = Çıkış yap +okButton = Tamam +downloadingTitle = İndiriliyor +noStreamsWarning = Bu tarayıcı bu kadar büyük bir dosyanın şifresini çözemeyebilir. +noStreamsOptionCopy = Bağlantıyı başka bir tarayıcıda açmak için kopyala +noStreamsOptionFirefox = En sevdiğimiz tarayıcıyı deneyin +noStreamsOptionDownload = Bu tarayıcıyla devam edin +downloadFirefoxPromo = { -send-short-brand }, yepyeni { -firefox } tarafından sunulmaktadır. +# the next line after the colon contains a file name +shareLinkDescription = Dosyanızın bağlantısını paylaşın: +shareLinkButton = Bağlantıyı paylaş +# $name is the name of the file +shareMessage = “{ $name }” dosyasını { -send-brand } ile indirin: basit ve güvenli dosya paylaşımı +trailheadPromo = Gizliliğinizi korumanın bir yolu var. Firefox’a katılın. +learnMore = Daha fazla bilgi alın. diff --git a/public/locales/trs/send.ftl b/public/locales/trs/send.ftl new file mode 100644 index 00000000..a13a2836 --- /dev/null +++ b/public/locales/trs/send.ftl @@ -0,0 +1,95 @@ +title = Send +importingFile = Hìaj a'nïn huan'ānj… +encryptingFile = Nagi'iaj hùij… +decryptingFile = Hìaj nâ'nïn… +downloadCount = + { $num -> + [one] 1 sa nadunin + *[other] { $num } nej sa nadunin + } +timespanHours = + { $num -> + [one] 1 ôra + *[other] { $num } nej ôra + } +copiedUrl = Ngà gisîj guxunj! +unlockInputPlaceholder = Da'nga' huìi +unlockButtonLabel = Na'nïn riñanj +downloadButtonLabel = Nadunïnj +downloadFinish = Ngà nahui nanïnj +fileSizeProgress = ({ $partialSize } guendâ { $totalSize }) +sendYourFilesLink = Garahuè dàj 'iaj sun Send +errorPageHeader = Huā sa gahui a'nan'! +fileTooBig = Ûta yachìj hua archibô dan. Da'ui gā li doj ga da' { $size } +linkExpiredAlt = Nitāj si ni'ñānj lînk gà' +notSupportedHeader = Nitāj si huā hue'ê riña sa nana'uî't. +notSupportedLink = Nù huin saj nitāj si huā hue'ê riña sa nana'uí? +notSupportedOutdatedDetail = Nu unùkuaj Firefox nan gi'iaj sunj ngà sa 'iaj sun ngà Send. Da'uît nāgi'iaj nakàt riña sa nana'uî't han. +updateFirefox = Nagi'iaj nakà Firefox +deletePopupCancel = Duyichin' +deleteButtonHover = Dure' +passwordTryAgain = Sê da'nga' huì dan huin. Ginù huin ñû. +javascriptRequired = Ni'ñānj Send JavaScript +whyJavascript = Nù huin saj ni'ñānj Send JavaScript rà'aj? +enableJavascript = Gi'iaj sunūj u ga'nïn gi'iaj sun JavaScript nī yakāj da'nga' ñû. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Dānaj gā yachìj da'nga huìi: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Na'ue gārayinaj da'nga huìi + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Hìo nī huì ga’ue duyingâ’t archîbo +introDescription = { -send-brand } a’nïn duyingâ’t archîbo ngà ‘ngō da’nga’rán hia nī ngà ‘ngō lînk nare’ man‘an. Dànanj nī ‘ngō rïnt ni’in sa duyingâ’t nī si lînk si ginu yitïn riña lînia. +notifyUploadEncryptDone = Ngà huā ran si archibôt nī ngà huā yugui da’ ga’nïnjt gan’an +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Narè’ man ne’ rukù { $downloadCount } asi { $timespan } +timespanMinutes = + { $num -> + [one] 1 minûtu + *[other] { $num } minûtu + } +timespanDays = + { $num -> + [one] 1 gui + *[other] { $num } gui + } +timespanWeeks = + { $num -> + [one] 1 semâna + *[other] { $num } semâna + } +fileCount = + { $num -> + [one] 1 archîbo + *[other] { $num } archîbo + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Dàj nìko yàchi: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Guxūn lînk da' ga'ue duyingâ't archibô: +copyLinkButton = Guxûn lînk +downloadTitle = Nadunïnj nej archîbo +downloadFirefox = Nadunïnj { -firefox } +legalTitle = Nuguan huì nikāj { -send-short-brand } +signOut = Narun' sesiôn +okButton = Ga'ue +shareLinkButton = Duguachîn enlâse diff --git a/public/locales/uk/send.ftl b/public/locales/uk/send.ftl index cc59828f..d49fabdc 100644 --- a/public/locales/uk/send.ftl +++ b/public/locales/uk/send.ftl @@ -1,82 +1,158 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = веб-експеримент -siteFeedback = Відгуки -uploadPageHeader = Приватний, зашифрований обмін файлами -uploadPageExplainer = Надсилайте файли, використовуючи безпечні, приватні та зашифровані посилання, термін дії яких автоматично закінчується, щоб ваші файли не лишилися в Інтернеті назавжди. -uploadPageLearnMore = Докладніше -uploadPageDropMessage = Перетягніть свій файл сюди, щоб почати вивантаження -uploadPageSizeMessage = Для більш надійної роботи сервісу, розмір вашого файлу не має перевищувати 1ГБ. -uploadPageBrowseButton = Виберіть файл на комп'ютері -uploadPageBrowseButton1 = Виберіть файл для вивантаження -uploadPageMultipleFilesAlert = Вивантаження кількох файлів чи тек на даний момент не підтримується. -uploadPageBrowseButtonTitle = Вивантажити файл -uploadingPageProgress = Вивантажуємо { $filename } ({ $size }) +title = Send importingFile = Імпортуємо... -verifyingFile = Перевіряємо... encryptingFile = Шифруємо... decryptingFile = Розшифровуємо... -notifyUploadDone = Ваше вивантаження завершено. -uploadingPageMessage = Як тільки ваш вайл вивантажиться,ви зможете встановити термін зберігання. -uploadingPageCancel = Скасувати вивантаження -uploadCancelNotification = Ваше вивантаження було скасовано. -uploadingPageLargeFileMessage = Цей файл доволі великий і його вивантаження може зайняти певний час. Тримайтеся! -uploadingFileNotification = Сповістити мене, коли вивантаження буде готово. -uploadSuccessConfirmHeader = Готовий до надсилання -uploadSvgAlt = Вивантажити -uploadSuccessTimingHeader = Час дії цього посилання закінчиться після 1 завантаження, або через 24 години. -copyUrlFormLabelWithName = Скопіювати і поділитися посиланням на ваш файл: { $filename } -copyUrlFormButton = Копіювати у буфер обміну +downloadCount = + { $num -> + [one] 1 завантаження + [few] { $num } завантаження + *[other] { $num } завантажень + } +timespanHours = + { $num -> + [one] 1 година + [few] { $num } години + *[other] { $num } годин + } copiedUrl = Скопійовано! -deleteFileButton = Видалити файл -sendAnotherFileLink = Надіслати інший файл -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Завантаживи -downloadFileName = Завантажити { $filename } -downloadFileSize = ({ $size }) -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ваш друг надіслав файл за допомогою Firefox Send, який дозволяє ділитися файлами, використовуючи безпечні, приватні та зашифровані посилання, термін дії яких автоматично закінчується, щоб ваші файли не лишилися в Інтернеті назавжди. -// Text and title used on the download link/button (indicates an action). +unlockInputPlaceholder = Пароль +unlockButtonLabel = Розблокувати downloadButtonLabel = Завантажити -downloadNotification = Ваше завантаження готово. -downloadFinish = Завантаження готово -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Завантаження завершено fileSizeProgress = ({ $partialSize } з { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Спробуйте Firefox Send -downloadingPageProgress = Завантаження { $filename } ({ $size }) -downloadingPageMessage = Будь ласка, залиште цю вкладку відкритою, поки ми завантажуємо ваш файл і розшифровуємо його. -errorAltText = Помилка вивантаження +sendYourFilesLink = Спробуйте Send errorPageHeader = Щось пішло не так! -errorPageMessage = Сталась помилка при вивантаженні цього файлу. -errorPageLink = Надіслати інший файл fileTooBig = Цей файл завеликий для вивантаження. Він має бути меншим за { $size }. linkExpiredAlt = Час дії посилання минув -expiredPageHeader = Посилання не існує, або час його дії минув! notSupportedHeader = Ваш браузер не підтримується. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = На жаль, цей браузер не підтримує веб-технологію, завдяки якій працює Firefox Send. Вам треба скористатися іншим браузером. Ми рекомендуємо Firefox! notSupportedLink = Чому мій браузер не підтримується? -notSupportedOutdatedDetail = На жаль, ця версія Firefox не підтримує веб-технологію, завдяки якій працює Firefox Send. Вам потрібно оновити свій браузер. +notSupportedOutdatedDetail = На жаль, ця версія Firefox не підтримує веб-технологію, завдяки якій працює Send. Вам потрібно оновити свій браузер. updateFirefox = Оновити Firefox -downloadFirefoxButtonSub = Безкоштовне завантаження -uploadedFile = Файл -copyFileList = Копіювати URL -// expiryFileList is used as a column header -expiryFileList = Термін дії закінчується -deleteFileList = Видалити -nevermindButton = Не важливо -legalHeader = Умови та конфіденційність -legalNoticeTestPilot = Firefox Send в даний час є експериментом Test Pilot, і тому підпадає під умови служби і повідомлення про приватність Test Pilot. Ви можете дізнатись більше про цей експеримент і його збір даних тут. -legalNoticeMozilla = Використання сайту Firefox Send також підпадає під повідомлення про конфіденційність веб-сайтів та правила використання веб-сайтів Mozilla. -deletePopupText = Видалити цей файл? -deletePopupYes = Так deletePopupCancel = Скасувати deleteButtonHover = Видалити -copyUrlHover = Копіювати URL -footerLinkLegal = Права -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Про Test Pilot -footerLinkPrivacy = Приватність -footerLinkTerms = Умови -footerLinkCookies = Куки +passwordTryAgain = Невірний пароль. Спробуйте знову. +javascriptRequired = Send потребує JavaScript +whyJavascript = Чому для Send потрібен JavaScript? +enableJavascript = Будь ласка, увімкніть JavaScript та спробуйте знову. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } год. { $minutes } хв. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } хв. +# A short status message shown when the user enters a long password +maxPasswordLength = Найбільша довжина паролю: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Неможливо встановити цей пароль + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Простий, приватний обмін файлами +introDescription = { -send-brand } дозволяє обмінюватися файлами з використанням наскрізного шифрування та посиланнями з обмеженим терміном дії. Отже, ви можете бути певними, що ваші дані зберігаються приватно і не залишаться в мережі назавжди. +notifyUploadEncryptDone = Ваш файл зашифрований і готовий до надсилання +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Термін зберігання завершується після { $downloadCount } або { $timespan } +timespanMinutes = + { $num -> + [one] 1 хвилина + [few] { $num } хвилини + *[other] { $num } хвилин + } +timespanDays = + { $num -> + [one] 1 день + [few] { $num } дні + *[other] { $num } днів + } +timespanWeeks = + { $num -> + [one] 1 тиждень + [few] { $num } тижні + *[other] { $num } тижнів + } +fileCount = + { $num -> + [one] 1 файл + [few] { $num } файли + *[other] { $num } файлів + } +# byte abbreviation +bytes = Б +# kibibyte abbreviation +kb = КБ +# mebibyte abbreviation +mb = МБ +# gibibyte abbreviation +gb = ГБ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Загальний розмір: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Скопіюйте посилання для спільного доступу: +copyLinkButton = Копіювати посилання +downloadTitle = Завантажити файли +downloadDescription = Цей файл було надіслано через { -send-brand } з використанням наскрізного шифрування і посиланням, що має обмежений термін дії. +trySendDescription = Спробуйте { -send-brand } для простого, захищеного обміну файлами. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Лише 1 файл можна вивантажити за один раз. + [few] Лише { $count } файли можна вивантажити за один раз. + *[other] Лише { $count } файлів можна вивантажити за один раз. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Дозволяється лише 1 архів. + [few] Дозволяється лише { $count } архіви. + *[other] Дозволяється лише { $count } архівів. + } +expiredTitle = Термін дії цього посилання завершився. +notSupportedDescription = { -send-brand } не працюватиме з цим браузером. { -send-short-brand } найкраще працює з найновішою версією { -firefox }, а також з більшістю інших браузерів. +downloadFirefox = Завантажити { -firefox } +legalTitle = Повідомлення про приватність { -send-short-brand } +legalDateStamp = Версія 1.0 від 12 березня 2019 року +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }д { $hours }г { $minutes }хв +addFilesButton = Оберіть файли для вивантаження +uploadButton = Вивантажити +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Перетягуйте файли +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = або натисніть, щоб надіслати до { $size } +addPassword = Захист паролем +emailPlaceholder = Введіть свою електронну пошту +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Увійдіть, щоб надсилати файли розміром до { $size } +signInOnlyButton = Увійти +accountBenefitTitle = Створіть обліковий запис { -firefox } або увійдіть +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Обмінюйтесь файлами розміром до { $size } +accountBenefitDownloadCount = Обмінюйтесь файлами з більшою кількістю людей +accountBenefitTimeLimit = + { $count -> + [one] Термін дії посилання 1 день + [few] Термін дії посилання { $count } дні + *[many] Термін дії посилання { $count } днів + } +accountBenefitSync = Керуйте спільними файлами з буль-якого пристрою +accountBenefitMoz = Дізнайтеся про інші сервіси { -mozilla } +signOut = Вийти +okButton = Гаразд +downloadingTitle = Завантаження +noStreamsWarning = Цьому браузеру може не вдатися розшифрувати такий великий файл. +noStreamsOptionCopy = Скопіюйте посилання, щоб відкрити його в іншому браузері +noStreamsOptionFirefox = Спробуйте наш улюблений браузер +noStreamsOptionDownload = Продовжити в цьому браузері +downloadFirefoxPromo = { -send-short-brand } доступний для вас в цілком новому { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Надішліть посилання на свій файл: +shareLinkButton = Поділитись посиланням +# $name is the name of the file +shareMessage = Завантажте “{ $name }” з { -send-brand }: простий та безпечний обмін файлами +trailheadPromo = Існує спосіб захистити вашу приватність. Приєднуйтесь до Firefox. +learnMore = Докладніше. diff --git a/public/locales/vi/send.ftl b/public/locales/vi/send.ftl index 81692eff..c1ed151e 100644 --- a/public/locales/vi/send.ftl +++ b/public/locales/vi/send.ftl @@ -1,82 +1,140 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Thử nghiệm trên web -siteFeedback = Phản hồi -uploadPageHeader = Chia sẻ tập tin riêng tư, được mã hóa -uploadPageExplainer = Gửi tập tin qua một liên kết an toàn, riêng tư, được mã hóa và tự động hết hạn để chắc chắn rằng dữ liệu của bạn không nằm mãi mãi trên Internet. -uploadPageLearnMore = Tìm hiểu thêm -uploadPageDropMessage = Kéo thả tập tin của bạn vào đây và bắt đầu tải lên -uploadPageSizeMessage = Để có thể hoạt động tốt nhất, hãy giữ tập tin của bạn dưới 1GB. -uploadPageBrowseButton = Chọn một tập tin từ máy tính -uploadPageBrowseButton1 = Chọn tập tin để tải lên -uploadPageMultipleFilesAlert = Tải lên nhiều tập tin một lúc hoặc tải lên một thư mục chưa được hỗ trợ. -uploadPageBrowseButtonTitle = Tải tập tin lên -uploadingPageProgress = Đang tải lên { $filename } ({ $size }) +title = Send importingFile = Đang nhập... -verifyingFile = Đang xác thực... encryptingFile = Đang mã hóa... decryptingFile = Đang giải mã... -notifyUploadDone = Quá trình tải lên đã hoàn tất. -uploadingPageMessage = Một khi tập tin được tải lên, bạn sẽ có thể thiết lập các tùy chọn hết hạn của tập tin. -uploadingPageCancel = Hủy tải lên -uploadCancelNotification = Quá trình tải lên đã bị hủy. -uploadingPageLargeFileMessage = Tập tin này khá nặng và sẽ tốn một chút thời gian để tải lên. Chờ chút nhé! -uploadingFileNotification = Thông báo cho tôi khi tải lên hoàn tất. -uploadSuccessConfirmHeader = Đã sẵn sàng để Gửi -uploadSvgAlt = Tải lên -uploadSuccessTimingHeader = Liên kết đến tập tin của bạn sẽ hết hạn sau 1 lượt tải về hoặc trong 24 giờ. -copyUrlFormLabelWithName = Sao chép và chia sẻ liên kết để gửi tập tin của bạn: { $filename } -copyUrlFormButton = Sao chép vào vùng nhớ tạm +downloadCount = + { $num -> + *[other] { $num } lượt tải + } +timespanHours = + { $num -> + *[other] { $num } giờ + } copiedUrl = Đã sao chép! -deleteFileButton = Xóa tập tin -sendAnotherFileLink = Gửi tập tin khác -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Tải về -downloadFileName = Tải về { $filename } -downloadFileSize = ({ $size }) -// Firefox Send is a brand name and should not be localized. -downloadMessage = Bạn của bạn đang gửi một tập tin thông qua Firefox Send, một dịch vụ cho phép bạn chia sẻ tập tin một cách an toàn, riêng tư, có liên kết được mã hóa và sẽ tự động hết hạn để chắc chắn rằng dữ liệu của bạn không nằm mãi mãi trên Internet. -// Text and title used on the download link/button (indicates an action). -downloadButtonLabel = Tải về -downloadNotification = Quá trình tải về đã hoàn tất. -downloadFinish = Tải về hoàn tất -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +unlockInputPlaceholder = Mật khẩu +unlockButtonLabel = Mở khóa +downloadButtonLabel = Tải xuống +downloadFinish = Tải xuống hoàn tất fileSizeProgress = ({ $partialSize } trong { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Dùng thử Firefox Send -downloadingPageProgress = Đang tải về { $filename } ({ $size }) -downloadingPageMessage = Vui lòng giữ cửa sổ này mở trong khi chúng tôi lấy tập tin và giải mã chúng. -errorAltText = Lỗi tải lên +sendYourFilesLink = Dùng thử Send errorPageHeader = Có gì đó không ổn! -errorPageMessage = Đã có lỗi trong quá trình tải lên tập tin. -errorPageLink = Gửi tập tin khác fileTooBig = Tập tin này quá lớn để tải lên. Kích thước tập tin phải nhỏ hơn { $size }. linkExpiredAlt = Liên kết đã hết hạn -expiredPageHeader = Liên kết này đã hết hạn hoặc chưa từng được sử dụng! notSupportedHeader = Trình duyệt của bạn không được hỗ trợ. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Thật không may trình duyệt này không hỗ trợ công nghệ đã tạo nên Firefox Send. Bạn cần thử với trình duyệt khác. Chúng tôi khuyên dùng Firefox! notSupportedLink = Tại sao trình duyệt của tôi không được hỗ trợ? -notSupportedOutdatedDetail = Thật không may là phiên bản Firefox này không hỗ trợ công nghệ được sử dụng trong Firefox Send. Bạn cần cập nhật trình duyệt của bạn. +notSupportedOutdatedDetail = Thật không may là phiên bản Firefox này không hỗ trợ công nghệ được sử dụng trong Send. Bạn cần cập nhật trình duyệt của bạn. updateFirefox = Cập nhật Firefox -downloadFirefoxButtonSub = Tải về miễn phí -uploadedFile = Tập tin -copyFileList = Sao chép URL -// expiryFileList is used as a column header -expiryFileList = Hết hạn trong -deleteFileList = Xóa -nevermindButton = Đừng bận tâm -legalHeader = Điều khoản & Quyền riêng tư -legalNoticeTestPilot = Firefox Send hiện tại đang là một thử nghiệm Test Pilot, và phải tuân theo Điều khoản dịch vụLưu ý về Quyền riêng tư. Bạn có thể tìm hiểu thêm về thử nghiệm này và dữ liệu được thu thập tại đây. -legalNoticeMozilla = Sử dụng trang web Firefox Send cũng phải tuân theo Mozilla's Lưu ý về Quyền riêng tư của trang webĐiều khoản sử dụng của trang web. -deletePopupText = Xóa tập tin này? -deletePopupYes = Đồng ý deletePopupCancel = Hủy bỏ deleteButtonHover = Xóa -copyUrlHover = Sao chép URL -footerLinkLegal = Pháp lý -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Về Test Pilot -footerLinkPrivacy = Quyền riêng tư -footerLinkTerms = Điều khoản -footerLinkCookies = Cookies +passwordTryAgain = Sai mật khẩu. Vui lòng thử lại. +javascriptRequired = Send cần JavaScript +whyJavascript = Tại sao Send cần JavaScript? +enableJavascript = Vui lòng kích hoạt JavaScript và thử lại. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } giờ { $minutes } phút +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } phút +# A short status message shown when the user enters a long password +maxPasswordLength = Độ dài mật khẩu tối đa: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Không thể đặt mật khẩu này + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Chia sẻ tập tin đơn giản, riêng tư +introDescription = { -send-brand } cho phép bạn chia sẻ các tập tin với mã hóa đầu cuối và một liên kết tự động hết hạn. Vì vậy, bạn có thể giữ những gì bạn chia sẻ riêng tư và đảm bảo dữ liệu của bạn không trực tuyến vĩnh viễn. +notifyUploadEncryptDone = Tập tin của bạn được mã hóa và sẵn sàng để gửi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Hết hạn sau { $downloadCount } hoặc { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } phút + } +timespanDays = + { $num -> + *[other] { $num } ngày + } +timespanWeeks = + { $num -> + *[other] { $num } tuần + } +fileCount = + { $num -> + *[other] { $num } tập tin + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tổng kích thước: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Sao chép liên kết để chia sẻ tập tin của bạn: +copyLinkButton = Sao chép liên kết +downloadTitle = Tải xuống tập tin +downloadDescription = Tập tin này đã được chia sẻ qua { -send-brand } với mã hóa đầu cuối và liên kết tự động hết hạn. +trySendDescription = Hãy thử { -send-brand } để chia sẻ tập tin đơn giản, an toàn. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] Chỉ { $count } tập tin có thể tải lên mỗi lần. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] Chỉ cho phép { $count } lưu trữ. + } +expiredTitle = Liên kết này đã hết hạn. +notSupportedDescription = { -send-brand } sẽ không hoạt động với trình duyệt này. { -send-short-brand } hoạt động tốt nhất với phiên bản { -firefox } mới nhất và sẽ hoạt động với phiên bản hiện tại của hầu hết các trình duyệt. +downloadFirefox = Tải xuống { -firefox } +legalTitle = Thông báo bảo mật { -send-short-brand } +legalDateStamp = Phiên bản 1.0, ngày 12 tháng 3 năm 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ngày { $hours } giờ { $minutes } phút +addFilesButton = Chọn tập tin để tải lên +uploadButton = Tải lên +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Kéo và thả tập tin +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = hoặc nhấp để gửi tối đa { $size } +addPassword = Bảo vệ bằng mật khẩu +emailPlaceholder = Nhập email của bạn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Đăng nhập để gửi tối đa { $size } +signInOnlyButton = Đăng nhập +accountBenefitTitle = Tạo tài khoản { -firefox } hoặc đăng nhập +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Chia sẻ tập tin lên tới { $size } +accountBenefitDownloadCount = Chia sẻ tập tin với nhiều người hơn +accountBenefitTimeLimit = + { $count -> + *[other] Giữ liên kết hoạt động tối đa { $count } ngày + } +accountBenefitSync = Quản lý tập tin được chia sẻ từ mọi thiết bị +accountBenefitMoz = Tìm hiểu về các dịch vụ khác của { -mozilla } +signOut = Đăng xuất +okButton = OK +downloadingTitle = Đang tải xuống +noStreamsWarning = Trình duyệt này có khả năng không thể giải mã một tập tin lớn này. +noStreamsOptionCopy = Sao chép liên kết để mở trong một trình duyệt khác +noStreamsOptionFirefox = Hãy dùng thử trình duyệt yêu thích của chúng tôi +noStreamsOptionDownload = Tiếp tục với trình duyệt này +downloadFirefoxPromo = { -send-short-brand } được mang đến cho bạn bởi { -firefox } hoàn toàn mới. +# the next line after the colon contains a file name +shareLinkDescription = Chia sẻ liên kết đến tập tin của bạn: +shareLinkButton = Chia sẻ liên kết +# $name is the name of the file +shareMessage = Tải xuống “{ $name }“ với { -send-brand }: chia sẻ tập tin đơn giản, an toàn +trailheadPromo = Đây là một cách để bảo vệ sự riêng tư của bạn. Tham gia Firefox. +learnMore = Tìm hiểu thêm. diff --git a/public/locales/yo/send.ftl b/public/locales/yo/send.ftl new file mode 100644 index 00000000..c95b77af --- /dev/null +++ b/public/locales/yo/send.ftl @@ -0,0 +1,113 @@ +title = Send je oruko ile-ise kan, kò sì ye ki a so di ibile. +importingFile = akowọle… +encryptingFile = Fifi ọrọ ṣiṣẹ… +decryptingFile = Ti nkọ nkan… +downloadCount = + { $num -> + [one] ìsíwá kan… + *[other] ọ̀pọ̀ ìsíwá… + } +timespanHours = + { $num -> + [one] Wákàtí kan + *[other] Ọ̀pọ wákàtí + } +copiedUrl = dakọ +unlockInputPlaceholder = + aṣínà + ọ̀rọ̀-aṣínà + ọ̀rọ̀-agbaniwọlé +unlockButtonLabel = ṣí +downloadButtonLabel = Ìgbasílẹ̀ +downloadFinish = + Ìsíwá parí + Ìgbasílẹ̀ parí +sendYourFilesLink = + Gbìyànjúu Send + Gbìyànjú lo Send + Dán Send wò +errorPageHeader = Nnkan o lo daadaa! +fileTooBig = + Fáìlì yìí tóbijù láti gbà sókè. Ó ní láti kéré sí { $size } + Fáìlì yìí tóbijù láti gbà sókè. Ó ní láti kéré ju { $size } lọ +linkExpiredAlt = + Ojú-òpó ti kásẹ̀ + Ojú-òpó ti pajújé + Ọ̀nà-òpó ti kásẹ̀ + Ọ̀nà-òpó ti pajújé +notSupportedHeader = + Èrọ-ìfarakọ́ra rẹ ò ní ìbátan + Ojú-òpó ìfarakọ́ra rẹ ò ní ìbátan +notSupportedLink = + Kí ló ṣe tí ẹ̀rọ-ìfarakọ́ra mi ò ní ìbátan? + Kí ló ṣe tí ẹ̀rọ-aṣàwárí mi ò ní ìbátan? + Kí nìdí tí ẹ̀rọ-ìfarakọ́ra mi ò ní ìbátan? + Kí nìdí tí ẹ̀rọ-aṣàwárí mi ò ní ìbátan? +notSupportedOutdatedDetail = Ó ṣe, wípé ẹ̀dà Firefox yí ò ní àtìlẹyìn ẹ̀rọ-alátagbà tí ó ń mú Send ṣiṣẹ́. O ní láti ṣe àgbéga èdà ẹ̀rọ-aṣàwárí rẹ kó bágbàmu. +updateFirefox = Mú Firefox bágbàmu +deletePopupCancel = + Nù kúrò + Parẹ́ +deleteButtonHover = + Mú kúrò + Parẹ́ + b’ófin mu + n’ílànà òfin + Ibi ìkọ̀kọ̀ + Ibi ìpamọ́ + Cookie + Àmì-ẹ̀rọ aránṣẹ́-jíṣẹ́ +passwordTryAgain = + Ọ̀rọ̀-aṣínà kò tọ́. Gbìyànjú síi + Ọ̀rọ̀-aṣíde kò tọ́. Gbìyànjú síi +javascriptRequired = Send nílòo JavaScript +whyJavascript = + Kí nìdí tí Firefox fi nílòo JavaScript? + Kí nìdí tí Firefox ṣe nílòo JavaScript? +enableJavascript = + Jọ̀wọ́ tán JavaScript sílẹ̀ kí o sì gbìyànjú si. + Jọ̀wọ́ ṣí JavaScript sílẹ̀ kí o sì gbìyànjú si. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = + { $hours }w { $minutes }i + { $hours }wákàtí { $minutes }iṣẹ́jú +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }i +# A short status message shown when the user enters a long password +maxPasswordLength = Ìdíwọ̀n ọ̀rọ̀-aṣínà: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = + Ọ̀rọ̀-aṣínà yí kò ṣeé gbé kalẹ̀ + Ọ̀rọ̀-aṣínà yí kò leè fẹsẹ̀ múlẹ̀ + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = + Fi ránṣẹ́ + Firánṣẹ́ +-firefox = Firefox +-mozilla = Mozilla +introTitle = + Fáìlì pípín níkọ̀kọ̀ tó dẹrùn + Fáìlì pípín níkọ̀kọ̀ onírọ̀rùn +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = Kilobaiti +# mebibyte abbreviation +mb = Megabaiti +# gibibyte abbreviation +gb = Gigabaiti +downloadTitle = Se igabisile faili +addFilesButton = E yan awon faili lati gbasoke +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = E mu awon faili ki ede ju si bi +emailPlaceholder = E fi imeli si +accountBenefitDownloadCount = E pin faili pelu awon eyan si +okButton = O DA +downloadingTitle = N se igabsile +noStreamsOptionFirefox = E gbiyanju asawakiri to je ayanfe wa +noStreamsOptionDownload = Tesiwaju pelu aṣàwákiri yi +trailheadPromo = Ona wa lati dabobo ipamo re. Darapo mo Firefox +learnMore = Keeko si diff --git a/public/locales/yua/send.ftl b/public/locales/yua/send.ftl new file mode 100644 index 00000000..dcd567f7 --- /dev/null +++ b/public/locales/yua/send.ftl @@ -0,0 +1,19 @@ +title = Send +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m + +## Send version 2 strings + +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } diff --git a/public/locales/zgh/send.ftl b/public/locales/zgh/send.ftl new file mode 100644 index 00000000..249b1ed3 --- /dev/null +++ b/public/locales/zgh/send.ftl @@ -0,0 +1,149 @@ +title = ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ +importingFile = ⴰⵙⴽⵛⵎ... +encryptingFile = ⴰⵙⵙⵏⵜⵍ... +decryptingFile = ⵜⵓⴽⴽⵙⴰ ⵏ ⵓⵙⵙⵏⵜⵍ... +downloadCount = + { $num -> + [one] { $num } ⵜⴰⴳⴰⵎⵜ + *[other] { $num } ⵜⴰⴳⴰⵎⵉⵏ + } +timespanHours = + { $num -> + [one] { $num } ⵜⵙⵔⴰⴳⵜ + *[other] { $num } ⵜⵙⵔⴰⴳⵉⵏ + } +copiedUrl = ⵉⵏⵖⵍ! +unlockInputPlaceholder = ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ +unlockButtonLabel = ⴽⴽⵙ ⴰⵔⴳⴰⵍ +downloadButtonLabel = ⴰⴳⵎ +downloadFinish = ⵉⵎⴷⴰ ⵡⴰⴳⴰⵎ +fileSizeProgress = ({ $partialSize } ⵙⴳ { $totalSize }) +sendYourFilesLink = ⴰⵔⵎ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ +errorPageHeader = ⵜⵙⴰⵔ ⴽⵔⴰ ⵏ ⵜⵣⴳⴰⵍⵜ! +fileTooBig = ⵉⵎⵇⵇⵓⵔ ⴱⴰⵀⵔⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵖⴼ ⵓⵙⵙⴽⵜⵔ. ⵉⵅⵚⵚⴰ ⵜ ⴰⴷ ⵢⵉⵍⵉ ⴷⴷⴰⵡ ⵏ { $size } +linkExpiredAlt = ⵉⵎⵎⵓⵜ ⵓⵙⵖⵏ +notSupportedHeader = ⵓⵔ ⵉⵜⵜⵡⴰⵏⵏⴰⵍ ⵓⵎⵙⵙⴰⵔⴰ ⵏⵏⵓⵏ. +notSupportedLink = ⵎⴰⵖⴼ ⵓⵔ ⵉⵜⵜⵡⴰⵏⵏⴰⵍ ⵓⵎⵙⵙⴰⵔⴰ ⵉⵏⵓ? +notSupportedOutdatedDetail = ⵙ ⵜⵎⴳⵕⵥⴰ, ⵜⴰⵍⵇⵇⵎⵜ ⴰ ⵏ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵓⵔ ⴷⴰ ⵜⴻⵜⵜⵏⴰⵍ ⵜⴰⵜⵉⴽⵏⵓⵍⵓⵊⵉⵜ ⵏ ⵓⵡⵉⴱ ⵏⵏⴰ ⵙ ⵉⵙⵡⵓⵔⵓⵢ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ. ⵔⴰⴷ ⵜⴰⵙⵔⵎ ⴰⴷ ⵜⵙⴷⵖⵉⵎ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵓⵏ. +updateFirefox = ⵙⴷⵖⵉ ⴼⴰⵢⵔⴼⵓⴽⵙ +deletePopupCancel = ⵙⵔ +deleteButtonHover = ⴽⴽⵙ +passwordTryAgain = ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵓⵔ ⵢⵓⵖⵉⴷⵏ. ⴰⵔⵎ ⴷⴰⵖ. +javascriptRequired = ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ +whyJavascript = ⵎⴰⵖⴼ ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ? +enableJavascript = ⵎⴽ ⵜⵓⴼⴰⵎ, ⵙⵏⵓⵛⵛⴳⴰⵜ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ, ⵜⴰⵔⵎⵎ ⴷⴰⵖ. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ⵙⵔⴳ { $minutes }ⵙⴷ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ⵙⴷ +# A short status message shown when the user enters a long password +maxPasswordLength = ⵜⵉⵖⵣⵉ ⵜⴰⵎⵓⵣⵣⵓⵔⵜ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ⵓⵔ ⵜⵣⵎⵉⵔ ⵜⴳⵓⵔⵉ ⴰ ⵏ ⵓⵣⵔⴰⵢ ⴰⴷ ⵜⴻⵜⵜⵓⵙⵖⵍ + +## Send version 2 strings + +-send-brand = ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ +-send-short-brand = ⵙⵉⵏⴷ +-firefox = ⴼⴰⵢⵔⴼⵓⴽⵙ +-mozilla = ⵎⵓⵣⵉⵍⴰ +introTitle = ⴰⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⵙⵍⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ +introDescription = ⴷⴰ ⴽⵯⵏ ⵉⵜⵜⴰⵊⵊⴰ { -send-brand } ⴰⴷ ⵜⴱⴹⵓⵎ ⵉⴼⵓⵢⵍⴰ ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ. ⵙ ⵓⵢⴰ, ⵜⵣⵎⵔⵎ ⴰⴷ ⵜⴰⵊⵊⵎ ⴰⵢⵏⵏⴰ ⵜⴱⵟⵟⵓⵎ ⴷ ⵓⵙⵍⵉⴳ, ⵜⵙⵙⵉⵖⵥⵉⵏⵎ ⵎⴰⵙ ⵓⵔ ⵔⴰⴷ ⴰⴱⴷⴰ ⵉⵇⵇⵉⵎ ⵡⴰⵏⵏⴰⴷ ⵏⵏⵓⵏ ⴳ ⵉⴼⵉⵍⵉ. +notifyUploadEncryptDone = ⵉⵏⵜⵍ ⵓⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ, ⵉⵃⵢⵢⵍ ⵉ ⵡⴰⵣⴰⵏ +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = ⴰⴷ ⵉⵎⵎⵜ ⴷⴼⴼⵉⵔ { $downloadCount } ⵏⵉⵖ ⴷ { $timespan } +timespanMinutes = + { $num -> + [one] { $num } ⵜⵓⵙⴷⵉⴷⵜ + *[other] { $num } ⵜⵓⵙⴷⵉⴷⵉⵏ + } +timespanDays = + { $num -> + [one] { $num } ⵡⴰⵙⵙ + *[other] { $num } ⵡⵓⵙⵙⴰⵏ + } +timespanWeeks = + { $num -> + [one] { $num } ⵉⵎⴰⵍⴰⵙⵙ + *[other] { $num } ⵉⵎⴰⵍⴰⵙⵙⵏ + } +fileCount = + { $num -> + [one] { $num } ⵓⴼⴰⵢⵍⵓ + *[other] { $num } ⵉⴼⵓⵢⵍⴰ + } +# byte abbreviation +bytes = ⵜ +# kibibyte abbreviation +kb = ⴽⵜ +# mebibyte abbreviation +mb = ⵎⵜ +# gibibyte abbreviation +gb = ⵊⵜ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ⵜⵉⴷⴷⵉ ⵉⵎⵎⵓⵜⵜⵔⵏ: { $size } +# the next line after the colon contains a file name +copyLinkDescription = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜⴱⴹⵓⵎ ⴰⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ: +copyLinkButton = ⵙⵙⵏⵖⵍ ⴰⵙⵖⵏ +downloadTitle = ⴰⴳⵎ ⵉⴼⵓⵢⵍⴰ +downloadDescription = ⵉⵜⵜⵓⴱⴹⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵙⴳ { -send-brand } ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ. +trySendDescription = ⴰⵔⵎⴰⵜ { -send-brand } ⵉ ⵓⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⴼⵔⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ⵖⴰⵙ { $count } ⵓⴼⴰⵢⵍⵓ ⴰⵢ ⵉⵣⵎⵔⵏ ⴰⴷ ⵉⴽⵜⵔ ⴳ ⵢⴰⵜ ⵜⵉⴽⴽⵍⵜ. + *[other] ⵖⴰⵙ { $count } ⵉⴼⵓⵢⵍⴰ ⴰⵢ ⵉⵣⵎⵔⵏ ⴰⴷ ⴽⵜⵔⵏ ⴳ ⵢⴰⵜ ⵜⵉⴽⴽⵍⵜ. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] ⵖⴰⵙ { $count } ⵜⵎⵃⴹⵉⵜ ⴰⵢ ⵉⵔⵔⴳⵏ. + *[other] ⵖⴰⵙ { $count } ⵜⵎⵃⴹⴰⵢ ⴰⵢ ⵉⵔⵔⴳⵏ. + } +expiredTitle = ⵉⵎⵎⵓⵜ ⵓⵙⵖⵏ ⴰ. +notSupportedDescription = ⵓⵔ ⵔⴰⴷ ⵉⵙⵡⵓⵔⵉ { -send-brand } ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ. ⴷⴰ ⵉⵙⵡⵓⵔⵓⵢ { -send-short-brand } ⵎⵍⵉⵃ ⵙ ⵜⵍⵇⵇⵎⵜ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ ⵏ { -firefox }, ⴷ ⵔⴰⴷ ⵉⵙⵡⵓⵔⵉ ⵙ ⵜⵍⵇⵇⵎⵜ ⵜⴰⵎⵉⵔⴰⵏⵜ ⵏ ⵓⵎⴰⵜⴰ ⵏ ⵉⵎⵙⵙⴰⵔⴰⵜⵏ. +downloadFirefox = ⴰⴳⵎ { -firefox } +legalTitle = ⵜⵓⵙⵎⵉⵔⵜ ⵏ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵏ { -send-short-brand } +legalDateStamp = ⵜⴰⵍⵇⵇⵎⵜ 1.0, ⵜⵉⵏ 12 ⵎⴰⵕⵚ 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }ⵙ { $hours }ⵙⵔⴳ { $minutes }ⵙⴷ +addFilesButton = ⵙⵜⵢ ⵉⴼⵓⵢⵍⴰ ⵉ ⵓⵙⵙⴽⵜⵔ +uploadButton = ⵙⵙⴽⵜⵔ +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ⵙⵓⵛⵛⴹⴰⵜ, ⵜⵙⵔⵙⵎ ⵉⴼⵓⵢⵍⴰ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ⵏⵉⵖ ⵜⴽⵍⵉⴽⵉⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⵎ ⴰⵔ { $size } +addPassword = ⴰⵔⵢ ⵙ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ +emailPlaceholder = ⵙⵙⴽⵛⵎⴰⵜ ⵉⵎⴰⵢⵍ ⵏⵏⵓⵏ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = ⴽⵛⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⴷ ⴰⵔ { $size } +signInOnlyButton = ⴽⵛⵎ +accountBenefitTitle = ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ ⵏ { -firefox } ⵏⵉⵖ ⵜⵣⵎⵎⴻⵎⴷ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⵔ { $size } +accountBenefitDownloadCount = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⴽⴷ ⵡⵓⴳⴳⴰⵔ ⵏ ⵎⴷⴷⵏ +accountBenefitTimeLimit = + { $count -> + [one] ⴰⵊⵊⴰⵜ ⵉⵙⵖⴰⵏ ⴰⴷ ⵜⵜⵏⵓⵛⵛⵓⴳⵏ ⴰⵔ { $count } ⵡⴰⵙⵙ + *[other] ⴰⵊⵊⴰⵜ ⵉⵙⵖⴰⵏ ⴰⴷ ⵜⵜⵏⵓⵛⵛⵓⴳⵏ ⴰⵔ { $count } ⵡⵓⵙⵙⴰⵏ + } +accountBenefitSync = ⵙⵡⵓⴷⴷⵡⴰⵜ ⵉⴼⵓⵢⵍⴰ ⵜⵜⵓⴱⴹⴰⵏⵉⵏ ⵙⴳ ⴽⵓ ⴰⵍⵍⴰⵍ +accountBenefitMoz = ⵍⵎⴷ ⵖⴼ ⵜⵏⵓⴼⴰ ⵢⴰⴹⵏⵉⵏ ⵏ { -mozilla } +signOut = ⴼⴼⵖ +okButton = ⵡⴰⵅⵅⴰ +downloadingTitle = ⴰⴳⴰⵎ +noStreamsWarning = ⵉⵣⵎⵔ ⵓⵎⵙⵙⴰⵔⴰ ⴰ ⴰⴷ ⵓⵔ ⵉⵖⴰⵢ ⴰⴷ ⵉⴽⴽⵙ ⴰⵙⵙⵏⵜⵍ ⵉ ⵢⴰⵏ ⵓⴼⴰⵢⵍⵓ ⵉⵎⵇⵇⵓⵔⵏ ⵙ ⵡⴰⵏⵛⵜ ⴰ. +noStreamsOptionCopy = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜ ⵜⵕⵥⵎⵎ ⴳ ⴽⵔⴰ ⵏ ⵓⵎⵙⵙⴰⵔⴰ ⵢⴰⴹⵏ +noStreamsOptionFirefox = ⴰⵔⵎⴰⵜ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵖ ⴰⵎⵓⴼⴰⵢ +noStreamsOptionDownload = ⵙⵎⴷ ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ +downloadFirefoxPromo = ⵉⵜⵜⵓⵙⵓⵎⵔ ⴰⵡⵏ { -send-short-brand } ⵙⴳ ⵖⵓⵔ { -firefox } ⴰⵎⴰⵢⵏⵓ ⴰⴽⴽⵯ. +# the next line after the colon contains a file name +shareLinkDescription = ⴱⴹⵓⵢⴰⵜ ⴰⵙⵖⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ: +shareLinkButton = ⴱⴹⵓ ⴰⵙⵖⵏ +# $name is the name of the file +shareMessage = ⴰⴳⵎⴰⵜ "{ $name }" ⵙ { -send-brand }: ⴰⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⵙⵍⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ +trailheadPromo = ⵜⵍⵍⴰ ⵢⴰⵜ ⵜⵖⴰⵔⴰⵙⵜ ⴰⴼⴰⴷ ⴰⴷ ⵜⴼⵔⴳⵎ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵏⵏⵓⵏ. ⵍⴽⵎⴰⵜ ⴼⴰⵢⵔⴼⵓⴽⵙ. +learnMore = ⵙⵙⵏ ⵓⴳⴳⴰⵔ. diff --git a/public/locales/zh-CN/send.ftl b/public/locales/zh-CN/send.ftl index 3dc114b7..631190cc 100644 --- a/public/locales/zh-CN/send.ftl +++ b/public/locales/zh-CN/send.ftl @@ -1,91 +1,150 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Web 实验 -siteFeedback = 反馈 -uploadPageHeader = 私密、安全的文件分享服务 -uploadPageExplainer = 通过安全、私密且受加密的链接发送文件,链接到期后文件将从网上彻底抹除。 -uploadPageLearnMore = 详细了解 -uploadPageDropMessage = 把文件拖到到此处开始上传 -uploadPageSizeMessage = 为保证运行稳定,建议文件大小不超过 1GB -uploadPageBrowseButton = 选择一个您电脑上的文件 -uploadPageBrowseButton1 = 选择一个要上传的文件 -uploadPageMultipleFilesAlert = 目前不支持上传多个文件或上传文件夹。 -uploadPageBrowseButtonTitle = 上传文件 -uploadingPageProgress = 正在上传 { $filename } ({ $size }) +title = Send importingFile = 正在导入… -verifyingFile = 正在验证… encryptingFile = 正在加密… decryptingFile = 正在解密… -notifyUploadDone = 您的上传已完成。 -uploadingPageMessage = 在文件上传后,您可以设定过期选项。 -uploadingPageCancel = 取消上传 -uploadCancelNotification = 您的上传已取消。 -uploadingPageLargeFileMessage = 此文件较大,可能要花费一些时间。请稍候。 -uploadingFileNotification = 上传完成后通知我。 -uploadSuccessConfirmHeader = 准备好发送 -uploadSvgAlt = 上传 -uploadSuccessTimingHeader = 您的文件的链接将在首次下载或 24 小时后过期。 -copyUrlFormLabelWithName = 复制并分享链接以发送您的文件:{ $filename } -copyUrlFormButton = 复制到剪贴板 +downloadCount = { $num -> + [one] 1 次下载 + *[other] { $num } 次下载 + } +timespanHours = { $num -> + [one] 1 小时 + *[other] { $num } 小时 + } copiedUrl = 已复制! -deleteFileButton = 删除文件 -sendAnotherFileLink = 发送其他文件 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = 下载 -downloadFileName = 下载 { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = 请输入密码 unlockInputPlaceholder = 密码 unlockButtonLabel = 解锁 -downloadFileTitle = 下载加密的文件 -// Firefox Send is a brand name and should not be localized. -downloadMessage = 您的朋友使用 Firefox Send 向您发送一个文件。该服务允许用户以安全、私密、受加密的链接分享一个文件,链接到期后文件将从网上彻底抹除。 -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = 下载 -downloadNotification = 您的下载已完成。 downloadFinish = 下载完成 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = 尝试 Firefox Send -downloadingPageProgress = 正在下载 { $filename } ({ $size }) -downloadingPageMessage = 在我们获取您的文件并解密的期间,请不要关闭此网页。 -errorAltText = 上传出错 +sendYourFilesLink = 试试 Send errorPageHeader = 我们遇到错误。 -errorPageMessage = 上传文件时发生错误。 -errorPageLink = 发送其他文件 fileTooBig = 此文件太大。文件大小上限为 { $size }。 linkExpiredAlt = 链接已过期 -expiredPageHeader = 此链接已过期或者从未生效。 notSupportedHeader = 不支持您的浏览器。 -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 很可惜,您的浏览器不支持 Firefox Send 所使用的 Web 技术。请改用其他浏览器。我们推荐使用 Firefox! notSupportedLink = 为什么不支持我的浏览器? -notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支持 Firefox Send 所使用的 Web 技术。您需要更新浏览器才能使用它。 +notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支持 Send 所使用的 Web 技术。您需要更新浏览器才能使用它。 updateFirefox = 更新 Firefox -downloadFirefoxButtonSub = 免费下载 -uploadedFile = 文件 -copyFileList = 复制网址 -// expiryFileList is used as a column header -expiryFileList = 过期时间 -deleteFileList = 删除 -nevermindButton = 没关系 -legalHeader = 条款和隐私 -legalNoticeTestPilot = Firefox Send 目前是一个 Test Pilot 实验,并遵守 Test Pilot 服务条款隐私声明。您可以在这里了解此实验及数据收集的有关信息。 -legalNoticeMozilla = 使用 Firefox Send 网站亦受到 Mozilla 网站隐私声明网站使用条款的约束。 -deletePopupText = 删除此文件? -deletePopupYes = 是 deletePopupCancel = 取消 deleteButtonHover = 删除 -copyUrlHover = 复制网址 -footerLinkLegal = 法律 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = 关于 Test Pilot -footerLinkPrivacy = 隐私 -footerLinkTerms = 条款 -footerLinkCookies = Cookie -requirePasswordCheckbox = 持有密码才能下载此文件 -addPasswordButton = 添加密码 +footerText = 不附属于 Mozilla 或 Firefox。 +footerLinkDonate = 捐助 +footerLinkCli = 命令行 +footerLinkDmca = DMCA +footerLinkSource = 源代码 passwordTryAgain = 密码不正确。请重试。 -// This label is followed by the password needed to download a file -passwordResult = 密码:{ $password } +javascriptRequired = Send 需要 JavaScript +whyJavascript = 为什么 Send 需要 JavaScript? +enableJavascript = 请启用 JavaScript 并重试。 +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } 小时 { $minutes } 分钟 +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } 分钟 +# A short status message shown when the user enters a long password +maxPasswordLength = 最大密码长度:{ $length } +# A short status message shown when there was an error setting the password +passwordSetError = 未能设置此密码 + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = 简单、私密的文件分享服务 +introDescription = 使用 { -send-brand } 端到端加密分享文件,链接到期即焚。分享更私密,文件到期真正无痕迹。 +notifyUploadEncryptDone = 您的文件已加密,现在可以发送 +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount }或 { $timespan }后过期 +timespanMinutes = + { $num -> + [one] 1 分钟 + *[other] { $num } 分钟 + } +timespanDays = + { $num -> + [one] 1 天 + *[other] { $num } 天 + } +timespanWeeks = + { $num -> + [one] 1 周 + *[other] { $num } 周 + } +fileCount = + { $num -> + [one] 1 个文件 + *[other] { $num } 个文件 + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 总大小:{ $size } +# the next line after the colon contains a file name +copyLinkDescription = 复制链接以分享文件: +copyLinkButton = 复制链接 +downloadTitle = 下载文件 +downloadDescription = 此文件通过端到端加密的 { -send-brand } 与您分享,链接到期即焚。 +trySendDescription = 试试 { -send-brand },简单、私密的文件分享服务。 +# count will always be > 10 +tooManyFiles = + { $count -> + [one] 一次只可上传 1 个文件。 + *[other] 一次只可上传 { $count } 个文件。 + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] 只可上传 { $count } 个压缩文件。 + } +expiredTitle = 此链接已过期。 +notSupportedDescription = { -send-brand } 无法在此浏览器上正常工作。{ -send-short-brand } 与最新版本 { -firefox } 配合使用体验最佳,也适用于目前的大多数浏览器。 +downloadFirefox = 下载 { -firefox } +legalTitle = { -send-short-brand } 隐私声明 +legalDateStamp = 版本 1.0,于 2019年3月12日 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } 天 { $hours } 小时 { $minutes } 分钟 +addFilesButton = 选择要上传的文件 +uploadButton = 上传 +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = 拖放文件 +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = 或点此传送最大 { $size } 的文件 +addPassword = 密码保护 +emailPlaceholder = 请输入您的电子邮件地址 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = 登录以传送最大 { $size } 文件 +signInOnlyButton = 登录 +accountBenefitTitle = 创建一个 { -firefox } 账户或登录 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = 分享最大 { $size } 文件 +accountBenefitDownloadCount = 可以与更多人分享 +accountBenefitTimeLimit = + { $count -> + [one] 链接有效期延至 1 天 + *[other] 链接有效期延至 { $count } 天 + } +accountBenefitSync = 任何设备上都能管理分享的文件 +accountBenefitMoz = 了解其他 { -mozilla } 服务 +signOut = 退出 +okButton = 确定 +downloadingTitle = 正在下载 +noStreamsWarning = 此浏览器可能无法解密这么大的文件。 +noStreamsOptionCopy = 复制链接以在其他浏览器中打开 +noStreamsOptionFirefox = 试试大家最爱的浏览器 +noStreamsOptionDownload = 使用此浏览器继续 +downloadFirefoxPromo = { -send-short-brand } 由焕然一新的 { -firefox } 为您奉上。 +# the next line after the colon contains a file name +shareLinkDescription = 您的文件链接: +shareLinkButton = 分享链接 +# $name is the name of the file +shareMessage = 使用 { -send-brand } 下载“{ $name }”:简单、安全的文件分享服务 +learnMore = 详细了解。 diff --git a/public/locales/zh-TW/send.ftl b/public/locales/zh-TW/send.ftl index 2cae368d..8ae96732 100644 --- a/public/locales/zh-TW/send.ftl +++ b/public/locales/zh-TW/send.ftl @@ -1,91 +1,145 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = 網頁實驗 -siteFeedback = 意見回饋 -uploadPageHeader = 私密、有加密的檔案分享服務 -uploadPageExplainer = 透過安全、隱私、加密過的管道來傳送檔案,而且鏈結會自動過期,可確保您的東西不會在網路上無限停留。 -uploadPageLearnMore = 了解更多 -uploadPageDropMessage = 將檔案放到此處開始上傳 -uploadPageSizeMessage = 為了讓系統能最穩定地執行,請盡量將檔案控制在 1GB 以下。 -uploadPageBrowseButton = 選擇您電腦上的檔案 -uploadPageBrowseButton1 = 選擇要上傳的檔案 -uploadPageMultipleFilesAlert = 目前暫不支援上傳多個檔案或資料夾。 -uploadPageBrowseButtonTitle = 上傳檔案 -uploadingPageProgress = 正在上傳 { $filename }({ $size }) +title = Send importingFile = 匯入中… -verifyingFile = 驗證中… encryptingFile = 加密中… decryptingFile = 解密中… -notifyUploadDone = 已完成上傳。 -uploadingPageMessage = 檔案上傳後,即可設定過期時間。 -uploadingPageCancel = 取消上傳 -uploadCancelNotification = 已取消上傳。 -uploadingPageLargeFileMessage = 這個檔案有點大,可能需要花點時間上傳,再等會兒! -uploadingFileNotification = 上傳完成時通知我。 -uploadSuccessConfirmHeader = 準備好傳送 -uploadSvgAlt = 上傳 -uploadSuccessTimingHeader = 您的檔案鏈結將會在首次下載,或 24 小時後失效。 -copyUrlFormLabelWithName = 複製並分享鏈結來傳送您的檔案: { $filename } -copyUrlFormButton = 複製到剪貼簿 +downloadCount = { $num -> + [one] 1 次下載 + *[other] { $num } 次下載 + } +timespanHours = { $num -> + [one] 1 小時 + *[other] { $num } 小時 + } copiedUrl = 已複製! -deleteFileButton = 刪除檔案 -sendAnotherFileLink = 傳送另一個檔案 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = 下載 -downloadFileName = 下載 { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = 輸入密碼 unlockInputPlaceholder = 密碼 unlockButtonLabel = 解鎖 -downloadFileTitle = 下載加密過的檔案 -// Firefox Send is a brand name and should not be localized. -downloadMessage = 您的朋友正透過 Firefox Send 傳送檔案給您。這是一個可讓您透過安全、隱密、並且會將鏈結加密過,自動失效以確保檔案不會在網路上無限停留的檔案分享服務。 -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = 下載 -downloadNotification = 下載完成。 downloadFinish = 下載完成 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize },共 { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = 試用 Firefox Send -downloadingPageProgress = 正在下載 { $filename }({ $size }) -downloadingPageMessage = 請保留此分頁開啟,我們將取回這個檔案並進行解密。 -errorAltText = 上傳錯誤 +sendYourFilesLink = 試用 Send errorPageHeader = 有些東西不對勁! -errorPageMessage = 上傳檔案時發生錯誤。 -errorPageLink = 傳送另一個檔案 fileTooBig = 檔案太大無法上傳。檔案大小限制為 { $size }。 linkExpiredAlt = 鏈結已過期 -expiredPageHeader = 鏈結已失效,或根本不存在! notSupportedHeader = 不支援您的瀏覽器。 -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 很可惜,您使用的瀏覽器並不支援 Firefox Send 所需的 Web 技術。請改用其他瀏覽器,我們推薦使用 Firefox! notSupportedLink = 為什麼我的瀏覽器不支援? -notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支援 Firefox Send 所需的 Web 技術。請更新瀏覽器後再使用。 +notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支援 Send 所需的 Web 技術。請更新瀏覽器後再使用。 updateFirefox = 更新 Firefox -downloadFirefoxButtonSub = 免費下載 -uploadedFile = 檔案 -copyFileList = 複製網址 -// expiryFileList is used as a column header -expiryFileList = 失效於 -deleteFileList = 刪除 -nevermindButton = 沒關係 -legalHeader = 使用條款及隱私權 -legalNoticeTestPilot = Firefox Send 目前是一個 Test Pilot 實驗,依照 Test Pilot 的服務條款隱私權公告提供服務。您可以在此處了解實驗內容,以及所收集資料的詳細資訊。 -legalNoticeMozilla = 使用 Firefox Send 網站時,亦受到 Mozilla 的網站隱私權公告以及網站使用條款約束。 -deletePopupText = 真的要刪除這個檔案嗎? -deletePopupYes = 好的,刪除 -deletePopupCancel = 不要刪除 +deletePopupCancel = 取消 deleteButtonHover = 刪除 -copyUrlHover = 複製網址 -footerLinkLegal = 法律資訊 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = 關於 Test Pilot -footerLinkPrivacy = 隱私權 -footerLinkTerms = 使用條款 -footerLinkCookies = Cookie -requirePasswordCheckbox = 需要密碼才能下載此檔案 -addPasswordButton = 新增密碼 +footerText = 不隸屬於 Mozilla 或 Firefox。 +footerLinkDonate = 捐助 +footerLinkCli = 命令列 +footerLinkDmca = DMCA +footerLinkSource = 原始碼 passwordTryAgain = 密碼不正確,請再試一次。 -// This label is followed by the password needed to download a file -passwordResult = 密碼: { $password } +javascriptRequired = Send 需要開啟 JavaScript 功能 +whyJavascript = 為什麼 Send 需要 JavaScript 才能使用? +enableJavascript = 請開啟 JavaScript 功能後再試一次。 +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } 時 { $minutes } 分 +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } 分鐘 +# A short status message shown when the user enters a long password +maxPasswordLength = 最大密碼長度: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = 無法設定此密碼 + +## Send version 2 strings + +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla + +introTitle = 簡單而私密的檔案共享服務 +introDescription = { -send-brand } 讓您可透過點對點加密的方式來分享檔案,並提供會自動失效的鏈結。這樣一來就可以保留分享時的隱私,也確保檔案不會永久保存於網路上。 +notifyUploadEncryptDone = 已加密您的檔案,可以傳送 +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } 或 { $timespan } 後失效 +timespanMinutes = { $num -> + [one] 1 分鐘 + *[other] { $num } 分鐘 + } +timespanDays = { $num -> + [one] 1 天 + *[other] { $num } 天 + } +timespanWeeks = { $num -> + [one] 1 週 + *[other] { $num } 週 + } +fileCount = { $num -> + [one] 1 個檔案 + *[other] { $num } 個檔案 +} +# byte abbreviation +bytes = 位元組 +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 總大小: { $size } +# the next line after the colon contains a file name +copyLinkDescription = 複製鏈結即可分享您的檔案: +copyLinkButton = 複製鏈結 +downloadTitle = 下載檔案 +downloadDescription = 此檔案是透過 { -send-brand } 進行分享,以點對點加密的方式來分享檔案,並提供會自動失效的鏈結。 +trySendDescription = 快試試 { -send-brand },簡單安全的檔案分享機制。 +# count will always be > 10 +tooManyFiles = { $count -> + [one] 一次僅能上傳 1 個檔案。 + *[other] 一次僅能上傳 { $count } 個檔案。 +} +# count will always be > 10 +tooManyArchives = { $count -> + [one] 僅允許 1 個壓縮檔。 + *[other] 僅允許 { $count } 個壓縮檔。 +} +expiredTitle = 此鏈結已經失效。 +notSupportedDescription = 無法於此瀏覽器使用 { -send-brand }。在最新版的 { -firefox } 中使用 { -send-short-brand } 會有最佳效果,也可在大部分瀏覽器的最新版本當中使用。 +downloadFirefox = 下載 { -firefox } +legalTitle = { -send-short-brand } 隱私權公告 +legalDateStamp = 1.0 版,2019 年 3 月 12 日生效 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } 天 { $hours } 小時 { $minutes } 分鐘 +addFilesButton = 選擇要上傳的檔案 +uploadButton = 上傳 +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = 拖放檔案到此處 +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = 或點擊即可傳送最大 { $size } 的檔案 +addPassword = 使用密碼保護 +emailPlaceholder = 輸入您的電子郵件地址 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = 登入後即可傳送最大 { $size } 的檔案 +signInOnlyButton = 登入 +accountBenefitTitle = 註冊 { -firefox } 帳號或登入 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = 分享最大 { $size } 的檔案 +accountBenefitDownloadCount = 分享檔案給更多人 +accountBenefitTimeLimit = + { $count -> + *[other] 將檔案鏈結保留 { $count } 天有效 + } +accountBenefitSync = 從任何裝置管理分享的檔案 +accountBenefitMoz = 了解其他 { -mozilla } 服務的更多資訊 +signOut = 登出 +okButton = 確定 +downloadingTitle = 下載中 +noStreamsWarning = 此瀏覽器無法解密這麼大的檔案。 +noStreamsOptionCopy = 複製鏈結,用其他瀏覽器開啟 +noStreamsOptionFirefox = 試試我們最愛的瀏覽器 +noStreamsOptionDownload = 繼續使用目前的瀏覽器 +downloadFirefoxPromo = { -send-short-brand } 是由全新的 { -firefox } 提供。 +# the next line after the colon contains a file name +shareLinkDescription = 您的檔案鏈結: +shareLinkButton = 分享鏈結 +# $name is the name of the file +shareMessage = 使用 { -send-brand } 下載「{ $name }」: 簡單安全的檔案分享機制 +learnMore = 了解更多。 diff --git a/public/mstile-144x144.png b/public/mstile-144x144.png new file mode 100644 index 00000000..949cf8f7 Binary files /dev/null and b/public/mstile-144x144.png differ diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png new file mode 100644 index 00000000..3b89dc2b Binary files /dev/null and b/public/mstile-150x150.png differ diff --git a/public/mstile-310x150.png b/public/mstile-310x150.png new file mode 100644 index 00000000..f637d097 Binary files /dev/null and b/public/mstile-310x150.png differ diff --git a/public/mstile-310x310.png b/public/mstile-310x310.png new file mode 100644 index 00000000..2e913dc5 Binary files /dev/null and b/public/mstile-310x310.png differ diff --git a/public/mstile-70x70.png b/public/mstile-70x70.png new file mode 100644 index 00000000..103aa34b Binary files /dev/null and b/public/mstile-70x70.png differ diff --git a/public/robots.txt b/public/robots.txt index 72abb7a8..1f53798b 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,2 +1,2 @@ User-agent: * -Disallow: /download/ +Disallow: / diff --git a/s3-lifecycle-example.xml b/s3-lifecycle-example.xml new file mode 100644 index 00000000..d65ed241 --- /dev/null +++ b/s3-lifecycle-example.xml @@ -0,0 +1,39 @@ + + + + + 1skjet8gxudyans73v3p3d6hvq6yn3w02kq7931h81ohopd3 + 1- + Enabled + + 1 + + + + + 1skjet8gxudyans73v3p3d6hvq6yn3w02kq7931h81ohopd4 + 7- + Enabled + + 7 + + + + + 1skjet8gxudyans73v3p3d6hvq6yn3w02kq7931h81ohopd5 + + Enabled + + 30 + + + + + 1skjet8gxudyans73v3p3d6hvq6yn3w02kq7931h81ohopd6 + + Enabled + + 1 + + + diff --git a/scripts/bin/run-integration-test-circleci.sh b/scripts/bin/run-integration-test-circleci.sh new file mode 100755 index 00000000..183e478c --- /dev/null +++ b/scripts/bin/run-integration-test-circleci.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -ex + +GECKODRIVER_URL=$( + curl -s 'https://api.github.com/repos/mozilla/geckodriver/releases/latest' | + python -c "import sys, json; r = json.load(sys.stdin); print([a for a in r['assets'] if 'linux64' in a['name']][0]['browser_download_url']);" +); + + +curl -L -o geckodriver.tar.gz $GECKODRIVER_URL +gunzip -c geckodriver.tar.gz | tar xopf - +chmod +x geckodriver +sudo mv geckodriver /bin +geckodriver --version +# Install pip +sudo apt-get install python-pip +sudo pip install --upgrade pip + +sudo pip install mozdownload mozinstall==1.15 + +mkdir -p ~/project/firefox-downloads/ +find ~/project/firefox-downloads/ -type f -mtime +90 -delete +mozdownload --version latest --type daily --destination ~/project/firefox-downloads/firefox_nightly/ + +export PATH=~/project/firefox:$PATH +mozinstall $(ls -t firefox-downloads/firefox_nightly/*.tar.bz2 | head -1) +firefox --version + npm run circleci-test-integration \ No newline at end of file diff --git a/scripts/get-prod-locales.js b/scripts/get-prod-locales.js index 27c86e26..c6aae630 100755 --- a/scripts/get-prod-locales.js +++ b/scripts/get-prod-locales.js @@ -19,8 +19,8 @@ exec(cmd) const locales = Object.keys(summary) .filter(locale => { const loc = summary[locale]; - const hasMissing = loc.hasOwnProperty('missing'); - const hasErrors = loc.hasOwnProperty('errors'); + const hasMissing = Object.prototype.hasOwnProperty.call(loc, 'missing'); + const hasErrors = Object.prototype.hasOwnProperty.call(loc, 'errors'); return !hasMissing && !hasErrors; }) .sort(); diff --git a/scripts/lint-locales.js b/scripts/lint-locales.js index fbcf84ef..db1a29de 100644 --- a/scripts/lint-locales.js +++ b/scripts/lint-locales.js @@ -33,7 +33,7 @@ function filterErrors(details) { .sort() .map(locale => { const data = details[locale] - .filter(item => item.hasOwnProperty('error')) + .filter(item => Object.prototype.hasOwnProperty.call(item, 'error')) .map(({ error }) => error); return { locale, data }; }) diff --git a/scripts/sync-npm-dependencies.sh b/scripts/sync-npm-dependencies.sh new file mode 100755 index 00000000..6e5e100f --- /dev/null +++ b/scripts/sync-npm-dependencies.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +echo "checking package-lock.json for changes" +IFS=' ' +read -ra G_PARAMS <<< "$HUSKY_GIT_PARAMS" +PREV=${G_PARAMS[0]} +NEXT=${G_PARAMS[1]} +if [ "$PREV" != "$NEXT" ]; then + DIFF=$(git diff $PREV $NEXT package-lock.json) + if [ "$DIFF" != "" ]; then + npm install + fi +fi \ No newline at end of file diff --git a/server/bin/dev.js b/server/bin/dev.js new file mode 100644 index 00000000..692b5201 --- /dev/null +++ b/server/bin/dev.js @@ -0,0 +1,46 @@ +const assets = require('../../common/assets'); +const routes = require('../routes'); +const pages = require('../routes/pages'); +const tests = require('../../test/frontend/routes'); +const express = require('express'); +const expressWs = require('@dannycoates/express-ws'); +const morgan = require('morgan'); +const config = require('../config'); + +const ID_REGEX = '([0-9a-fA-F]{10, 16})'; + +module.exports = function(app, devServer) { + const wsapp = express(); + expressWs(wsapp, null, { perMessageDeflate: false }); + routes(wsapp); + wsapp.ws('/api/ws', require('../routes/ws')); + wsapp.listen(8081, config.listen_address); + + assets.setMiddleware(devServer.middleware); + app.use(morgan('dev', { stream: process.stderr })); + function android(req, res) { + const index = devServer.middleware.fileSystem + .readFileSync(devServer.middleware.getFilenameFromUrl('/android.html')) + .toString() + .replace( + '', + '' + ); + res.set('Content-Type', 'text/html'); + res.send(index); + } + if (process.env.ANDROID) { + // map all html routes to the android index.html + app.get('/', android); + app.get(`/share/:id${ID_REGEX}`, android); + app.get('/completed', android); + app.get('/preferences', android); + app.get('/options', android); + app.get('/oauth', android); + } + routes(app); + tests(app); + // webpack-dev-server routes haven't been added yet + // so wait for next tick to add 404 handler + process.nextTick(() => app.use(pages.notfound)); +}; diff --git a/server/bin/prod.js b/server/bin/prod.js new file mode 100644 index 00000000..f1baa37b --- /dev/null +++ b/server/bin/prod.js @@ -0,0 +1,32 @@ +const express = require('express'); +const path = require('path'); +const Sentry = require('@sentry/node'); +const config = require('../config'); +const routes = require('../routes'); +const pages = require('../routes/pages'); +const expressWs = require('@dannycoates/express-ws'); + +if (config.sentry_dsn) { + Sentry.init({ dsn: config.sentry_dsn }); +} + +const app = express(); + +expressWs(app, null, { perMessageDeflate: false }); +routes(app); +app.ws('/api/ws', require('../routes/ws')); + +app.use( + express.static(path.resolve(__dirname, '../../dist/'), { + setHeaders: function(res, path) { + if (!/serviceWorker\.js$/.test(path)) { + res.set('Cache-Control', 'public, max-age=31536000, immutable'); + } + res.removeHeader('Pragma'); + } + }) +); + +app.use(pages.notfound); + +app.listen(config.listen_port, config.listen_address); diff --git a/server/bin/test.js b/server/bin/test.js new file mode 100644 index 00000000..5cbed848 --- /dev/null +++ b/server/bin/test.js @@ -0,0 +1,16 @@ +const assets = require('../../common/assets'); +const routes = require('../routes'); +const pages = require('../routes/pages'); +const tests = require('../../test/frontend/routes'); +const expressWs = require('@dannycoates/express-ws'); + +module.exports = function(app, devServer) { + assets.setMiddleware(devServer.middleware); + expressWs(app, null, { perMessageDeflate: false }); + routes(app); + app.ws('/api/ws', require('../routes/ws')); + tests(app); + // webpack-dev-server routes haven't been added yet + // so wait for next tick to add 404 handler + process.nextTick(() => app.use(pages.notfound)); +}; diff --git a/server/clientConstants.js b/server/clientConstants.js new file mode 100644 index 00000000..b340f585 --- /dev/null +++ b/server/clientConstants.js @@ -0,0 +1,35 @@ +const config = require('./config'); + +module.exports = { + LIMITS: { + MAX_FILE_SIZE: config.max_file_size, + MAX_DOWNLOADS: config.max_downloads, + MAX_EXPIRE_SECONDS: config.max_expire_seconds, + MAX_FILES_PER_ARCHIVE: config.max_files_per_archive, + MAX_ARCHIVES_PER_USER: config.max_archives_per_user + }, + WEB_UI: { + FOOTER_DONATE_URL: config.footer_donate_url, + FOOTER_CLI_URL: config.footer_cli_url, + FOOTER_DMCA_URL: config.footer_dmca_url, + FOOTER_SOURCE_URL: config.footer_source_url, + CUSTOM_FOOTER_TEXT: config.custom_footer_text, + CUSTOM_FOOTER_URL: config.custom_footer_url, + MAIN_NOTICE_HTML: config.main_notice_html, + UPLOAD_AREA_NOTICE_HTML: config.upload_area_notice_html, + UPLOADS_LIST_NOTICE_HTML: config.uploads_list_notice_html, + DOWNLOAD_NOTICE_HTML: config.download_notice_html, + SHOW_THUNDERBIRD_SPONSOR: config.show_thunderbird_sponsor, + COLORS: { + PRIMARY: config.ui_color_primary, + ACCENT: config.ui_color_accent + }, + CUSTOM_ASSETS: config.ui_custom_assets + }, + DEFAULTS: { + DOWNLOADS: config.default_downloads, + DOWNLOAD_COUNTS: config.download_counts, + EXPIRE_TIMES_SECONDS: config.expire_times_seconds, + EXPIRE_SECONDS: config.default_expire_seconds + } +}; diff --git a/server/config.js b/server/config.js index e3e97b2a..07b94d61 100644 --- a/server/config.js +++ b/server/config.js @@ -1,30 +1,143 @@ const convict = require('convict'); +const convict_format_with_validator = require('convict-format-with-validator'); const { tmpdir } = require('os'); const path = require('path'); const { randomBytes } = require('crypto'); +convict.addFormats(convict_format_with_validator); + +convict.addFormat({ + name: 'positive-int-array', + coerce: ints => { + // can take: int[] | string[] | string (csv), returns -> int[] + const ints_arr = Array.isArray(ints) ? ints : ints.trim().split(','); + return ints_arr.map(int => + typeof int === 'number' + ? int + : parseInt(int.replace(/['"]+/g, '').trim(), 10) + ); + }, + validate: ints => { + // takes: int[], errors if any NaNs, negatives, or floats present + for (const int of ints) { + if (typeof int !== 'number' || isNaN(int) || int < 0 || int % 1 > 0) + throw new Error('must be a comma-separated list of positive integers'); + } + } +}); + const conf = convict({ s3_bucket: { format: String, default: '', env: 'S3_BUCKET' }, + s3_endpoint: { + format: String, + default: '', + env: 'S3_ENDPOINT' + }, + s3_use_path_style_endpoint: { + format: Boolean, + default: false, + env: 'S3_USE_PATH_STYLE_ENDPOINT' + }, + gcs_bucket: { + format: String, + default: '', + env: 'GCS_BUCKET' + }, + expire_times_seconds: { + format: 'positive-int-array', + default: [300, 3600, 86400, 604800], + env: 'EXPIRE_TIMES_SECONDS' + }, + default_expire_seconds: { + format: Number, + default: 86400, + env: 'DEFAULT_EXPIRE_SECONDS' + }, + max_expire_seconds: { + format: Number, + default: 86400 * 7, + env: 'MAX_EXPIRE_SECONDS' + }, + download_counts: { + format: 'positive-int-array', + default: [1, 2, 3, 4, 5, 20, 50, 100], + env: 'DOWNLOAD_COUNTS' + }, + default_downloads: { + format: Number, + default: 1, + env: 'DEFAULT_DOWNLOADS' + }, + max_downloads: { + format: Number, + default: 100, + env: 'MAX_DOWNLOADS' + }, + max_files_per_archive: { + format: Number, + default: 64, + env: 'MAX_FILES_PER_ARCHIVE' + }, + max_archives_per_user: { + format: Number, + default: 16, + env: 'MAX_ARCHIVES_PER_USER' + }, redis_host: { format: String, default: 'localhost', env: 'REDIS_HOST' }, + redis_port: { + format: Number, + default: 6379, + env: 'REDIS_PORT' + }, + redis_user: { + format: String, + default: '', + env: 'REDIS_USER' + }, + redis_password: { + format: String, + default: '', + env: 'REDIS_PASSWORD' + }, + redis_db: { + format: String, + default: '', + env: 'REDIS_DB' + }, + redis_event_expire: { + format: Boolean, + default: false, + env: 'REDIS_EVENT_EXPIRE' + }, + redis_retry_time: { + format: Number, + default: 10000, + env: 'REDIS_RETRY_TIME' + }, + redis_retry_delay: { + format: Number, + default: 500, + env: 'REDIS_RETRY_DELAY' + }, + listen_address: { + format: 'ipaddress', + default: '0.0.0.0', + env: 'IP_ADDRESS' + }, listen_port: { format: 'port', default: 1443, arg: 'port', env: 'PORT' }, - analytics_id: { - format: String, - default: '', - env: 'GOOGLE_ANALYTICS_ID' - }, sentry_id: { format: String, default: '', @@ -42,14 +155,9 @@ const conf = convict({ }, max_file_size: { format: Number, - default: 1024 * 1024 * 1024 * 2, + default: 1024 * 1024 * 1024 * 2.5, env: 'MAX_FILE_SIZE' }, - expire_seconds: { - format: Number, - default: 86400, - env: 'EXPIRE_SECONDS' - }, l10n_dev: { format: Boolean, default: false, @@ -57,13 +165,201 @@ const conf = convict({ }, base_url: { format: 'url', - default: 'https://send.firefox.com', + default: 'https://send.example.com', env: 'BASE_URL' }, + custom_title: { + format: String, + default: 'Send', + env: 'CUSTOM_TITLE' + }, + custom_description: { + format: String, + default: + 'Encrypt and send files with a link that automatically expires to ensure your important documents don’t stay online forever.', + env: 'CUSTOM_DESCRIPTION' + }, + detect_base_url: { + format: Boolean, + default: false, + env: 'DETECT_BASE_URL' + }, file_dir: { format: 'String', default: `${tmpdir()}${path.sep}send-${randomBytes(4).toString('hex')}`, env: 'FILE_DIR' + }, + fxa_url: { + format: 'url', + default: 'https://send-fxa.dev.lcip.org', + env: 'FXA_URL' + }, + fxa_client_id: { + format: String, + default: '', // disabled + env: 'FXA_CLIENT_ID' + }, + fxa_key_scope: { + format: String, + default: 'https://identity.mozilla.com/apps/send', + env: 'FXA_KEY_SCOPE' + }, + fxa_csp_oauth_url: { + format: String, + default: '', + env: 'FXA_CSP_OAUTH_URL' + }, + fxa_csp_content_url: { + format: String, + default: '', + env: 'FXA_CSP_CONTENT_URL' + }, + fxa_csp_profile_url: { + format: String, + default: '', + env: 'FXA_CSP_PROFILE_URL' + }, + fxa_csp_profileimage_url: { + format: String, + default: '', + env: 'FXA_CSP_PROFILEIMAGE_URL' + }, + survey_url: { + format: String, + default: '', + env: 'SURVEY_URL' + }, + ip_db: { + format: String, + default: '', + env: 'IP_DB' + }, + footer_donate_url: { + format: String, + default: '', + env: 'SEND_FOOTER_DONATE_URL' + }, + footer_cli_url: { + format: String, + default: 'https://github.com/timvisee/ffsend', + env: 'SEND_FOOTER_CLI_URL' + }, + footer_dmca_url: { + format: String, + default: '', + env: 'SEND_FOOTER_DMCA_URL' + }, + footer_source_url: { + format: String, + default: 'https://github.com/timvisee/send', + env: 'SEND_FOOTER_SOURCE_URL' + }, + custom_footer_text: { + format: String, + default: '', + env: 'CUSTOM_FOOTER_TEXT' + }, + custom_footer_url: { + format: String, + default: '', + env: 'CUSTOM_FOOTER_URL' + }, + main_notice_html: { + format: String, + default: '', + env: 'SEND_MAIN_NOTICE_HTML' + }, + upload_area_notice_html: { + format: String, + default: '', + env: 'SEND_UPLOAD_AREA_NOTICE_HTML' + }, + uploads_list_notice_html: { + format: String, + default: '', + env: 'SEND_UPLOADS_LIST_NOTICE_HTML' + }, + download_notice_html: { + format: String, + default: '', + env: 'SEND_DOWNLOAD_NOTICE_HTML' + }, + show_thunderbird_sponsor: { + format: Boolean, + default: false, + env: 'SHOW_THUNDERBIRD_SPONSOR' + }, + ui_color_primary: { + format: String, + default: '#0a84ff', + env: 'UI_COLOR_PRIMARY' + }, + ui_color_accent: { + format: String, + default: '#003eaa', + env: 'UI_COLOR_ACCENT' + }, + custom_locale: { + format: String, + default: '', + env: 'CUSTOM_LOCALE' + }, + ui_custom_assets: { + android_chrome_192px: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_ANDROID_CHROME_192PX' + }, + android_chrome_512px: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_ANDROID_CHROME_512PX' + }, + apple_touch_icon: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_APPLE_TOUCH_ICON' + }, + favicon_16px: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_FAVICON_16PX' + }, + favicon_32px: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_FAVICON_32PX' + }, + icon: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_ICON' + }, + safari_pinned_tab: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_SAFARI_PINNED_TAB' + }, + facebook: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_FACEBOOK' + }, + twitter: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_TWITTER' + }, + wordmark: { + format: String, + default: '', + env: 'UI_CUSTOM_ASSETS_WORDMARK' + }, + custom_css: { + format: String, + default: '', + env: 'UI_CUSTOM_CSS' + } } }); @@ -71,4 +367,17 @@ const conf = convict({ conf.validate({ allowed: 'strict' }); const props = conf.getProperties(); -module.exports = props; + +const deriveBaseUrl = req => { + if (!props.detect_base_url) { + return props.base_url; + } + + const protocol = req.secure ? 'https://' : 'http://'; + return `${protocol}${req.headers.host}`; +}; + +module.exports = { + ...props, + deriveBaseUrl +}; diff --git a/server/dev.js b/server/dev.js deleted file mode 100644 index a21bb65d..00000000 --- a/server/dev.js +++ /dev/null @@ -1,13 +0,0 @@ -const assets = require('../common/assets'); -const locales = require('../common/locales'); -const routes = require('./routes'); -const pages = require('./routes/pages'); - -module.exports = function(app, devServer) { - assets.setMiddleware(devServer.middleware); - locales.setMiddleware(devServer.middleware); - routes(app); - // webpack-dev-server routes haven't been added yet - // so wait for next tick to add 404 handler - process.nextTick(() => app.use(pages.notfound)); -}; diff --git a/server/fxa.js b/server/fxa.js new file mode 100644 index 00000000..47d3bd6e --- /dev/null +++ b/server/fxa.js @@ -0,0 +1,54 @@ +const fetch = require('node-fetch'); +const config = require('./config'); + +const KEY_SCOPE = config.fxa_key_scope; +let fxaConfig = null; +let lastConfigRefresh = 0; + +async function getFxaConfig() { + if (fxaConfig && Date.now() - lastConfigRefresh < 1000 * 60 * 5) { + return fxaConfig; + } + try { + const res = await fetch( + `${config.fxa_url}/.well-known/openid-configuration`, + { timeout: 3000 } + ); + fxaConfig = await res.json(); + fxaConfig.key_scope = KEY_SCOPE; + lastConfigRefresh = Date.now(); + } catch (e) { + // continue with previous fxaConfig + } + return fxaConfig; +} + +module.exports = { + getFxaConfig, + verify: async function(token) { + if (!token) { + return null; + } + + const c = await getFxaConfig(); + try { + const verifyUrl = c.jwks_uri.replace('jwks', 'verify'); //HACK + const result = await fetch(verifyUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ token }) + }); + const info = await result.json(); + if ( + info.scope && + Array.isArray(info.scope) && + info.scope.includes(KEY_SCOPE) + ) { + return info.user; + } + } catch (e) { + // gulp + } + return null; + } +}; diff --git a/server/initScript.js b/server/initScript.js new file mode 100644 index 00000000..59e4c402 --- /dev/null +++ b/server/initScript.js @@ -0,0 +1,62 @@ +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const config = require('./config'); +const clientConstants = require('./clientConstants'); + +let sentry = ''; +if (config.sentry_id) { + //eslint-disable-next-line node/no-missing-require + const version = require('../dist/version.json'); + sentry = ` +var SENTRY_CONFIG = { + dsn: '${config.sentry_id}', + release: '${version.version}', + beforeSend: function (data) { + var hash = window.location.hash; + if (hash) { + return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); + } + return data; + } +} +`; +} + +module.exports = function(state) { + const authConfig = state.authConfig + ? `var AUTH_CONFIG = ${JSON.stringify(state.authConfig)};` + : ''; + + /* eslint-disable no-useless-escape */ + const jsconfig = ` + var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent); + var isUnsupportedPage = /\\\/unsupported/.test(location.pathname); + if (isIE && !isUnsupportedPage) { + window.location.assign('/unsupported/ie'); + } + if ( + // Firefox < 50 + /firefox/i.test(navigator.userAgent) && + parseInt(navigator.userAgent.match(/firefox\\/*([^\\n\\r]*)\./i)[1], 10) < 50 + ) { + window.location.assign('/unsupported/outdated'); + } + + var LIMITS = ${JSON.stringify(clientConstants.LIMITS)}; + var WEB_UI = ${JSON.stringify(clientConstants.WEB_UI)}; + var DEFAULTS = ${JSON.stringify(clientConstants.DEFAULTS)}; + var PREFS = ${JSON.stringify(state.prefs)}; + var downloadMetadata = ${ + state.downloadMetadata ? raw(JSON.stringify(state.downloadMetadata)) : '{}' + }; + ${authConfig}; + ${sentry} + `; + return state.cspNonce + ? html` + + ` + : ''; +}; diff --git a/server/languages.js b/server/languages.js deleted file mode 100644 index d9121eef..00000000 --- a/server/languages.js +++ /dev/null @@ -1,16 +0,0 @@ -const { availableLanguages } = require('../package.json'); -const config = require('./config'); -const fs = require('fs'); -const path = require('path'); - -function allLangs() { - return fs.readdirSync( - path.join(__dirname, '..', 'dist', 'public', 'locales') - ); -} - -if (config.l10n_dev) { - module.exports = allLangs(); -} else { - module.exports = availableLanguages; -} diff --git a/server/layout.js b/server/layout.js index 18bef3cd..6d2051ab 100644 --- a/server/layout.js +++ b/server/layout.js @@ -1,77 +1,89 @@ const html = require('choo/html'); const assets = require('../common/assets'); -const locales = require('../common/locales'); +const initScript = require('./initScript'); module.exports = function(state, body = '') { - const firaTag = state.fira - ? html`` - : ''; + const custom_css = state.ui.assets.custom_css !== '' + ? html`` + : '' + return html` - - - - - - + + + + ${state.title} + + + + + + - - - - - - - - - + + + + + + + + + + + - ${state.title} - - - - - - - - - - - - - - - - - - - - - - - - - - ${firaTag} - - - - - - - ${body} - + + + + + ${custom_css} + + + + + + + + ${body} ${initScript(state)} + `; }; diff --git a/server/limiter.js b/server/limiter.js new file mode 100644 index 00000000..feb9d42a --- /dev/null +++ b/server/limiter.js @@ -0,0 +1,21 @@ +const { Transform } = require('stream'); + +class Limiter extends Transform { + constructor(limit) { + super(); + this.limit = limit; + this.length = 0; + } + + _transform(chunk, encoding, callback) { + this.length += chunk.length; + this.push(chunk); + if (this.length > this.limit) { + console.error('LIMIT', this.length, this.limit); + return callback(new Error('limit')); + } + callback(); + } +} + +module.exports = Limiter; diff --git a/server/locale.js b/server/locale.js new file mode 100644 index 00000000..a09def59 --- /dev/null +++ b/server/locale.js @@ -0,0 +1,31 @@ +const fs = require('fs'); +const path = require('path'); +const { FluentBundle, FluentResource } = require('@fluent/bundle'); +const localesPath = path.resolve(__dirname, '../public/locales'); +const locales = fs.readdirSync(localesPath); + +function makeBundle(locale) { + const bundle = new FluentBundle(locale, { useIsolating: false }); + bundle.addResource( + new FluentResource( + fs.readFileSync(path.resolve(localesPath, locale, 'send.ftl'), 'utf8') + ) + ); + return [locale, bundle]; +} + +const bundles = new Map(locales.map(makeBundle)); + +module.exports = function getTranslator(locale) { + const defaultBundle = bundles.get('en-US'); + const bundle = bundles.get(locale) || defaultBundle; + return function(id, data) { + if (bundle.hasMessage(id)) { + return bundle.formatPattern(bundle.getMessage(id).value, data); + } + return defaultBundle.formatPattern( + defaultBundle.getMessage(id).value, + data + ); + }; +}; diff --git a/server/metadata.js b/server/metadata.js new file mode 100644 index 00000000..1c599316 --- /dev/null +++ b/server/metadata.js @@ -0,0 +1,13 @@ +class Metadata { + constructor(obj) { + this.dl = +obj.dl || 0; + this.dlimit = +obj.dlimit || 1; + this.pwd = String(obj.pwd) === 'true'; + this.owner = obj.owner; + this.metadata = obj.metadata; + this.auth = obj.auth; + this.nonce = obj.nonce; + } +} + +module.exports = Metadata; diff --git a/server/middleware/auth.js b/server/middleware/auth.js new file mode 100644 index 00000000..128af07c --- /dev/null +++ b/server/middleware/auth.js @@ -0,0 +1,81 @@ +const assert = require('assert'); +const crypto = require('crypto'); +const storage = require('../storage'); +const config = require('../config'); +const fxa = require('../fxa'); + +module.exports = { + hmac: async function(req, res, next) { + const id = req.params.id; + const authHeader = req.header('Authorization'); + if (id && authHeader) { + try { + const auth = req.header('Authorization').split(' ')[1]; + const meta = await storage.metadata(id); + if (!meta) { + return res.sendStatus(404); + } + const hmac = crypto.createHmac( + 'sha256', + Buffer.from(meta.auth, 'base64') + ); + hmac.update(Buffer.from(meta.nonce, 'base64')); + const verifyHash = hmac.digest(); + if (crypto.timingSafeEqual(verifyHash, Buffer.from(auth, 'base64'))) { + req.nonce = crypto.randomBytes(16).toString('base64'); + storage.setField(id, 'nonce', req.nonce); + res.set('WWW-Authenticate', `send-v1 ${req.nonce}`); + req.authorized = true; + req.meta = meta; + } else { + res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); + req.authorized = false; + } + } catch (e) { + req.authorized = false; + } + } + if (req.authorized) { + next(); + } else { + res.sendStatus(401); + } + }, + owner: async function(req, res, next) { + const id = req.params.id; + const ownerToken = req.body.owner_token; + if (id && ownerToken) { + try { + req.meta = await storage.metadata(id); + if (!req.meta) { + return res.sendStatus(404); + } + const metaOwner = Buffer.from(req.meta.owner, 'utf8'); + const owner = Buffer.from(ownerToken, 'utf8'); + assert(metaOwner.length > 0); + assert(metaOwner.length === owner.length); + req.authorized = crypto.timingSafeEqual(metaOwner, owner); + } catch (e) { + req.authorized = false; + } + } + if (req.authorized) { + next(); + } else { + res.sendStatus(401); + } + }, + fxa: async function(req, res, next) { + const authHeader = req.header('Authorization'); + if (authHeader && /^Bearer\s/i.test(authHeader)) { + const token = authHeader.split(' ')[1]; + req.user = await fxa.verify(token); + } + + if (config.fxa_required && !req.user) { + res.sendStatus(401); + } else { + next(); + } + } +}; diff --git a/server/middleware/language.js b/server/middleware/language.js new file mode 100644 index 00000000..0de27e9b --- /dev/null +++ b/server/middleware/language.js @@ -0,0 +1,42 @@ +const { availableLanguages } = require('../../package.json'); +const config = require('../config'); +const fs = require('fs'); +const path = require('path'); +const { negotiateLanguages } = require('@fluent/langneg'); +const langData = require('cldr-core/supplemental/likelySubtags.json'); + +// We return early in the middleware if the lang header is long. +// If that ever changes we should re-evaluate this regex. +// eslint-disable-next-line security/detect-unsafe-regex +const acceptLanguages = /(([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\*)(;q=[0-1](\.[0-9]+)?)?/g; + +function allLangs() { + return fs.readdirSync(path.join(__dirname, '..', '..', 'public', 'locales')); +} + +const languages = config.l10n_dev ? allLangs() : availableLanguages; + +module.exports = function(req, res, next) { + const header = req.headers['accept-language'] || 'en-US'; + if (header.length > 255) { + req.language = 'en-US'; + return next(); + } + const langs = header.replace(/\s/g, '').match(acceptLanguages) || ['en-US']; + const preferred = langs + .map(l => { + const parts = l.split(';'); + return { + locale: parts[0], + q: parts[1] ? parseFloat(parts[1].split('=')[1]) : 1 + }; + }) + .sort((a, b) => b.q - a.q) + .map(x => x.locale); + req.language = negotiateLanguages(preferred, languages, { + strategy: 'lookup', + likelySubtags: langData.supplemental.likelySubtags, + defaultLocale: 'en-US' + })[0]; + next(); +}; diff --git a/server/prod.js b/server/prod.js deleted file mode 100644 index 2840f9ec..00000000 --- a/server/prod.js +++ /dev/null @@ -1,27 +0,0 @@ -const express = require('express'); -const path = require('path'); -const Raven = require('raven'); -const config = require('./config'); -const routes = require('./routes'); -const pages = require('./routes/pages'); - -if (config.sentry_dsn) { - Raven.config(config.sentry_dsn).install(); -} - -const app = express(); - -routes(app); - -app.use( - express.static(path.resolve(__dirname, '../dist/'), { - setHeaders: function(res) { - res.set('Cache-Control', 'public, max-age=31536000, immutable'); - res.removeHeader('Pragma'); - } - }) -); - -app.use(pages.notfound); - -app.listen(config.listen_port); diff --git a/server/readme.md b/server/readme.md new file mode 100644 index 00000000..82b68f27 --- /dev/null +++ b/server/readme.md @@ -0,0 +1,19 @@ +# Server Code + +The server provides the API, serves static assets, and renders the pages for Send. The production entrypoint is [prod.js](./bin/prod.js) and the development entrypoint is [dev.js](./bin/dev.js) via `webpack-dev-server`. + +## Server configuration + +[config.js](./config.js) contains the schema for our configuration options. Environment variables are the preferred method for setting configuration. + +## Middleware + +Contains authentication and localization middleware. + +## Routes + +Contains all the server routes and handlers for the API and pages + +## Storage + +Contains implementations of possible storage engines for the files and metadata diff --git a/server/routes/delete.js b/server/routes/delete.js index 00fac3e2..fca5f230 100644 --- a/server/routes/delete.js +++ b/server/routes/delete.js @@ -1,29 +1,10 @@ const storage = require('../storage'); -function validateID(route_id) { - return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; -} - module.exports = async function(req, res) { - const id = req.params.id; - - if (!validateID(id)) { - res.sendStatus(404); - return; - } - - const delete_token = req.body.delete_token; - - if (!delete_token) { - res.sendStatus(404); - return; - } - try { - const err = await storage.delete(id, delete_token); - if (!err) { - res.sendStatus(200); - } + const id = req.params.id; + await storage.del(id); + res.sendStatus(200); } catch (e) { res.sendStatus(404); } diff --git a/server/routes/download.js b/server/routes/download.js index 4a77febf..1c319a7f 100644 --- a/server/routes/download.js +++ b/server/routes/download.js @@ -1,49 +1,41 @@ const storage = require('../storage'); const mozlog = require('../log'); const log = mozlog('send.download'); -const crypto = require('crypto'); - -function validateID(route_id) { - return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; -} module.exports = async function(req, res) { const id = req.params.id; - if (!validateID(id)) { - return res.sendStatus(404); - } - try { - const auth = req.header('Authorization').split(' ')[1]; - const meta = await storage.metadata(id); - const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64')); - hmac.update(Buffer.from(meta.nonce, 'base64')); - const verifyHash = hmac.digest(); - const nonce = crypto.randomBytes(16).toString('base64'); - storage.setField(id, 'nonce', nonce); - if (!verifyHash.equals(Buffer.from(auth, 'base64'))) { - res.set('WWW-Authenticate', `send-v1 ${nonce}`); - return res.sendStatus(401); - } + const meta = req.meta; const contentLength = await storage.length(id); - res.writeHead(200, { - 'Content-Disposition': 'attachment', - 'Content-Type': 'application/octet-stream', - 'Content-Length': contentLength, - 'X-File-Metadata': meta.metadata, - 'WWW-Authenticate': `send-v1 ${nonce}` - }); - const file_stream = storage.get(id); + const fileStream = await storage.get(id); + let cancelled = false; - file_stream.on('end', async () => { + req.on('aborted', () => { + cancelled = true; + fileStream.destroy(); + }); + + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Length': contentLength + }); + fileStream.pipe(res).on('finish', async () => { + if (cancelled) { + return; + } + + const dl = meta.dl + 1; + const dlimit = meta.dlimit; try { - await storage.forceDelete(id); + if (dl >= dlimit) { + await storage.del(id); + } else { + await storage.incrementField(id, 'dl'); + } } catch (e) { - log.info('DeleteError:', id); + log.info('StorageError:', id); } }); - - file_stream.pipe(res); } catch (e) { res.sendStatus(404); } diff --git a/server/routes/exists.js b/server/routes/exists.js index e22bf21f..da49c019 100644 --- a/server/routes/exists.js +++ b/server/routes/exists.js @@ -1,18 +1,12 @@ const storage = require('../storage'); -function validateID(route_id) { - return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; -} - module.exports = async (req, res) => { - const id = req.params.id; - if (!validateID(id)) { - return res.sendStatus(404); - } - try { - await storage.exists(id); - res.sendStatus(200); + const meta = await storage.metadata(req.params.id); + res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); + res.send({ + requiresPassword: meta.pwd + }); } catch (e) { res.sendStatus(404); } diff --git a/server/routes/filelist.js b/server/routes/filelist.js new file mode 100644 index 00000000..043c8714 --- /dev/null +++ b/server/routes/filelist.js @@ -0,0 +1,50 @@ +const crypto = require('crypto'); +const config = require('../config'); +const storage = require('../storage'); +const Limiter = require('../limiter'); + +function id(user, kid) { + const sha = crypto.createHash('sha256'); + sha.update(user); + sha.update(kid); + const hash = sha.digest('hex'); + return `filelist-${hash}`; +} + +module.exports = { + async get(req, res) { + const kid = req.params.id; + try { + const fileId = id(req.user, kid); + const contentLength = await storage.length(fileId); + const fileStream = await storage.get(fileId); + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Length': contentLength + }); + fileStream.pipe(res); + } catch (e) { + res.sendStatus(404); + } + }, + + async post(req, res) { + const kid = req.params.id; + try { + const limiter = new Limiter(1024 * 1024 * 10); + const fileStream = req.pipe(limiter); + await storage.set( + id(req.user, kid), + fileStream, + null, + config.max_expire_seconds + ); + res.sendStatus(200); + } catch (e) { + if (e.message === 'limit') { + return res.sendStatus(413); + } + res.sendStatus(500); + } + } +}; diff --git a/server/routes/index.js b/server/routes/index.js index 7230d455..6b41d554 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,40 +1,20 @@ -const busboy = require('connect-busboy'); -const helmet = require('helmet'); +const crypto = require('crypto'); const bodyParser = require('body-parser'); -const languages = require('../languages'); +const helmet = require('helmet'); +const uaparser = require('ua-parser-js'); const storage = require('../storage'); const config = require('../config'); +const auth = require('../middleware/auth'); +const language = require('../middleware/language'); const pages = require('./pages'); -const { negotiateLanguages } = require('fluent-langneg'); +const filelist = require('./filelist'); +const clientConstants = require('../clientConstants'); + const IS_DEV = config.env === 'development'; -const acceptLanguages = /(([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\*)(;q=[0-1](\.[0-9]+)?)?/g; -const langData = require('cldr-core/supplemental/likelySubtags.json'); +const ID_REGEX = '([0-9a-fA-F]{10,16})'; module.exports = function(app) { - app.use(function(req, res, next) { - const header = req.headers['accept-language'] || 'en-US'; - if (header.length > 255) { - req.language = 'en-US'; - return next(); - } - const langs = header.replace(/\s/g, '').match(acceptLanguages); - const preferred = langs - .map(l => { - const parts = l.split(';'); - return { - locale: parts[0], - q: parts[1] ? parseFloat(parts[1].split('=')[1]) : 1 - }; - }) - .sort((a, b) => b.q - a.q) - .map(x => x.locale); - req.language = negotiateLanguages(preferred, languages, { - strategy: 'lookup', - likelySubtags: langData.supplemental.likelySubtags, - defaultLocale: 'en-US' - })[0]; - next(); - }); + app.set('trust proxy', true); app.use(helmet()); app.use( helmet.hsts({ @@ -42,54 +22,105 @@ module.exports = function(app) { force: !IS_DEV }) ); - app.use( - helmet.contentSecurityPolicy({ + app.use(function(req, res, next) { + req.ua = uaparser(req.header('user-agent')); + next(); + }); + app.use(function(req, res, next) { + req.cspNonce = crypto.randomBytes(16).toString('hex'); + next(); + }); + if (!IS_DEV) { + let csp = { directives: { defaultSrc: ["'self'"], connectSrc: [ "'self'", - 'https://sentry.prod.mozaws.net', - 'https://www.google-analytics.com' + function(req) { + const baseUrl = config.deriveBaseUrl(req); + const r = baseUrl.replace(/^http(s?):\/\//, 'ws$1://'); + console.log([baseUrl, r]); + return r; + } + ], + imgSrc: ["'self'", 'data:'], + scriptSrc: [ + "'self'", + function(req) { + return `'nonce-${req.cspNonce}'`; + } + ], + styleSrc: [ + "'self'", + function(req) { + return `'nonce-${req.cspNonce}'`; + } ], - imgSrc: ["'self'", 'https://www.google-analytics.com'], - scriptSrc: ["'self'"], - styleSrc: ["'self'", "'unsafe-inline'", 'https://code.cdn.mozilla.net'], - fontSrc: ["'self'", 'https://code.cdn.mozilla.net'], formAction: ["'none'"], frameAncestors: ["'none'"], objectSrc: ["'none'"], reportUri: '/__cspreport__' } - }) - ); - app.use( - busboy({ - limits: { - fileSize: config.max_file_size - } - }) - ); + }; + + app.use(helmet.contentSecurityPolicy(csp)); + } + app.use(function(req, res, next) { res.set('Pragma', 'no-cache'); - res.set('Cache-Control', 'no-cache'); + res.set( + 'Cache-Control', + 'private, no-cache, no-store, must-revalidate, max-age=0' + ); + next(); + }); + app.use(function(req, res, next) { + try { + // set by the load balancer + const [country, state] = req.header('X-Client-Geo-Location').split(','); + req.geo = { + country, + state + }; + } catch (e) { + req.geo = {}; + } next(); }); app.use(bodyParser.json()); - app.get('/', pages.index); - app.get('/legal', pages.legal); - app.get('/jsconfig.js', require('./jsconfig')); - app.get('/share/:id', pages.blank); - app.get('/download/:id', pages.download); - app.get('/completed', pages.blank); - app.get('/unsupported/:reason', pages.unsupported); - app.get('/api/download/:id', require('./download')); - app.get('/api/exists/:id', require('./exists')); - app.get('/api/metadata/:id', require('./metadata')); - app.post('/api/upload', require('./upload')); - app.post('/api/delete/:id', require('./delete')); - app.post('/api/password/:id', require('./password')); - + app.use(bodyParser.text()); + app.get('/', language, pages.index); + app.get('/config', function(req, res) { + res.json(clientConstants); + }); + app.get('/error', language, pages.blank); + app.get('/oauth', language, pages.blank); + app.get('/login', language, pages.index); + app.get('/app.webmanifest', language, require('./webmanifest')); + app.get(`/download/:id${ID_REGEX}`, language, pages.download); + app.get('/unsupported/:reason', language, pages.unsupported); + app.get(`/api/download/:id${ID_REGEX}`, auth.hmac, require('./download')); + app.get( + `/api/download/blob/:id${ID_REGEX}`, + auth.hmac, + require('./download') + ); + app.get(`/api/exists/:id${ID_REGEX}`, require('./exists')); + app.get(`/api/metadata/:id${ID_REGEX}`, auth.hmac, require('./metadata')); + app.get('/api/filelist/:id([\\w-]{16})', auth.fxa, filelist.get); + app.post('/api/filelist/:id([\\w-]{16})', auth.fxa, filelist.post); + app.post('/api/upload', auth.fxa, require('./upload')); + app.post(`/api/delete/:id${ID_REGEX}`, auth.owner, require('./delete')); + app.post(`/api/password/:id${ID_REGEX}`, auth.owner, require('./password')); + app.post( + `/api/params/:id${ID_REGEX}`, + auth.owner, + auth.fxa, + require('./params') + ); + app.post(`/api/info/:id${ID_REGEX}`, auth.owner, require('./info')); app.get('/__version__', function(req, res) { + // eslint-disable-next-line node/no-missing-require res.sendFile(require.resolve('../../dist/version.json')); }); diff --git a/server/routes/info.js b/server/routes/info.js new file mode 100644 index 00000000..b993706d --- /dev/null +++ b/server/routes/info.js @@ -0,0 +1,14 @@ +const storage = require('../storage'); + +module.exports = async function(req, res) { + try { + const ttl = await storage.ttl(req.params.id); + return res.send({ + dlimit: +req.meta.dlimit, + dtotal: +req.meta.dl, + ttl + }); + } catch (e) { + res.sendStatus(404); + } +}; diff --git a/server/routes/jsconfig.js b/server/routes/jsconfig.js deleted file mode 100644 index 23e07374..00000000 --- a/server/routes/jsconfig.js +++ /dev/null @@ -1,46 +0,0 @@ -const config = require('../config'); - -let sentry = ''; -if (config.sentry_id) { - //eslint-disable-next-line node/no-missing-require - const version = require('../../dist/version.json'); - sentry = ` -var RAVEN_CONFIG = { - release: '${version.version}', - tags: { - commit: '${version.commit}' - }, - dataCallback: function (data) { - var hash = window.location.hash; - if (hash) { - return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); - } - return data; - } -} -var SENTRY_ID = '${config.sentry_id}'; -`; -} - -let ga = ''; -if (config.analytics_id) { - ga = `var GOOGLE_ANALYTICS_ID = '${config.analytics_id}';`; -} - -/* eslint-disable no-useless-escape */ -const jsconfig = ` -var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent); -var isUnsupportedPage = /\\\/unsupported/.test(location.pathname); -if (isIE && !isUnsupportedPage) { - window.location.replace('/unsupported/ie'); -} -var MAXFILESIZE = ${config.max_file_size}; -var EXPIRE_SECONDS = ${config.expire_seconds}; -${ga} -${sentry} -`; - -module.exports = function(req, res) { - res.set('Content-Type', 'application/javascript'); - res.send(jsconfig); -}; diff --git a/server/routes/metadata.js b/server/routes/metadata.js index 0c774821..2e50537c 100644 --- a/server/routes/metadata.js +++ b/server/routes/metadata.js @@ -1,33 +1,13 @@ const storage = require('../storage'); -const crypto = require('crypto'); - -function validateID(route_id) { - return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; -} module.exports = async function(req, res) { const id = req.params.id; - if (!validateID(id)) { - return res.sendStatus(404); - } - + const meta = req.meta; try { - const auth = req.header('Authorization').split(' ')[1]; - const meta = await storage.metadata(id); - const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64')); - hmac.update(Buffer.from(meta.nonce, 'base64')); - const verifyHash = hmac.digest(); - const nonce = crypto.randomBytes(16).toString('base64'); - storage.setField(id, 'nonce', nonce); - res.set('WWW-Authenticate', `send-v1 ${nonce}`); - if (!verifyHash.equals(Buffer.from(auth, 'base64'))) { - return res.sendStatus(401); - } - const size = await storage.length(id); const ttl = await storage.ttl(id); res.send({ metadata: meta.metadata, - size, + finalDownload: meta.dl + 1 === meta.dlimit, ttl }); } catch (e) { diff --git a/server/routes/pages.js b/server/routes/pages.js index d0385fbf..b2dfd205 100644 --- a/server/routes/pages.js +++ b/server/routes/pages.js @@ -2,10 +2,6 @@ const routes = require('../../app/routes'); const storage = require('../storage'); const state = require('../state'); -function validateID(route_id) { - return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; -} - function stripEvents(str) { // For CSP we need to remove all the event handler placeholders. // It's ok, app.js will add them when it attaches to the DOM. @@ -13,29 +9,28 @@ function stripEvents(str) { } module.exports = { - index: function(req, res) { - res.send(stripEvents(routes.toString('/', state(req)))); + index: async function(req, res) { + const appState = await state(req); + res.send(stripEvents(routes().toString('/blank', appState))); }, - blank: function(req, res) { - res.send(stripEvents(routes.toString('/blank', state(req)))); + blank: async function(req, res) { + const appState = await state(req); + res.send(stripEvents(routes().toString('/blank', appState))); }, download: async function(req, res, next) { const id = req.params.id; - if (!validateID(id)) { - return next(); - } - + const appState = await state(req); try { const { nonce, pwd } = await storage.metadata(id); res.set('WWW-Authenticate', `send-v1 ${nonce}`); res.send( stripEvents( - routes.toString( - `/download/${req.params.id}`, - Object.assign(state(req), { - fileInfo: { nonce, pwd: +pwd } + routes().toString( + `/download/${id}`, + Object.assign(appState, { + downloadMetadata: { nonce, pwd } }) ) ) @@ -45,22 +40,26 @@ module.exports = { } }, - unsupported: function(req, res) { + unsupported: async function(req, res) { + const appState = await state(req); res.send( stripEvents( - routes.toString( - `/unsupported/${req.params.reason}`, - Object.assign(state(req), { fira: true }) - ) + routes().toString(`/unsupported/${req.params.reason}`, appState) ) ); }, - legal: function(req, res) { - res.send(stripEvents(routes.toString('/legal', state(req)))); - }, - - notfound: function(req, res) { - res.status(404).send(stripEvents(routes.toString('/404', state(req)))); + notfound: async function(req, res) { + const appState = await state(req); + res + .status(404) + .send( + stripEvents( + routes().toString( + '/404', + Object.assign(appState, { downloadMetadata: { status: 404 } }) + ) + ) + ); } }; diff --git a/server/routes/params.js b/server/routes/params.js new file mode 100644 index 00000000..bc04eb35 --- /dev/null +++ b/server/routes/params.js @@ -0,0 +1,17 @@ +const config = require('../config'); +const storage = require('../storage'); + +module.exports = function(req, res) { + const max = config.max_downloads; + const dlimit = req.body.dlimit; + if (!dlimit || dlimit > max) { + return res.sendStatus(400); + } + + try { + storage.setField(req.params.id, 'dlimit', dlimit); + res.sendStatus(200); + } catch (e) { + res.sendStatus(404); + } +}; diff --git a/server/routes/password.js b/server/routes/password.js index 02be3d25..bf2f5679 100644 --- a/server/routes/password.js +++ b/server/routes/password.js @@ -1,35 +1,17 @@ const storage = require('../storage'); -const crypto = require('crypto'); -function validateID(route_id) { - return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; -} - -module.exports = async function(req, res) { +module.exports = function(req, res) { const id = req.params.id; - if (!validateID(id)) { - return res.sendStatus(404); - } - if (!req.body.auth) { + const auth = req.body.auth; + if (!auth) { return res.sendStatus(400); } try { - const auth = req.header('Authorization').split(' ')[1]; - const meta = await storage.metadata(id); - const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64')); - hmac.update(Buffer.from(meta.nonce, 'base64')); - const verifyHash = hmac.digest(); - const nonce = crypto.randomBytes(16).toString('base64'); - storage.setField(id, 'nonce', nonce); - if (!verifyHash.equals(Buffer.from(auth, 'base64'))) { - res.set('WWW-Authenticate', `send-v1 ${nonce}`); - return res.sendStatus(401); - } + storage.setField(id, 'auth', auth); + storage.setField(id, 'pwd', true); + res.sendStatus(200); } catch (e) { - res.sendStatus(404); + return res.sendStatus(404); } - storage.setField(id, 'auth', req.body.auth); - storage.setField(id, 'pwd', 1); - res.sendStatus(200); }; diff --git a/server/routes/upload.js b/server/routes/upload.js index d23e8086..023b83a9 100644 --- a/server/routes/upload.js +++ b/server/routes/upload.js @@ -2,51 +2,44 @@ const crypto = require('crypto'); const storage = require('../storage'); const config = require('../config'); const mozlog = require('../log'); +const Limiter = require('../limiter'); +const { encryptedSize } = require('../../app/utils'); const log = mozlog('send.upload'); -module.exports = function(req, res) { - const newId = crypto.randomBytes(5).toString('hex'); +module.exports = async function(req, res) { + const newId = crypto.randomBytes(8).toString('hex'); const metadata = req.header('X-File-Metadata'); const auth = req.header('Authorization'); if (!metadata || !auth) { return res.sendStatus(400); } - + const owner = crypto.randomBytes(10).toString('hex'); const meta = { - delete: crypto.randomBytes(10).toString('hex'), + owner, metadata, - pwd: 0, auth: auth.split(' ')[1], nonce: crypto.randomBytes(16).toString('base64') }; - req.pipe(req.busboy); - req.busboy.on('file', async (fieldname, file) => { - try { - await storage.set(newId, file, meta); - const protocol = config.env === 'production' ? 'https' : req.protocol; - const url = `${protocol}://${req.get('host')}/download/${newId}/`; - res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); - res.json({ - url, - delete: meta.delete, - id: newId - }); - } catch (e) { - log.error('upload', e); - if (e.message === 'limit') { - return res.sendStatus(413); - } - res.sendStatus(500); + try { + const limiter = new Limiter(encryptedSize(config.max_file_size)); + const fileStream = req.pipe(limiter); + //this hasn't been updated to expiration time setting yet + //if you want to fallback to this code add this + await storage.set(newId, fileStream, meta, config.default_expire_seconds); + const url = `${config.deriveBaseUrl(req)}/download/${newId}/`; + res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); + res.json({ + url, + owner: meta.owner, + id: newId + }); + } catch (e) { + if (e.message === 'limit') { + return res.sendStatus(413); } - }); - - req.on('close', async err => { - try { - await storage.forceDelete(newId); - } catch (e) { - log.info('DeleteError:', newId); - } - }); + log.error('upload', e); + res.sendStatus(500); + } }; diff --git a/server/routes/webmanifest.js b/server/routes/webmanifest.js new file mode 100644 index 00000000..7533b238 --- /dev/null +++ b/server/routes/webmanifest.js @@ -0,0 +1,30 @@ +const state = require('../state'); + +module.exports = async function(req, res) { + const appState = await state(req); + + const manifest = { + name: 'Send', + short_name: 'Send', + lang: req.language, + icons: [ + { + src: appState.ui.assets.android_chrome_192px, + type: 'image/png', + sizes: '192x192' + }, + { + src: appState.ui.assets.android_chrome_512px, + type: 'image/png', + sizes: '512x512' + } + ], + start_url: '/', + display: 'standalone', + orientation: 'portrait', + theme_color: '#220033', + background_color: 'white' + }; + res.set('Content-Type', 'application/manifest+json'); + res.json(manifest); +}; diff --git a/server/routes/ws.js b/server/routes/ws.js new file mode 100644 index 00000000..17e257fd --- /dev/null +++ b/server/routes/ws.js @@ -0,0 +1,116 @@ +const crypto = require('crypto'); +const storage = require('../storage'); +const config = require('../config'); +const mozlog = require('../log'); +const Limiter = require('../limiter'); +const fxa = require('../fxa'); +const { encryptedSize } = require('../../app/utils'); + +const { Transform } = require('stream'); + +const log = mozlog('send.upload'); + +module.exports = function(ws, req) { + let fileStream; + + ws.on('close', e => { + if (e !== 1000 && fileStream !== undefined) { + fileStream.destroy(); + } + }); + + ws.once('message', async function(message) { + try { + const newId = crypto.randomBytes(8).toString('hex'); + const owner = crypto.randomBytes(10).toString('hex'); + + const fileInfo = JSON.parse(message); + const timeLimit = fileInfo.timeLimit || config.default_expire_seconds; + const dlimit = fileInfo.dlimit || config.default_downloads; + const metadata = fileInfo.fileMetadata; + const auth = fileInfo.authorization; + const user = await fxa.verify(fileInfo.bearer); + const maxFileSize = config.max_file_size; + const maxExpireSeconds = config.max_expire_seconds; + const maxDownloads = config.max_downloads; + + if (config.fxa_required && !user) { + ws.send( + JSON.stringify({ + error: 401 + }) + ); + return ws.close(); + } + if ( + !metadata || + !auth || + timeLimit <= 0 || + timeLimit > maxExpireSeconds || + dlimit > maxDownloads + ) { + ws.send( + JSON.stringify({ + error: 400 + }) + ); + return ws.close(); + } + + const meta = { + owner, + metadata, + dlimit, + auth: auth.split(' ')[1], + nonce: crypto.randomBytes(16).toString('base64') + }; + + const url = `${config.deriveBaseUrl(req)}/download/${newId}/`; + + ws.send( + JSON.stringify({ + url, + ownerToken: meta.owner, + id: newId + }) + ); + const limiter = new Limiter(encryptedSize(maxFileSize)); + const eof = new Transform({ + transform: function(chunk, encoding, callback) { + if (chunk.length === 1 && chunk[0] === 0) { + this.push(null); + } else { + this.push(chunk); + } + callback(); + } + }); + const wsStream = ws.constructor.createWebSocketStream(ws); + + fileStream = wsStream.pipe(eof).pipe(limiter); // limiter needs to be the last in the chain + + await storage.set(newId, fileStream, meta, timeLimit); + + if (ws.readyState === 1) { + // if the socket is closed by a cancelled upload the stream + // ends without an error so we need to check the state + // before sending a reply. + + // TODO: we should handle cancelled uploads differently + // in order to avoid having to check socket state and clean + // up storage, possibly with an exception that we can catch. + ws.send(JSON.stringify({ ok: true })); + } + } catch (e) { + log.error('upload', e); + if (ws.readyState === 1) { + ws.send( + JSON.stringify({ + error: e === 'limit' ? 413 : 500 + }) + ); + } + } + ws.close(); + }); +}; diff --git a/server/state.js b/server/state.js index 152ccd60..a1aee40d 100644 --- a/server/state.js +++ b/server/state.js @@ -1,22 +1,81 @@ const config = require('./config'); const layout = require('./layout'); -const locales = require('../common/locales'); +const assets = require('../common/assets'); +const getTranslator = require('./locale'); +const { getFxaConfig } = require('./fxa'); +const fs = require('fs'); +const path = require('path'); -module.exports = function(req) { - const locale = req.language || 'en-US'; +module.exports = async function(req) { + const locale = (() => { + if (config.custom_locale != '' && fs.existsSync(path.join(__dirname,'../public/locales',config.custom_locale))) { + return config.custom_locale; + } + else { + return req.language || 'en-US'; + } + })(); + let authConfig = null; + let robots = 'none'; + if (req.route && req.route.path === '/') { + robots = 'all'; + } + if (config.fxa_client_id) { + try { + authConfig = await getFxaConfig(); + authConfig.client_id = config.fxa_client_id; + } catch (e) { + // continue without accounts + } + } + const prefs = {}; + if (config.survey_url) { + prefs.surveyUrl = config.survey_url; + } + const baseUrl = config.deriveBaseUrl(req); + const uiAssets = { + android_chrome_192px: assets.get('android-chrome-192x192.png'), + android_chrome_512px: assets.get('android-chrome-512x512.png'), + apple_touch_icon: assets.get('apple-touch-icon.png'), + favicon_16px: assets.get('favicon-16x16.png'), + favicon_32px: assets.get('favicon-32x32.png'), + icon: assets.get('icon.svg'), + safari_pinned_tab: assets.get('safari-pinned-tab.svg'), + facebook: baseUrl + '/' + assets.get('send-fb.jpg'), + twitter: baseUrl + '/' + assets.get('send-twitter.jpg'), + wordmark: assets.get('wordmark.svg') + '#logo', + custom_css: '' + }; + Object.keys(uiAssets).forEach(index => { + if (config.ui_custom_assets[index] !== '') + uiAssets[index] = config.ui_custom_assets[index]; + }); return { + archive: { + numFiles: 0 + }, locale, - translate: locales.getTranslator(locale), - title: 'Firefox Send', - description: - 'Encrypt and send files with a link that automatically expires to ensure your important documents don’t stay online forever.', - baseUrl: config.base_url, - ui: {}, + capabilities: { account: false }, + translate: getTranslator(locale), + title: config.custom_title, + description: config.custom_description, + baseUrl, + ui: { + colors: { + primary: config.ui_color_primary, + accent: config.ui_color_accent + }, + assets: uiAssets + }, storage: { files: [] }, - fira: false, fileInfo: {}, + cspNonce: req.cspNonce, + user: { avatar: assets.get('user.svg'), loggedIn: false }, + robots, + authConfig, + prefs, layout }; }; diff --git a/server/storage.js b/server/storage.js deleted file mode 100644 index 13bfeb47..00000000 --- a/server/storage.js +++ /dev/null @@ -1,271 +0,0 @@ -const AWS = require('aws-sdk'); -const s3 = new AWS.S3(); -const mkdirp = require('mkdirp'); - -const config = require('./config'); -const fs = require('fs'); -const path = require('path'); - -const mozlog = require('./log'); - -const log = mozlog('send.storage'); - -const redis_lib = - config.env === 'development' && config.redis_host === 'localhost' - ? 'redis-mock' - : 'redis'; - -const redis = require(redis_lib); -const redis_client = redis.createClient({ - host: config.redis_host, - connect_timeout: 10000 -}); - -redis_client.on('error', err => { - log.error('Redis:', err); -}); - -const fileDir = config.file_dir; - -if (config.s3_bucket) { - module.exports = { - exists: exists, - ttl: ttl, - length: awsLength, - get: awsGet, - set: awsSet, - setField: setField, - delete: awsDelete, - forceDelete: awsForceDelete, - ping: awsPing, - flushall: flushall, - quit: quit, - metadata - }; -} else { - mkdirp.sync(config.file_dir); - log.info('fileDir', fileDir); - module.exports = { - exists: exists, - ttl: ttl, - length: localLength, - get: localGet, - set: localSet, - setField: setField, - delete: localDelete, - forceDelete: localForceDelete, - ping: localPing, - flushall: flushall, - quit: quit, - metadata - }; -} - -function flushall() { - redis_client.flushdb(); -} - -function quit() { - redis_client.quit(); -} - -function metadata(id) { - return new Promise((resolve, reject) => { - redis_client.hgetall(id, (err, reply) => { - if (err || !reply) { - return reject(err); - } - resolve(reply); - }); - }); -} - -function ttl(id) { - return new Promise((resolve, reject) => { - redis_client.ttl(id, (err, reply) => { - if (err || !reply) { - return reject(err); - } - resolve(reply * 1000); - }); - }); -} - -function exists(id) { - return new Promise((resolve, reject) => { - redis_client.exists(id, (rediserr, reply) => { - if (reply === 1 && !rediserr) { - resolve(); - } else { - reject(rediserr); - } - }); - }); -} - -function setField(id, key, value) { - redis_client.hset(id, key, value); -} - -function localLength(id) { - return new Promise((resolve, reject) => { - try { - resolve(fs.statSync(path.join(fileDir, id)).size); - } catch (err) { - reject(); - } - }); -} - -function localGet(id) { - return fs.createReadStream(path.join(fileDir, id)); -} - -function localSet(newId, file, meta) { - return new Promise((resolve, reject) => { - const filepath = path.join(fileDir, newId); - const fstream = fs.createWriteStream(filepath); - file.pipe(fstream); - file.on('limit', () => { - file.unpipe(fstream); - fstream.destroy(new Error('limit')); - }); - fstream.on('finish', () => { - redis_client.hmset(newId, meta); - redis_client.expire(newId, config.expire_seconds); - log.info('localSet:', 'Upload Finished of ' + newId); - resolve(meta.delete); - }); - - fstream.on('error', err => { - log.error('localSet:', 'Failed upload of ' + newId); - fs.unlinkSync(filepath); - reject(err); - }); - }); -} - -function localDelete(id, delete_token) { - return new Promise((resolve, reject) => { - redis_client.hget(id, 'delete', (err, reply) => { - if (!reply || delete_token !== reply) { - reject(); - } else { - redis_client.del(id); - log.info('Deleted:', id); - resolve(fs.unlinkSync(path.join(fileDir, id))); - } - }); - }); -} - -function localForceDelete(id) { - return new Promise((resolve, reject) => { - redis_client.del(id); - resolve(fs.unlinkSync(path.join(fileDir, id))); - }); -} - -function localPing() { - return new Promise((resolve, reject) => { - redis_client.ping(err => { - return err ? reject() : resolve(); - }); - }); -} - -function awsLength(id) { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - return new Promise((resolve, reject) => { - s3.headObject(params, function(err, data) { - if (!err) { - resolve(data.ContentLength); - } else { - reject(); - } - }); - }); -} - -function awsGet(id) { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - - try { - return s3.getObject(params).createReadStream(); - } catch (err) { - return null; - } -} - -function awsSet(newId, file, meta) { - const params = { - Bucket: config.s3_bucket, - Key: newId, - Body: file - }; - let hitLimit = false; - const upload = s3.upload(params); - file.on('limit', () => { - hitLimit = true; - upload.abort(); - }); - return upload.promise().then( - () => { - redis_client.hmset(newId, meta); - redis_client.expire(newId, config.expire_seconds); - }, - err => { - if (hitLimit) { - throw new Error('limit'); - } else { - throw err; - } - } - ); -} - -function awsDelete(id, delete_token) { - return new Promise((resolve, reject) => { - redis_client.hget(id, 'delete', (err, reply) => { - if (!reply || delete_token !== reply) { - reject(); - } else { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - - s3.deleteObject(params, function(err, _data) { - redis_client.del(id); - err ? reject(err) : resolve(err); - }); - } - }); - }); -} - -function awsForceDelete(id) { - return new Promise((resolve, reject) => { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - - s3.deleteObject(params, function(err, _data) { - redis_client.del(id); - err ? reject(err) : resolve(); - }); - }); -} - -function awsPing() { - return localPing().then(() => - s3.headBucket({ Bucket: config.s3_bucket }).promise() - ); -} diff --git a/server/storage/fs.js b/server/storage/fs.js new file mode 100644 index 00000000..abffc7d2 --- /dev/null +++ b/server/storage/fs.js @@ -0,0 +1,50 @@ +const fs = require('fs'); +const path = require('path'); +const promisify = require('util').promisify; + +const stat = promisify(fs.stat); + +class FSStorage { + constructor(config, log) { + this.log = log; + this.dir = config.file_dir; + fs.mkdirSync(this.dir, { + recursive: true + }); + } + + async length(id) { + const result = await stat(path.join(this.dir, id)); + return result.size; + } + + getStream(id) { + return fs.createReadStream(path.join(this.dir, id)); + } + + set(id, file) { + return new Promise((resolve, reject) => { + const filepath = path.join(this.dir, id); + const fstream = fs.createWriteStream(filepath); + file.pipe(fstream); + file.on('error', err => { + fstream.destroy(err); + }); + fstream.on('error', err => { + fs.unlinkSync(filepath); + reject(err); + }); + fstream.on('finish', resolve); + }); + } + + del(id) { + return Promise.resolve(fs.unlinkSync(path.join(this.dir, id))); + } + + ping() { + return Promise.resolve(); + } +} + +module.exports = FSStorage; diff --git a/server/storage/gcs.js b/server/storage/gcs.js new file mode 100644 index 00000000..66058519 --- /dev/null +++ b/server/storage/gcs.js @@ -0,0 +1,42 @@ +const { Storage } = require('@google-cloud/storage'); +const storage = new Storage(); + +class GCSStorage { + constructor(config, log) { + this.bucket = storage.bucket(config.gcs_bucket); + this.log = log; + } + + async length(id) { + const data = await this.bucket.file(id).getMetadata(); + return data[0].size; + } + + getStream(id) { + return this.bucket.file(id).createReadStream({ validation: false }); + } + + set(id, file) { + return new Promise((resolve, reject) => { + file + .pipe( + this.bucket.file(id).createWriteStream({ + validation: false, + resumable: true + }) + ) + .on('error', reject) + .on('finish', resolve); + }); + } + + del(id) { + return this.bucket.file(id).delete(); + } + + ping() { + return this.bucket.exists(); + } +} + +module.exports = GCSStorage; diff --git a/server/storage/index.js b/server/storage/index.js new file mode 100644 index 00000000..3e46c5c1 --- /dev/null +++ b/server/storage/index.js @@ -0,0 +1,86 @@ +const config = require('../config'); +const Metadata = require('../metadata'); +const mozlog = require('../log'); +const createRedisClient = require('./redis'); + +function getPrefix(seconds) { + return Math.max(Math.floor(seconds / 86400), 1); +} + +class DB { + constructor(config) { + let Storage = null; + if (config.s3_bucket) { + Storage = require('./s3'); + } else if (config.gcs_bucket) { + Storage = require('./gcs'); + } else { + Storage = require('./fs'); + } + this.log = mozlog('send.storage'); + + this.storage = new Storage(config, this.log); + + this.redis = createRedisClient(config); + this.redis.on('error', err => { + this.log.error('Redis:', err); + }); + } + + async ttl(id) { + const result = await this.redis.ttlAsync(id); + return Math.ceil(result) * 1000; + } + + async getPrefixedId(id) { + const prefix = await this.redis.hgetAsync(id, 'prefix'); + return `${prefix}-${id}`; + } + + async length(id) { + const filePath = await this.getPrefixedId(id); + return this.storage.length(filePath); + } + + async get(id) { + const filePath = await this.getPrefixedId(id); + return this.storage.getStream(filePath); + } + + async set(id, file, meta, expireSeconds = config.default_expire_seconds) { + const prefix = getPrefix(expireSeconds); + const filePath = `${prefix}-${id}`; + await this.storage.set(filePath, file); + this.redis.hset(id, 'prefix', prefix); + if (meta) { + this.redis.hmset(id, meta); + } + this.redis.expire(id, expireSeconds); + } + + setField(id, key, value) { + this.redis.hset(id, key, value); + } + + incrementField(id, key, increment = 1) { + this.redis.hincrby(id, key, increment); + } + + async del(id) { + const filePath = await this.getPrefixedId(id); + this.storage.del(filePath); + this.redis.del(id); + } + + async ping() { + await this.redis.pingAsync(); + await this.storage.ping(); + } + + async metadata(id) { + const result = await this.redis.hgetallAsync(id); + return result && new Metadata(result); + } +} + +module.exports = new DB(config); diff --git a/server/storage/redis.js b/server/storage/redis.js new file mode 100644 index 00000000..2a5e48c3 --- /dev/null +++ b/server/storage/redis.js @@ -0,0 +1,37 @@ +const promisify = require('util').promisify; + +module.exports = function(config) { + const redis_lib = + config.env === 'development' && config.redis_host === 'localhost' + ? 'redis-mock' + : 'redis'; + + //eslint-disable-next-line security/detect-non-literal-require + const redis = require(redis_lib); + + var client_config = { + host: config.redis_host, + port: config.redis_port, + retry_strategy: options => { + if (options.total_retry_time > config.redis_retry_time) { + client.emit('error', 'Retry time exhausted'); + return new Error('Retry time exhausted'); + } + + return config.redis_retry_delay; + } + }; + if (config.redis_user != null && config.redis_user.length > 0) + client_config.user = config.redis_user; + if (config.redis_password != null && config.redis_password.length > 0) + client_config.password = config.redis_password; + if (config.redis_db != null && config.redis_db.length > 0) + client_config.db = config.redis_db; + const client = redis.createClient(client_config); + + client.ttlAsync = promisify(client.ttl); + client.hgetallAsync = promisify(client.hgetall); + client.hgetAsync = promisify(client.hget); + client.pingAsync = promisify(client.ping); + return client; +}; diff --git a/server/storage/s3.js b/server/storage/s3.js new file mode 100644 index 00000000..f9a7caae --- /dev/null +++ b/server/storage/s3.js @@ -0,0 +1,48 @@ +const AWS = require('aws-sdk'); + +class S3Storage { + constructor(config, log) { + this.bucket = config.s3_bucket; + this.log = log; + const cfg = {}; + if (config.s3_endpoint != '') { + cfg['endpoint'] = config.s3_endpoint; + } + cfg['s3ForcePathStyle'] = config.s3_use_path_style_endpoint; + AWS.config.update(cfg); + this.s3 = new AWS.S3(); + } + + async length(id) { + const result = await this.s3 + .headObject({ Bucket: this.bucket, Key: id }) + .promise(); + return Number(result.ContentLength); + } + + getStream(id) { + return this.s3 + .getObject({ Bucket: this.bucket, Key: id }) + .createReadStream(); + } + + set(id, file) { + const upload = this.s3.upload({ + Bucket: this.bucket, + Key: id, + Body: file + }); + file.on('error', () => upload.abort()); + return upload.promise(); + } + + del(id) { + return this.s3.deleteObject({ Bucket: this.bucket, Key: id }).promise(); + } + + ping() { + return this.s3.headBucket({ Bucket: this.bucket }).promise(); + } +} + +module.exports = S3Storage; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..ce63bac9 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,362 @@ +const colors = { + transparent: 'transparent', + primary: 'var(--color-primary)', + primary_accent: 'var(--color-primary-accent)', + + black: '#000000', + 'grey-90': '#0c0c0d', + 'grey-80': '#2a2a2e', + 'grey-70': '#38383d', + 'grey-60': '#4a4a4f', + 'grey-50': '#737373', + grey: '#b1b1b3', + 'grey-40': '#b1b1b3', + 'grey-30': '#d7d7db', + 'grey-banner': '#f0f0f4', + 'grey-transparent': 'hsla(250, 13%, 9%, .2)', + 'grey-20': '#ededf0', + 'grey-10': '#f9f9fa', + white: '#ffffff', + + cloud: 'rgba(255, 255, 255, 0.8)', + violet: 'hsl(258, 57%, 35%)' +}; + +module.exports = { + purge: false, + theme: { + colors: colors, + screens: { + sm: '576px', + md: '768px', + lg: '992px', + xl: '1200px', + dark: { raw: '(prefers-color-scheme: dark)' } + }, + fontFamily: { + sans: [ + 'Inter', + 'system-ui', + 'BlinkMacSystemFont', + '-apple-system', + 'Segoe UI', + 'Roboto', + 'Oxygen', + 'Ubuntu', + 'Cantarell', + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + 'sans-serif' + ], + serif: [ + 'Constantia', + 'Lucida Bright', + 'Lucidabright', + 'Lucida Serif', + 'Lucida', + 'DejaVu Serif', + 'Bitstream Vera Serif', + 'Liberation Serif', + 'Georgia', + 'serif' + ], + mono: [ + 'Menlo', + 'Monaco', + 'Consolas', + 'Liberation Mono', + 'Courier New', + 'monospace' + ] + }, + fontSize: { + xs: '.75rem', // 12px + sm: '.875rem', // 14px + base: '1rem', // 16px + lg: '1.125rem', // 18px + xl: '1.25rem', // 20px + '2xl': '1.5rem', // 24px + '3xl': '2rem', // 32px + '4xl': '2.25rem', // 36px + '5xl': '3rem' // 48px + }, + fontWeight: { + hairline: 100, + thin: 200, + light: 300, + normal: 400, + medium: 500, + semibold: 600, + bold: 700, + extrabold: 800, + black: 900 + }, + lineHeight: { + none: 1, + tight: 1.25, + normal: 1.5, + loose: 1.75 + }, + letterSpacing: { + tight: '-0.05em', + normal: '0', + wide: '0.05em' + }, + textColor: colors, + backgroundColor: colors, + backgroundSize: { + auto: 'auto', + cover: 'cover', + contain: 'contain' + }, + borderWidth: { + default: '1px', + '0': '0', + '2': '2px', + '4': '4px', + '8': '8px' + }, + borderColor: global.Object.assign({ default: colors['grey-30'] }, colors), + borderRadius: { + none: '0', + sm: '.125rem', + default: '.25rem', + lg: '.5rem', + xl: '1rem', + full: '9999px' + }, + width: { + auto: 'auto', + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '24': '6rem', + '32': '8rem', + '48': '12rem', + '64': '16rem', + '128': '32rem', + '1/2': '50%', + '1/3': '33.33333%', + '2/3': '66.66667%', + '1/4': '25%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.66667%', + '5/6': '83.33333%', + full: '100%', + screen: '100vw' + }, + height: { + auto: 'auto', + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '24': '6rem', + '32': '8rem', + '48': '12rem', + '64': '16rem', + full: '100%', + screen: '100vh' + }, + minWidth: { + '0': '0', + full: '100%' + }, + minHeight: { + '0': '0', + full: '100%', + screen: '100vh' + }, + maxWidth: { + xs: '20rem', + sm: '30rem', + md: '40rem', + lg: '50rem', + xl: '60rem', + '2xl': '70rem', + '3xl': '80rem', + '4xl': '90rem', + '5xl': '100rem', + full: '100%' + }, + maxHeight: { + full: '100%', + 'half-screen': '50vh', + screen: '100vh' + }, + padding: { + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '20': '5rem', + '24': '6rem', + '32': '8rem' + }, + margin: { + auto: 'auto', + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '20': '5rem', + '24': '6rem', + '32': '8rem', + '-px': '-1px', + '-1': '-0.25rem', + '-2': '-0.5rem', + '-3': '-0.75rem', + '-4': '-1rem', + '-5': '-1.25rem', + '-6': '-1.5rem', + '-8': '-2rem', + '-10': '-2.5rem', + '-12': '-3rem', + '-16': '-4rem', + '-20': '-5rem', + '-24': '-6rem', + '-32': '-8rem' + }, + boxShadow: { + default: '0 2px 4px 0 rgba(0,0,0,0.10)', + md: '0 4px 8px 0 rgba(0,0,0,0.12), 0 2px 4px 0 rgba(0,0,0,0.08)', + lg: '0 15px 30px 0 rgba(0,0,0,0.11), 0 5px 15px 0 rgba(0,0,0,0.08)', + inner: 'inset 0 2px 4px 0 rgba(0,0,0,0.06)', + outline: '0 0 0 3px rgba(52,144,220,0.5)', + none: 'none', + cloud: '0 0 5rem 5rem white', + btn: + 'inset 0 -6px 12px 0 rgba(0,70,144,0.25), 0 4px 6px 0 rgba(34,0,51,0.04), 0 1px 10px 0 rgba(7,48,114,0.12), 0 2px 8px -1px rgba(14,13,26,0.08)' + }, + opacity: { + '0': '0', + '25': '.25', + '50': '.5', + '75': '.75', + '100': '1' + }, + fill: { + current: 'currentColor' + }, + stroke: { + current: 'currentColor' + }, + + zIndex: { + auto: 'auto', + '0': 0, + '10': 10, + '20': 20, + '30': 30, + '40': 40, + '50': 50 + } + }, + + variants: { + appearance: ['responsive'], + backgroundAttachment: ['responsive'], + backgroundColor: ['responsive', 'hover', 'focus'], + backgroundPosition: ['responsive'], + backgroundRepeat: ['responsive'], + backgroundSize: ['responsive'], + borderCollapse: [], + borderColor: ['responsive', 'hover', 'focus'], + borderRadius: ['responsive'], + borderStyle: ['responsive'], + borderWidth: ['responsive'], + cursor: ['responsive'], + display: ['responsive'], + flexDirection: ['responsive'], + flexWrap: ['responsive'], + alignItems: ['responsive'], + alignSelf: ['responsive'], + alignContent: ['responsive'], + justifyContent: ['responsive'], + flex: ['responsive'], + flexGrow: ['responsive'], + flexShrink: ['responsive'], + float: ['responsive'], + fontFamily: ['responsive'], + fontWeight: ['responsive', 'hover', 'focus'], + height: ['responsive'], + lineHeight: ['responsive'], + listStylePosition: ['responsive'], + listStyleType: ['responsive'], + margin: ['responsive'], + maxHeight: ['responsive'], + maxWidth: ['responsive'], + minHeight: ['responsive'], + minWidth: ['responsive'], + negativeMargin: ['responsive'], + opacity: ['responsive', 'hover'], + outline: ['focus'], + overflow: ['responsive'], + padding: ['responsive'], + pointerEvents: ['responsive'], + position: ['responsive'], + inset: ['responsive'], + resize: ['responsive'], + boxShadow: ['responsive', 'hover', 'focus'], + fill: [], + stroke: [], + tableLayout: ['responsive'], + textAlign: ['responsive'], + textColor: ['responsive', 'hover', 'focus'], + fontSize: ['responsive'], + fontStyle: ['responsive', 'hover', 'focus'], + fontSmoothing: ['responsive', 'hover', 'focus'], + textDecoration: ['responsive', 'hover', 'focus'], + textTransform: ['responsive', 'hover', 'focus'], + letterSpacing: ['responsive'], + userSelect: ['responsive'], + verticalAlign: ['responsive'], + visibility: ['responsive'], + whitespace: ['responsive'], + wordBreak: ['responsive'], + width: ['responsive'], + zIndex: ['responsive'] + }, + corePlugins: { + container: false + }, + plugins: [] +}; diff --git a/test/.eslintrc.yml b/test/.eslintrc.yml index dd9f4ba4..b1f66d58 100644 --- a/test/.eslintrc.yml +++ b/test/.eslintrc.yml @@ -19,5 +19,7 @@ rules: mocha/no-pending-tests: error mocha/no-return-and-callback: warn mocha/no-skipped-tests: error + mocha/no-setup-in-describe: off + mocha/no-hooks-for-single-case: off no-console: off # ¯\_(ツ)_/¯ diff --git a/test/backend/auth-tests.js b/test/backend/auth-tests.js new file mode 100644 index 00000000..cf424a8b --- /dev/null +++ b/test/backend/auth-tests.js @@ -0,0 +1,105 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + metadata: sinon.stub(), + setField: sinon.stub() +}; + +function request(id, auth) { + return { + params: { id }, + header: sinon.stub().returns(auth) + }; +} + +function response() { + return { + sendStatus: sinon.stub(), + set: sinon.stub() + }; +} + +const next = sinon.stub(); + +const storedMeta = { + auth: + 'r9uFxEs9GEVaQR9CJJ0uTKFGhFSOTRjOY2FCLFlCIZ0Cr-VGTVpMGlXDbNR8RMT55trMpSrzWtBVKq1LffOT2g', + nonce: 'FL4oxA7IE1PW8shwFN9qZw==' +}; + +const authMiddleware = proxyquire('../../server/middleware/auth', { + '../storage': storage +}).hmac; + +describe('Owner Middleware', function() { + afterEach(function() { + storage.metadata.reset(); + storage.setField.reset(); + next.reset(); + }); + + it('sends a 401 when no auth header is set', async function() { + const req = request('x'); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 401); + sinon.assert.notCalled(next); + }); + + it('sends a 404 when metadata is not found', async function() { + const req = request('x', 'y'); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 404); + sinon.assert.notCalled(next); + }); + + it('sends a 401 when the auth header is invalid base64', async function() { + storage.metadata.returns(Promise.resolve(storedMeta)); + const req = request('x', '1'); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 401); + sinon.assert.notCalled(next); + }); + + it('authenticates when the hashes match', async function() { + storage.metadata.returns(Promise.resolve(storedMeta)); + const req = request( + 'x', + 'send-v1 R7nZk14qJqZXtxpnAtw2uDIRQTRnO1qSO1Q0PiwcNA8' + ); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledOnce(next); + sinon.assert.calledWith(storage.setField, 'x', 'nonce', req.nonce); + sinon.assert.calledWith( + res.set, + 'WWW-Authenticate', + `send-v1 ${req.nonce}` + ); + sinon.assert.notCalled(res.sendStatus); + assert.equal(req.authorized, true); + assert.equal(req.meta, storedMeta); + assert.notEqual(req.nonce, storedMeta.nonce); + }); + + it('sends a 401 when the hashes do not match', async function() { + storage.metadata.returns(Promise.resolve(storedMeta)); + const req = request( + 'x', + 'send-v1 R8nZk14qJqZXtxpnAtw2uDIRQTRnO1qSO1Q0PiwcNA8' + ); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 401); + sinon.assert.calledWith( + res.set, + 'WWW-Authenticate', + `send-v1 ${storedMeta.nonce}` + ); + sinon.assert.notCalled(next); + }); +}); diff --git a/test/backend/delete-tests.js b/test/backend/delete-tests.js new file mode 100644 index 00000000..2984b34b --- /dev/null +++ b/test/backend/delete-tests.js @@ -0,0 +1,44 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + del: sinon.stub(), + ttl: sinon.stub() +}; + +function request(id) { + return { + params: { id } + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const delRoute = proxyquire('../../server/routes/delete', { + '../storage': storage +}); + +describe('/api/delete', function() { + afterEach(function() { + storage.del.reset(); + }); + + it('calls storage.del with the id parameter', async function() { + const req = request('x'); + const res = response(); + await delRoute(req, res); + sinon.assert.calledWith(storage.del, 'x'); + sinon.assert.calledWith(res.sendStatus, 200); + }); + + it('sends a 404 on failure', async function() { + storage.del.returns(Promise.reject(new Error())); + const res = response(); + await delRoute(request('x'), res); + sinon.assert.calledWith(res.sendStatus, 404); + }); +}); diff --git a/test/backend/info-tests.js b/test/backend/info-tests.js new file mode 100644 index 00000000..d0a562fa --- /dev/null +++ b/test/backend/info-tests.js @@ -0,0 +1,59 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + ttl: sinon.stub() +}; + +function request(id, meta) { + return { + params: { id }, + meta + }; +} + +function response() { + return { + sendStatus: sinon.stub(), + send: sinon.stub() + }; +} + +const infoRoute = proxyquire('../../server/routes/info', { + '../storage': storage +}); + +describe('/api/info', function() { + afterEach(function() { + storage.ttl.reset(); + }); + + it('calls storage.ttl with the id parameter', async function() { + const req = request('x'); + const res = response(); + await infoRoute(req, res); + sinon.assert.calledWith(storage.ttl, 'x'); + }); + + it('sends a 404 on failure', async function() { + storage.ttl.returns(Promise.reject(new Error())); + const res = response(); + await infoRoute(request('x'), res); + sinon.assert.calledWith(res.sendStatus, 404); + }); + + it('returns a json object', async function() { + storage.ttl.returns(Promise.resolve(123)); + const meta = { + dlimit: '1', + dl: '0' + }; + const res = response(); + await infoRoute(request('x', meta), res); + sinon.assert.calledWithMatch(res.send, { + dlimit: 1, + dtotal: 0, + ttl: 123 + }); + }); +}); diff --git a/test/backend/language-tests.js b/test/backend/language-tests.js new file mode 100644 index 00000000..1480d15f --- /dev/null +++ b/test/backend/language-tests.js @@ -0,0 +1,67 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const config = { + l10n_dev: false // prod configuration +}; +const pkg = { + availableLanguages: ['en-US', 'fr', 'it', 'es-ES'] +}; + +function request(acceptLang) { + return { + headers: { + 'accept-language': acceptLang + } + }; +} + +const langMiddleware = proxyquire('../../server/middleware/language', { + '../config': config, + '../../package.json': pkg +}); + +describe('Language Middleware', function() { + it('defaults to en-US when no header is present', function() { + const req = request(); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'en-US'); + sinon.assert.calledOnce(next); + }); + + it('sets req.language to en-US when accept-language > 255 chars', function() { + const accept = Array(257).join('a'); + assert.equal(accept.length, 256); + const req = request(accept); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'en-US'); + sinon.assert.calledOnce(next); + }); + + it('defaults to en-US when no accept-language is available', function() { + const req = request('fa,cs,ja'); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'en-US'); + sinon.assert.calledOnce(next); + }); + + it('prefers higher q values', function() { + const req = request('fa;q=0.5, it;q=0.9'); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'it'); + sinon.assert.calledOnce(next); + }); + + it('uses likely subtags', function() { + const req = request('es-MX'); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'es-ES'); + sinon.assert.calledOn(next); + }); +}); diff --git a/test/backend/metadata-tests.js b/test/backend/metadata-tests.js new file mode 100644 index 00000000..9208b912 --- /dev/null +++ b/test/backend/metadata-tests.js @@ -0,0 +1,62 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + ttl: sinon.stub(), + length: sinon.stub() +}; + +function request(id, meta) { + return { + params: { id }, + meta + }; +} + +function response() { + return { + sendStatus: sinon.stub(), + send: sinon.stub() + }; +} + +const metadataRoute = proxyquire('../../server/routes/metadata', { + '../storage': storage +}); + +describe('/api/metadata', function() { + afterEach(function() { + storage.ttl.reset(); + storage.length.reset(); + }); + + it('calls storage.ttl with the id parameter', async function() { + const req = request('x'); + const res = response(); + await metadataRoute(req, res); + sinon.assert.calledWith(storage.ttl, 'x'); + }); + + it('sends a 404 on failure', async function() { + storage.ttl.returns(Promise.reject(new Error())); + const res = response(); + await metadataRoute(request('x'), res); + sinon.assert.calledWith(res.sendStatus, 404); + }); + + it('returns a json object', async function() { + storage.ttl.returns(Promise.resolve(123)); + const meta = { + dlimit: 1, + dl: 0, + metadata: 'foo' + }; + const res = response(); + await metadataRoute(request('x', meta), res); + sinon.assert.calledWithMatch(res.send, { + metadata: 'foo', + finalDownload: true, + ttl: 123 + }); + }); +}); diff --git a/test/backend/owner-tests.js b/test/backend/owner-tests.js new file mode 100644 index 00000000..8e2ff9af --- /dev/null +++ b/test/backend/owner-tests.js @@ -0,0 +1,81 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + metadata: sinon.stub() +}; + +function request(id, owner_token) { + return { + params: { id }, + body: { owner_token } + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const ownerMiddleware = proxyquire('../../server/middleware/auth', { + '../storage': storage +}).owner; + +describe('Owner Middleware', function() { + afterEach(function() { + storage.metadata.reset(); + }); + + it('sends a 404 when the id is not found', async function() { + const next = sinon.stub(); + storage.metadata.returns(Promise.resolve(null)); + const res = response(); + await ownerMiddleware(request('a', 'y'), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 404); + }); + + it('sends a 401 when the owner_token is missing', async function() { + const next = sinon.stub(); + const meta = { owner: 'y' }; + storage.metadata.returns(Promise.resolve(meta)); + const res = response(); + await ownerMiddleware(request('b', null), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 401); + }); + + it('sends a 401 when the owner_token does not match', async function() { + const next = sinon.stub(); + const meta = { owner: 'y' }; + storage.metadata.returns(Promise.resolve(meta)); + const res = response(); + await ownerMiddleware(request('c', 'z'), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 401); + }); + + it('sends a 401 if the metadata call fails', async function() { + const next = sinon.stub(); + storage.metadata.returns(Promise.reject(new Error())); + const res = response(); + await ownerMiddleware(request('d', 'y'), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 401); + }); + + it('sets req.meta and req.authorized on successful auth', async function() { + const next = sinon.stub(); + const meta = { owner: 'y' }; + storage.metadata.returns(Promise.resolve(meta)); + const req = request('e', 'y'); + const res = response(); + await ownerMiddleware(req, res, next); + assert.equal(req.meta, meta); + assert.equal(req.authorized, true); + sinon.assert.notCalled(res.sendStatus); + sinon.assert.calledOnce(next); + }); +}); diff --git a/test/backend/params-tests.js b/test/backend/params-tests.js new file mode 100644 index 00000000..1ff38b2f --- /dev/null +++ b/test/backend/params-tests.js @@ -0,0 +1,56 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + setField: sinon.stub() +}; + +function request(id) { + return { + params: { id }, + body: {} + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const paramsRoute = proxyquire('../../server/routes/params', { + '../storage': storage +}); + +describe('/api/params', function() { + afterEach(function() { + storage.setField.reset(); + }); + + it('calls storage.setField with the correct parameter', function() { + const req = request('x'); + const dlimit = 2; + req.body.dlimit = dlimit; + const res = response(); + paramsRoute(req, res); + sinon.assert.calledWith(storage.setField, 'x', 'dlimit', dlimit); + sinon.assert.calledWith(res.sendStatus, 200); + }); + + it('sends a 400 if dlimit is too large', function() { + const req = request('x'); + const res = response(); + req.body.dlimit = 201; + paramsRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 400); + }); + + it('sends a 404 on failure', function() { + storage.setField.throws(new Error()); + const req = request('x'); + const res = response(); + req.body.dlimit = 2; + paramsRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 404); + }); +}); diff --git a/test/backend/password-tests.js b/test/backend/password-tests.js new file mode 100644 index 00000000..03c76c4c --- /dev/null +++ b/test/backend/password-tests.js @@ -0,0 +1,53 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + setField: sinon.stub() +}; + +function request(id, body) { + return { + params: { id }, + body + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const passwordRoute = proxyquire('../../server/routes/password', { + '../storage': storage +}); + +describe('/api/password', function() { + afterEach(function() { + storage.setField.reset(); + }); + + it('calls storage.setField with the correct parameter', function() { + const req = request('x', { auth: 'z' }); + const res = response(); + passwordRoute(req, res); + sinon.assert.calledWith(storage.setField, 'x', 'auth', 'z'); + sinon.assert.calledWith(storage.setField, 'x', 'pwd', true); + sinon.assert.calledWith(res.sendStatus, 200); + }); + + it('sends a 400 if auth is missing', function() { + const req = request('x', {}); + const res = response(); + passwordRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 400); + }); + + it('sends a 404 on failure', function() { + storage.setField.throws(new Error()); + const req = request('x', { auth: 'z' }); + const res = response(); + passwordRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 404); + }); +}); diff --git a/test/backend/s3-tests.js b/test/backend/s3-tests.js new file mode 100644 index 00000000..9e6642fd --- /dev/null +++ b/test/backend/s3-tests.js @@ -0,0 +1,157 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +function resolvedPromise(val) { + return { + promise: () => Promise.resolve(val) + }; +} + +function rejectedPromise(err) { + return { + promise: () => Promise.reject(err) + }; +} + +const s3Stub = { + headObject: sinon.stub(), + getObject: sinon.stub(), + upload: sinon.stub(), + deleteObject: sinon.stub() +}; + +const awsStub = { + config: { + update: sinon.stub() + }, + S3: function() { + return s3Stub; + } +}; + +const S3Storage = proxyquire('../../server/storage/s3', { + 'aws-sdk': awsStub +}); + +describe('S3Storage', function() { + it('uses config.s3_bucket', function() { + const s = new S3Storage({ s3_bucket: 'foo' }); + assert.equal(s.bucket, 'foo'); + }); + + describe('length', function() { + it('returns the ContentLength', async function() { + s3Stub.headObject = sinon + .stub() + .returns(resolvedPromise({ ContentLength: 123 })); + const s = new S3Storage({ s3_bucket: 'foo' }); + const len = await s.length('x'); + assert.equal(len, 123); + sinon.assert.calledWithMatch(s3Stub.headObject, { + Bucket: 'foo', + Key: 'x' + }); + }); + + it('throws when id not found', async function() { + const err = new Error(); + s3Stub.headObject = sinon.stub().returns(rejectedPromise(err)); + const s = new S3Storage({ s3_bucket: 'foo' }); + try { + await s.length('x'); + assert.fail(); + } catch (e) { + assert.equal(e, err); + } + }); + }); + + describe('getStream', function() { + it('returns a Stream object', function() { + const stream = {}; + s3Stub.getObject = sinon + .stub() + .returns({ createReadStream: () => stream }); + const s = new S3Storage({ s3_bucket: 'foo' }); + const result = s.getStream('x'); + assert.equal(result, stream); + sinon.assert.calledWithMatch(s3Stub.getObject, { + Bucket: 'foo', + Key: 'x' + }); + }); + }); + + describe('set', function() { + it('calls s3.upload', async function() { + const file = { on: sinon.stub() }; + s3Stub.upload = sinon.stub().returns(resolvedPromise()); + const s = new S3Storage({ s3_bucket: 'foo' }); + await s.set('x', file); + sinon.assert.calledWithMatch(s3Stub.upload, { + Bucket: 'foo', + Key: 'x', + Body: file + }); + }); + + it('aborts upload if limit is hit', async function() { + const file = { + on: (ev, fn) => fn() + }; + const abort = sinon.stub(); + const err = new Error('limit'); + s3Stub.upload = sinon.stub().returns({ + promise: () => Promise.reject(err), + abort + }); + const s = new S3Storage({ s3_bucket: 'foo' }); + try { + await s.set('x', file); + assert.fail(); + } catch (e) { + assert.equal(e.message, 'limit'); + sinon.assert.calledOnce(abort); + } + }); + + it('throws when s3.upload fails', async function() { + const file = { + on: sinon.stub() + }; + const err = new Error(); + s3Stub.upload = sinon.stub().returns(rejectedPromise(err)); + const s = new S3Storage({ s3_bucket: 'foo' }); + try { + await s.set('x', file); + assert.fail(); + } catch (e) { + assert.equal(e, err); + } + }); + }); + + describe('del', function() { + it('calls s3.deleteObject', async function() { + s3Stub.deleteObject = sinon.stub().returns(resolvedPromise(true)); + const s = new S3Storage({ s3_bucket: 'foo' }); + const result = await s.del('x'); + assert.equal(result, true); + sinon.assert.calledWithMatch(s3Stub.deleteObject, { + Bucket: 'foo', + Key: 'x' + }); + }); + }); + + describe('ping', function() { + it('calls s3.headBucket', async function() { + s3Stub.headBucket = sinon.stub().returns(resolvedPromise(true)); + const s = new S3Storage({ s3_bucket: 'foo' }); + const result = await s.ping(); + assert.equal(result, true); + sinon.assert.calledWithMatch(s3Stub.headBucket, { Bucket: 'foo' }); + }); + }); +}); diff --git a/test/backend/storage-tests.js b/test/backend/storage-tests.js new file mode 100644 index 00000000..9f8408cf --- /dev/null +++ b/test/backend/storage-tests.js @@ -0,0 +1,139 @@ +const assert = require('assert'); +const proxyquire = require('proxyquire').noCallThru(); + +const stream = {}; +class MockStorage { + length() { + return Promise.resolve(12); + } + getStream() { + return stream; + } + set() { + return Promise.resolve(); + } + del() { + return Promise.resolve(); + } + ping() { + return Promise.resolve(); + } +} + +const config = { + s3_bucket: 'foo', + default_expire_seconds: 20, + expire_times_seconds: [10, 20, 30], + env: 'development', + redis_host: 'localhost' +}; + +const storage = proxyquire('../../server/storage', { + '../config': config, + '../log': () => {}, + './s3': MockStorage +}); + +describe('Storage', function() { + describe('ttl', function() { + it('returns milliseconds remaining', async function() { + const time = 40; + await storage.set('x', null, { foo: 'bar' }, time); + const ms = await storage.ttl('x'); + await storage.del('x'); + assert.equal(ms, time * 1000); + }); + }); + + describe('length', function() { + it('returns the file size', async function() { + const len = await storage.length('x'); + assert.equal(len, 12); + }); + }); + + describe('get', function() { + it('returns a stream', async function() { + const s = await storage.get('x'); + assert.equal(s, stream); + }); + }); + + describe('set', function() { + it('sets expiration to expire time', async function() { + const seconds = 100; + await storage.set('x', null, { foo: 'bar' }, seconds); + const s = await storage.redis.ttlAsync('x'); + await storage.del('x'); + assert.equal(Math.ceil(s), seconds); + }); + + it('adds right prefix based on expire time', async function() { + await storage.set('x', null, { foo: 'bar' }, 300); + const path_x = await storage.getPrefixedId('x'); + assert.equal(path_x, '1-x'); + await storage.del('x'); + + await storage.set('y', null, { foo: 'bar' }, 86400); + const path_y = await storage.getPrefixedId('y'); + assert.equal(path_y, '1-y'); + await storage.del('y'); + + await storage.set('z', null, { foo: 'bar' }, 86400 * 7); + const path_z = await storage.getPrefixedId('z'); + assert.equal(path_z, '7-z'); + await storage.del('z'); + }); + + it('sets metadata', async function() { + const m = { foo: 'bar' }; + await storage.set('x', null, m); + const meta = await storage.redis.hgetallAsync('x'); + delete meta.prefix; + await storage.del('x'); + assert.deepEqual(meta, m); + }); + }); + + describe('setField', function() { + it('works', async function() { + await storage.set('x', null); + storage.setField('x', 'y', 'z'); + const z = await storage.redis.hgetAsync('x', 'y'); + assert.equal(z, 'z'); + await storage.del('x'); + }); + }); + + describe('del', function() { + it('works', async function() { + await storage.set('x', null, { foo: 'bar' }); + await storage.del('x'); + const meta = await storage.metadata('x'); + assert.equal(meta, null); + }); + }); + + describe('ping', function() { + it('works', async function() { + await storage.ping(); + }); + }); + + describe('metadata', function() { + it('returns all metadata fields', async function() { + const m = { + pwd: true, + dl: 1, + dlimit: 1, + auth: 'foo', + metadata: 'bar', + nonce: 'baz', + owner: 'bmo' + }; + await storage.set('x', null, m); + const meta = await storage.metadata('x'); + assert.deepEqual(meta, m); + }); + }); +}); diff --git a/test/frontend/.eslintrc.yml b/test/frontend/.eslintrc.yml index 07a266de..c9dca39e 100644 --- a/test/frontend/.eslintrc.yml +++ b/test/frontend/.eslintrc.yml @@ -1,2 +1,8 @@ env: - browser: true \ No newline at end of file + browser: true + +parserOptions: + sourceType: module + +rules: + node/no-unsupported-features: off \ No newline at end of file diff --git a/test/frontend/driver.js b/test/frontend/driver.js deleted file mode 100644 index 3e16d347..00000000 --- a/test/frontend/driver.js +++ /dev/null @@ -1,22 +0,0 @@ -const webdriver = require('selenium-webdriver'); -const path = require('path'); -const until = webdriver.until; - -const driver = new webdriver.Builder().forBrowser('firefox').build(); - -driver.get(path.join('file:///', __dirname, '/frontend.test.html')); -driver.wait(until.titleIs('Mocha Tests')); -driver.wait(until.titleMatches(/^[0-9]$/)); - -driver.getTitle().then(title => { - driver.quit().then(() => { - if (title === '0') { - console.log('Frontend tests have passed.'); - } else { - throw new Error( - 'Frontend tests are failing. ' + - 'Please open the frontend.test.html file in a browser.' - ); - } - }); -}); diff --git a/test/frontend/frontend.bundle.js b/test/frontend/frontend.bundle.js deleted file mode 100644 index 2f043245..00000000 --- a/test/frontend/frontend.bundle.js +++ /dev/null @@ -1,22 +0,0 @@ -class FakeFile extends Blob { - constructor(name, data, opt) { - super(data, opt); - this.name = name; - } -} - -window.Raven = { - captureException: function(err) { - console.error(err, err.stack); - } -}; - -window.FakeFile = FakeFile; -window.FileSender = require('../../app/fileSender'); -window.FileReceiver = require('../../app/fileReceiver'); -window.sinon = require('sinon'); -window.server = window.sinon.fakeServer.create(); -window.assert = require('assert'); -const utils = require('../../app/utils'); -window.b64ToArray = utils.b64ToArray; -window.arrayToB64 = utils.arrayToB64; diff --git a/test/frontend/frontend.test.html b/test/frontend/frontend.test.html deleted file mode 100644 index 757d8eb1..00000000 --- a/test/frontend/frontend.test.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - Mocha Tests - - - - - -
    - - - - - - - - \ No newline at end of file diff --git a/test/frontend/frontend.test.js b/test/frontend/frontend.test.js deleted file mode 100644 index b2241330..00000000 --- a/test/frontend/frontend.test.js +++ /dev/null @@ -1,230 +0,0 @@ -const FileSender = window.FileSender; -const FileReceiver = window.FileReceiver; -const FakeFile = window.FakeFile; -const assert = window.assert; -const server = window.server; -const b64ToArray = window.b64ToArray; -const sinon = window.sinon; - -let file; -let encryptedIV; -let secretKey; -let originalBlob; - -describe('File Sender', function() { - before(function() { - server.respondImmediately = true; - server.respondWith('POST', '/upload', function(request) { - const reader = new FileReader(); - reader.readAsArrayBuffer(request.requestBody.get('data')); - - reader.onload = function(event) { - file = this.result; - }; - - const responseObj = JSON.parse(request.requestHeaders['X-File-Metadata']); - request.respond( - 200, - { 'Content-Type': 'application/json' }, - JSON.stringify({ - url: 'some url', - id: responseObj.id, - delete: responseObj.delete - }) - ); - }); - }); - - it('Should get a loading event emission', function() { - const file = new FakeFile('hello_world.txt', ['This is some data.']); - const fs = new FileSender(file); - let testLoading = true; - - fs.on('loading', isStillLoading => { - assert(!(!testLoading && isStillLoading)); - testLoading = isStillLoading; - }); - - return fs - .upload() - .then(info => { - assert(info); - assert(!testLoading); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); - - it('Should get a encrypting event emission', function() { - const file = new FakeFile('hello_world.txt', ['This is some data.']); - const fs = new FileSender(file); - let testEncrypting = true; - - fs.on('encrypting', isStillEncrypting => { - assert(!(!testEncrypting && isStillEncrypting)); - testEncrypting = isStillEncrypting; - }); - - return fs - .upload() - .then(info => { - assert(info); - assert(!testEncrypting); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); - - it('Should encrypt a file properly', function(done) { - const newFile = new FakeFile('hello_world.txt', ['This is some data.']); - const fs = new FileSender(newFile); - fs.upload().then(info => { - const key = info.secretKey; - secretKey = info.secretKey; - const IV = info.fileId; - encryptedIV = info.fileId; - - const readRaw = new FileReader(); - readRaw.onload = function(event) { - const rawArray = new Uint8Array(this.result); - originalBlob = rawArray; - window.crypto.subtle - .importKey( - 'jwk', - { - kty: 'oct', - k: key, - alg: 'A128GCM', - ext: true - }, - { - name: 'AES-GCM' - }, - true, - ['encrypt', 'decrypt'] - ) - .then(cryptoKey => { - window.crypto.subtle - .encrypt( - { - name: 'AES-GCM', - iv: b64ToArray(IV), - tagLength: 128 - }, - cryptoKey, - rawArray - ) - .then(encrypted => { - assert( - new Uint8Array(encrypted).toString() === - new Uint8Array(file).toString() - ); - done(); - }); - }); - }; - - readRaw.readAsArrayBuffer(newFile); - }); - }); -}); - -describe('File Receiver', function() { - class FakeXHR { - constructor() { - this.response = file; - this.status = 200; - } - - static setup() { - FakeXHR.prototype.open = sinon.spy(); - FakeXHR.prototype.send = function() { - this.onload(); - }; - - FakeXHR.prototype.originalXHR = window.XMLHttpRequest; - - FakeXHR.prototype.getResponseHeader = function() { - return JSON.stringify({ - filename: 'hello_world.txt', - id: encryptedIV - }); - }; - window.XMLHttpRequest = FakeXHR; - } - - static restore() { - // originalXHR is a sinon FakeXMLHttpRequest, since - // fakeServer.create() is called in frontend.bundle.js - window.XMLHttpRequest.prototype.originalXHR.restore(); - } - } - - const cb = function(done) { - if ( - file === undefined || - encryptedIV === undefined || - secretKey === undefined - ) { - assert.fail( - 'Please run file sending tests before trying to receive the files.' - ); - done(); - } - - FakeXHR.setup(); - done(); - }; - - before(cb); - - after(function() { - FakeXHR.restore(); - }); - - it('Should decrypt properly', function() { - const fr = new FileReceiver(); - location.hash = secretKey; - return fr - .download() - .then(([decrypted, name]) => { - assert(name); - assert( - new Uint8Array(decrypted).toString() === - new Uint8Array(originalBlob).toString() - ); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); - - it('Should emit decrypting events', function() { - const fr = new FileReceiver(); - location.hash = secretKey; - - let testDecrypting = true; - - fr.on('decrypting', isStillDecrypting => { - assert(!(!testDecrypting && isStillDecrypting)); - testDecrypting = isStillDecrypting; - }); - - return fr - .download() - .then(([decrypted, name]) => { - assert(decrypted); - assert(name); - assert(!testDecrypting); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); -}); diff --git a/test/frontend/index.js b/test/frontend/index.js new file mode 100644 index 00000000..3e323ef2 --- /dev/null +++ b/test/frontend/index.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const path = require('path'); + +function kv(f) { + return `require('./tests/${f}')`; +} + +module.exports = function() { + const files = fs + .readdirSync(path.join(__dirname, 'tests')) + .filter(p => /\.js$/.test(p)); + const code = "require('fast-text-encoding');\n" + files.map(kv).join(';\n'); + return { + code, + dependencies: files.map(f => require.resolve('./tests/' + f)), + cacheable: true + }; +}; diff --git a/test/frontend/routes.js b/test/frontend/routes.js new file mode 100644 index 00000000..1f4a0a78 --- /dev/null +++ b/test/frontend/routes.js @@ -0,0 +1,49 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const initScript = require('../../server/initScript'); + +module.exports = function(app) { + app.get('/mocha.css', function(req, res) { + res.sendFile(require.resolve('mocha/mocha.css')); + }); + app.get('/mocha.js', function(req, res) { + res.sendFile(require.resolve('mocha/mocha.js')); + }); + app.get('/test', function(req, res) { + res.send( + html` + + + + + + + ${initScript({ + cspNonce: 'test', + locale: 'en-US' + })} + + + +
    + + + + `.toString() + ); + }); +}; diff --git a/test/frontend/runner.js b/test/frontend/runner.js new file mode 100644 index 00000000..adc711c2 --- /dev/null +++ b/test/frontend/runner.js @@ -0,0 +1,72 @@ +/* eslint-disable no-undef, no-process-exit */ +const fs = require('fs'); +const path = require('path'); +const puppeteer = require('puppeteer'); +const webpack = require('webpack'); +const config = require('../../webpack.config'); +const middleware = require('webpack-dev-middleware'); +const express = require('express'); +const devRoutes = require('../../server/bin/test'); +const app = express(); + +const wpm = middleware(webpack(config(null, { mode: 'development' })), { + logLevel: 'silent' +}); +app.use(wpm); +devRoutes(app, { middleware: wpm }); + +// eslint-disable-next-line no-unused-vars +function onConsole(msg) { + // uncomment to debug + // console.error(msg.text()); +} + +const server = app.listen(async function() { + let exitCode = -1; + const browser = await puppeteer.launch({ + args: [ + // puppeteer >= 1.10.0 crashes on Circle CI without this flag set + '--no-sandbox' + ] + }); + try { + const page = await browser.newPage(); + page.on('console', onConsole); + page.on('pageerror', console.log.bind(console)); + await page.setDefaultNavigationTimeout(60000); + await page.goto(`http://127.0.0.1:${server.address().port}/test`); + await page.waitFor(() => typeof runner.testResults !== 'undefined', { + polling: 1000, + timeout: 15000 + }); + const results = await page.evaluate(() => runner.testResults); + const coverage = await page.evaluate(() => __coverage__); + if (coverage) { + const dir = path.resolve(__dirname, '../../.nyc_output'); + fs.mkdirSync(dir, { + recursive: true + }); + fs.writeFileSync( + path.resolve(dir, 'frontend.json'), + JSON.stringify(coverage) + ); + } + const stats = results.stats; + exitCode = stats.failures; + console.log(`${stats.passes} passing (${stats.duration}ms)\n`); + if (stats.failures) { + console.log('Failures:\n'); + for (const f of results.failures) { + console.log(`${f.fullTitle}`); + console.log(` ${f.err.stack}\n`); + } + } + } catch (e) { + console.log(e); + } finally { + browser.close(); + server.close(() => { + process.exit(exitCode); + }); + } +}); diff --git a/test/frontend/tests/api-tests.js b/test/frontend/tests/api-tests.js new file mode 100644 index 00000000..0273778a --- /dev/null +++ b/test/frontend/tests/api-tests.js @@ -0,0 +1,62 @@ +/* global DEFAULTS */ +import assert from 'assert'; +import Archive from '../../../app/archive'; +import * as api from '../../../app/api'; +import Keychain from '../../../app/keychain'; + +const encoder = new TextEncoder(); +const plaintext = new Archive([new Blob([encoder.encode('hello world!')])]); +const metadata = { + name: 'test.txt', + type: 'text/plain' +}; + +describe('API', function() { + describe('websocket upload', function() { + it('returns file info on success', async function() { + const keychain = new Keychain(); + const enc = await keychain.encryptStream(plaintext.stream); + const meta = await keychain.encryptMetadata(metadata); + const verifierB64 = await keychain.authKeyB64(); + const p = function() {}; + const up = api.uploadWs( + enc, + meta, + verifierB64, + DEFAULTS.EXPIRE_SECONDS, + 1, + null, + p + ); + + const result = await up.result; + assert.ok(result.url); + assert.ok(result.id); + assert.ok(result.ownerToken); + }); + + it('can be cancelled', async function() { + const keychain = new Keychain(); + const enc = await keychain.encryptStream(plaintext.stream); + const meta = await keychain.encryptMetadata(metadata); + const verifierB64 = await keychain.authKeyB64(); + const p = function() {}; + const up = api.uploadWs( + enc, + meta, + verifierB64, + DEFAULTS.EXPIRE_SECONDS, + null, + p + ); + + up.cancel(); + try { + await up.result; + assert.fail('not cancelled'); + } catch (e) { + assert.equal(e.message, '0'); + } + }); + }); +}); diff --git a/test/frontend/tests/auth-tests.js b/test/frontend/tests/auth-tests.js new file mode 100644 index 00000000..2d0fef3d --- /dev/null +++ b/test/frontend/tests/auth-tests.js @@ -0,0 +1,45 @@ +import assert from 'assert'; +import storage from '../../../app/storage'; +import { decryptBundle, prepareScopedBundleKey } from '../../../app/fxa'; +import { b64ToArray } from '../../../app/utils'; + +const decoder = new TextDecoder(); + +describe('user auth', function() { + it('prepares ECDH keys for PKCE auth', async function() { + const empty = storage.get('scopedBundlePrivateKey'); + assert.equal(empty, undefined); + const publicKeyB64 = await prepareScopedBundleKey(storage); + const publicKey = JSON.parse(decoder.decode(b64ToArray(publicKeyB64))); + assert(!publicKey.d, 'not a public key'); + assert(publicKey.x); + assert(publicKey.y); + assert.equal(publicKey.kty, 'EC'); + assert.equal(publicKey.crv, 'P-256'); + + const privateKey = JSON.parse(storage.get('scopedBundlePrivateKey')); + storage.remove('scopedBundlePrivateKey'); + assert.equal(privateKey.kty, 'EC'); + assert.equal(privateKey.crv, 'P-256'); + assert(privateKey.d, 'not a private key'); + }); + + it('decrypts the PKCE auth bundle', async function() { + storage.set( + 'scopedBundlePrivateKey', + '{"kty":"EC","kid":"cV9_thVX9XRa-R2nVZF9rFdwrcR_eST4UZuUCx03ebI","crv":"P-256","x":"-0OOb6SPdYBz0CkQLWRu8ojDUhRe-VoKnwLEBi97KAk","y":"U3fXgj1LV7KhiO5O60niMjPpDqToh15-R6C22NnmNXY","d":"KfIQCxZrqSI6j69rAC6fEiGIYKwYv2buQG9NTcKOiGc"}' + ); + const jwks = await decryptBundle( + storage, + 'eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiRUNESC1FUyIsImtpZCI6ImNWOV90aFZYOVhSYS1SMm5WWkY5ckZkd3JjUl9lU1Q0VVp1VUN4MDNlYkkiLCJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJqckcwajNFODNodDZJcDE1YmtuZWRUV3kwZmR1WnR0V3NtMkFybUNoQU5rIiwieSI6Ijl3SmNQUDRrQmQ5amtCbEJJcWRhclQ2NjVIQU00SndUX0FSSFc0aTN4QUUifX0..Dkf-FXtakCiPuXjW.-KfVQEntYjUe3f5OxslSQwjLFauc50RurLQHDV75sUixNTlsjTIldCZVb6WUKpQkpOdFHOUYFX9_Cvk2ENKdfcVm2eTuyomlKklHF3q5209KwJz8lDK3gOQuAlz79eDou0k_Z3JNGu-qZ8IiDhZZ9iNSgBrsq0BZwVXZ9ViSFEW-YzJBQlKmildscXhp_-Lf6-qiJJrPbZCXFD3PZmzcule3kyBOarg_fjjHLFlIpdjP1lI5wBETqdjk7iBKeO2isSQO7-8.q5EzqP6OPg9yb5BcJH2oFg' + ); + assert.deepEqual(jwks, { + 'https://identity.mozilla.com/apps/send': { + kty: 'oct', + scope: 'https://identity.mozilla.com/apps/send', + k: '5_jrbS76RzJ4EwlKSl527vqz3BDqf5DM4sNsoEK_hoA', + kid: '1414456160-n6yE-eL-ADvnsJo_huq3DA' + } + }); + }); +}); diff --git a/test/frontend/tests/crypto-tests.js b/test/frontend/tests/crypto-tests.js new file mode 100644 index 00000000..0b7f004e --- /dev/null +++ b/test/frontend/tests/crypto-tests.js @@ -0,0 +1,122 @@ +import assert from 'assert'; +import { arrayToB64, b64ToArray } from '../../../app/utils'; + +describe('webcrypto', function() { + it('can do it', async function() { + const encoder = new TextEncoder(); + const x = b64ToArray('SPIfAlwbnncIFw3hEHYihw'); + const a = await crypto.subtle.importKey('raw', x, 'PBKDF2', false, [ + 'deriveKey' + ]); + + const ad = await crypto.subtle.deriveKey( + { + name: 'PBKDF2', + salt: encoder.encode('metadata'), + iterations: 100, + hash: 'SHA-256' + }, + a, + { + name: 'AES-GCM', + length: 128 + }, + false, + ['encrypt', 'decrypt'] + ); + + const ae = await crypto.subtle.encrypt( + { + name: 'AES-GCM', + iv: new Uint8Array(12), + tagLength: 128 + }, + ad, + encoder.encode('hello world!') + ); + + assert.equal( + arrayToB64(new Uint8Array(ae)), + 'UXQQ4yVf55TRk9AZtz5QCwFofRvh-HdWJyxSCQ' + ); + + const ah = await crypto.subtle.deriveKey( + { + name: 'PBKDF2', + salt: encoder.encode('authentication'), + iterations: 100, + hash: 'SHA-256' + }, + a, + { + name: 'HMAC', + hash: { name: 'SHA-256' } + }, + true, + ['sign'] + ); + const ahx = await crypto.subtle.exportKey('raw', ah); + assert.equal( + arrayToB64(new Uint8Array(ahx)), + 'wxXDmHgmMgrcDVD8zbDLRl2yNa8jSAQgsaeIBZ4vueygpxzaTK6ZE_6X-XHvllBly6pSuFNbSxcve0ZHhVdcEA' + ); + // const jwk = await crypto.subtle.exportKey('jwk', ah) + // console.error(jwk) + const as = await crypto.subtle.sign( + { + name: 'HMAC' + }, + ah, + encoder.encode('test') + ); + assert.equal( + arrayToB64(new Uint8Array(as)), + 'AOi4HcoCJxQ4nUYxlmHB1rlcxQBn-zVjrSHz-VW7S-I' + ); + + const b = await crypto.subtle.importKey('raw', x, 'HKDF', false, [ + 'deriveKey' + ]); + const bd = await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('encryption'), + hash: 'SHA-256' + }, + b, + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ); + const bdx = await crypto.subtle.exportKey('raw', bd); + + assert.equal(arrayToB64(new Uint8Array(bdx)), 'g7okjWWO9yueDz16-owShQ'); + + const bh = await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('authentication'), + hash: 'SHA-256' + }, + b, + { + name: 'HMAC', + hash: { name: 'SHA-256' } + }, + true, + ['sign'] + ); + + const bhx = await crypto.subtle.exportKey('raw', bh); + + assert.equal( + arrayToB64(new Uint8Array(bhx)), + 'TQOGtmQ8-ZfnWu6Iq-U1IAVBVREFuI17xqsW1shiC8eMCa-a5qeYTvoX3-5kCoCha8R59ycnPDnTz75clLBmbQ' + ); + }); +}); diff --git a/test/frontend/tests/fileSender-tests.js b/test/frontend/tests/fileSender-tests.js new file mode 100644 index 00000000..be43c848 --- /dev/null +++ b/test/frontend/tests/fileSender-tests.js @@ -0,0 +1,19 @@ +import assert from 'assert'; +import FileSender from '../../../app/fileSender'; +import Archive from '../../../app/archive'; + +// FileSender uses a File in real life but a Blob works for testing +const blob = new Blob(['hello world!'], { type: 'text/plain' }); +blob.name = 'text.txt'; +const archive = new Archive([blob]); + +describe('FileSender', function() { + describe('upload', function() { + it('returns an OwnedFile on success', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + assert.ok(file.id); + assert.equal(file.name, archive.name); + }); + }); +}); diff --git a/test/frontend/tests/keychain-tests.js b/test/frontend/tests/keychain-tests.js new file mode 100644 index 00000000..53f89610 --- /dev/null +++ b/test/frontend/tests/keychain-tests.js @@ -0,0 +1,28 @@ +import assert from 'assert'; +import Keychain from '../../../app/keychain'; + +describe('Keychain', function() { + describe('setPassword', function() { + it('changes the authKey', async function() { + const k = new Keychain(); + const original = await k.authKeyB64(); + k.setPassword('foo', 'some://url'); + const pwd = await k.authKeyB64(); + assert.notEqual(pwd, original); + }); + }); + + describe('encrypt / decrypt metadata', function() { + it('can decrypt metadata it encrypts', async function() { + const k = new Keychain(); + const meta = { + name: 'foo', + type: 'bar/baz' + }; + const ciphertext = await k.encryptMetadata(meta); + const result = await k.decryptMetadata(ciphertext); + assert.equal(result.name, meta.name); + assert.equal(result.type, meta.type); + }); + }); +}); diff --git a/test/frontend/tests/streaming-tests.js b/test/frontend/tests/streaming-tests.js new file mode 100644 index 00000000..0e690505 --- /dev/null +++ b/test/frontend/tests/streaming-tests.js @@ -0,0 +1,111 @@ +const ece = require('http_ece'); +require('buffer'); + +import assert from 'assert'; +import Archive from '../../../app/archive'; +import { b64ToArray } from '../../../app/utils'; +import { blobStream, concatStream } from '../../../app/streams'; +import { decryptStream, encryptStream } from '../../../app/ece.js'; +import { encryptedSize } from '../../../app/utils'; + +const rs = 36; + +const str = 'You are the dancing queen, young and sweet, only seventeen.'; +const testSalt = 'I1BsxtFttlv3u_Oo94xnmw'; +const keystr = 'yqdlZ-tYemfogSmv7Ws5PQ'; + +const buffer = Buffer.from(str); +const params = { + version: 'aes128gcm', + rs: rs, + salt: testSalt, + keyid: '', + key: keystr +}; + +const encrypted = ece.encrypt(buffer, params); +const decrypted = ece.decrypt(encrypted, params); + +describe('Streaming', function() { + describe('blobStream', function() { + it('reads the entire blob', async function() { + const len = 12345; + const chunkSize = 1024; + const blob = new Blob([new Uint8Array(len)]); + const stream = blobStream(blob, chunkSize); + const reader = stream.getReader(); + let bytes = 0; + let data = await reader.read(); + while (!data.done) { + bytes += data.value.byteLength; + assert.ok(data.value.byteLength <= chunkSize, 'chunk too big'); + data = await reader.read(); + } + assert.equal(bytes, len); + }); + }); + + describe('concatStream', function() { + it('reads all the streams', async function() { + const count = 5; + const len = 12345; + const streams = Array.from({ length: count }, () => + blobStream(new Blob([new Uint8Array(len)])) + ); + const concat = concatStream(streams); + const reader = concat.getReader(); + let bytes = 0; + let data = await reader.read(); + while (!data.done) { + bytes += data.value.byteLength; + data = await reader.read(); + } + assert.equal(bytes, len * count); + }); + }); + + //testing against http_ece's implementation + describe('ECE', function() { + const key = b64ToArray(keystr); + const salt = b64ToArray(testSalt).buffer; + + it('can encrypt', async function() { + const stream = new Archive([new Blob([str], { type: 'text/plain' })]) + .stream; + const encStream = encryptStream(stream, key, rs, salt); + const reader = encStream.getReader(); + + let result = Buffer.from([]); + + let state = await reader.read(); + while (!state.done) { + result = Buffer.concat([result, state.value]); + state = await reader.read(); + } + + assert.deepEqual(result, encrypted); + }); + + it('can decrypt', async function() { + const stream = new Archive([new Blob([encrypted])]).stream; + const decStream = decryptStream(stream, key, rs); + + const reader = decStream.getReader(); + let result = Buffer.from([]); + + let state = await reader.read(); + while (!state.done) { + result = Buffer.concat([result, state.value]); + state = await reader.read(); + } + + assert.deepEqual(result, decrypted); + }); + }); + + describe('encryptedSize', function() { + it('matches the size of an encrypted buffer', function() { + assert.equal(encryptedSize(buffer.length, rs), encrypted.length); + }); + }); +}); diff --git a/test/frontend/tests/workflow-tests.js b/test/frontend/tests/workflow-tests.js new file mode 100644 index 00000000..3a9709c4 --- /dev/null +++ b/test/frontend/tests/workflow-tests.js @@ -0,0 +1,226 @@ +import assert from 'assert'; +import Archive from '../../../app/archive'; +import FileSender from '../../../app/fileSender'; +import FileReceiver from '../../../app/fileReceiver'; + +const headless = /Headless/.test(navigator.userAgent); +// TODO: save on headless doesn't work as it used to since it now +// follows a link instead of fetch. Maybe there's a way to make it +// work? For now always set noSave. +const options = { noSave: true || !headless, stream: true }; // only run the saveFile code if headless + +// FileSender uses a File in real life but a Blob works for testing +const blob = new Blob([new ArrayBuffer(1024 * 128)], { type: 'text/plain' }); +blob.name = 'test.txt'; +const archive = new Archive([blob]); +navigator.serviceWorker.register('/serviceWorker.js'); + +describe('Upload / Download flow', function() { + this.timeout(0); + it('can only download once by default', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + await fr.download(options); + + try { + await fr.download(options); + assert.fail('downloaded again'); + } catch (e) { + assert.equal(e.message, '404'); + } + }); + + it('downloads with the correct password', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + await file.setPassword('magic'); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + url: file.url, + nonce: file.keychain.nonce, + requiresPassword: true, + password: 'magic' + }); + await fr.getMetadata(); + await fr.download(options); + assert.equal(fr.state, 'complete'); + }); + + it('blocks invalid passwords from downloading', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + await file.setPassword('magic'); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + url: file.url, + nonce: file.keychain.nonce, + requiresPassword: true, + password: 'password' + }); + try { + await fr.getMetadata(); + assert.fail('got metadata with bad password'); + } catch (e) { + assert.equal(e.message, '401'); + } + try { + // We can't decrypt without IV from metadata + // but let's try to download anyway + await fr.download(options); + assert.fail('downloaded file with bad password'); + } catch (e) { + assert.equal(e.message, '401'); + } + }); + + it('retries a bad nonce', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: null, // oops + requiresPassword: false + }); + await fr.getMetadata(); + assert.equal(fr.fileInfo.name, archive.name); + }); + + it('can cancel the upload', async function() { + const fs = new FileSender(); + const up = fs.upload(archive); + fs.cancel(); // before encrypting + try { + await up; + assert.fail('not cancelled 1'); + } catch (e) { + assert.equal(e.message, '0'); + } + fs.reset(); + fs.once('encrypting', () => fs.cancel()); + try { + await fs.upload(archive); + assert.fail('not cancelled 2'); + } catch (e) { + assert.equal(e.message, '0'); + } + fs.reset(); + fs.once('progress', () => fs.cancel()); + try { + await fs.upload(archive); + assert.fail('not cancelled 3'); + } catch (e) { + assert.equal(e.message, '0'); + } + }); + + it('can cancel the download', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + fr.once('progress', () => fr.cancel()); + try { + await fr.download(options); + assert.fail('not cancelled'); + } catch (e) { + assert.equal(e.message, '0'); + } + }); + + it('can increase download count on download', async function() { + this.timeout(0); + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + await fr.download(options); + await file.updateDownloadCount(); + assert.equal(file.dtotal, 1); + }); + + it('does not increase download count when download cancelled', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + fr.once('progress', () => fr.cancel()); + + try { + await fr.download(options); + assert.fail('not cancelled'); + } catch (e) { + await file.updateDownloadCount(); + assert.equal(file.dtotal, 0); + } + }); + + it('can allow multiple downloads', async function() { + const fs = new FileSender(); + const a = new Archive([blob]); + a.dlimit = 2; + const file = await fs.upload(a); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + await fr.download(options); + await file.updateDownloadCount(); + assert.equal(file.dtotal, 1); + + await fr.download(options); + await file.updateDownloadCount(); + assert.equal(file.dtotal, 2); + try { + await fr.download(options); + assert.fail('downloaded too many times'); + } catch (e) { + assert.equal(e.message, '404'); + } + }); + + it('can delete the file before download', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await file.del(); + try { + await fr.getMetadata(); + assert.fail('file still exists'); + } catch (e) { + assert.equal(e.message, '404'); + } + }); +}); diff --git a/test/integration/README.md b/test/integration/README.md new file mode 100644 index 00000000..e58a0947 --- /dev/null +++ b/test/integration/README.md @@ -0,0 +1,66 @@ +# Integration Tests for [Send](https://send.firefox.com/). +## How to run the tests locally +### Clone the repository + +If you have cloned this project already then you can skip this, otherwise you'll +need to clone this repo using Git. If you do not know how to clone a GitHub +repository, check out this [help page][git-clone] from GitHub. + +If you think you would like to contribute to the tests by writing or maintaining +them in the future, it would be a good idea to create a fork of this repository +first, and then clone that. GitHub also has great instructions for +[forking a repository][git-fork]. + +### App Setup + +Please view the README at the root directory of the project. + +### Run the tests + +Included in the docker-compose file is an image containing Firefox Nightly. +[tox][Tox] is our test environment manager and [pytest][pytest] is the test runner. + +To run the tests, execute the commands below: +```sh +npm run build +npm run test-integration +``` + +### Adding a test + +The tests are written in Python using a POM, or Page Object Model. The plugin we use for this is called [pypom][pypom]. Please read the documentation there for good examples on how to use the Page Object Model when writing tests. + +The pytest plugin that we use for running tests has a number of advanced command line options available too. The full documentation for the plugin can be found [here][pytest-selenium]. + +### Watching a test run (within the docker container) + +The tests are run on a live version of Firefox, but they are run headless. To access the container where the tests are run to view them follow these steps: + +1. Make sure all of the containers are running: +```sh +docker-compose ps +``` +If not start them detached: +```sh +docker-compose up -d +``` + +2. Open your favorite VNC viewer and type in `localhost:5900`. +3. The password is ```secret```. +4. The viewer should open a window with a Ubuntu logo. If that happens you are connected to the ```selenium-firefox``` image and if you start the test, you should see a Firefox window open and the tests running. + +### Debugging a failure + +Whether a test passes or fails will result in a HTML report being created. This report will have detailed information of the test run and if a test does fail, it will provide geckodriver logs, terminal logs, as well as a screenshot of the browser when the test failed. We use a pytest plugin called [pytest-html][pytest-html] to create this report. The report can be found at ```coverage/send-test.html```. It should be viewed within a browser. + +[flake8]: http://flake8.pycqa.org/en/latest/ +[git-clone]: https://help.github.com/articles/cloning-a-repository/ +[git-fork]: https://help.github.com/articles/fork-a-repo/ +[geckodriver]: https://github.com/mozilla/geckodriver/releases/tag/v0.19.1 +[pypom]: http://pypom.readthedocs.io/en/latest/ +[pytest]: https://docs.pytest.org/en/latest/ +[pytest-html]: https://github.com/pytest-dev/pytest-html +[pytest-selenium]: http://pytest-selenium.readthedocs.org/ +[Selenium]: http://selenium-python.readthedocs.io/index.html +[selenium-api]: http://selenium-python.readthedocs.io/locating-elements.html +[Tox]: http://tox.readthedocs.io/ diff --git a/test/integration/download-tests.js b/test/integration/download-tests.js new file mode 100644 index 00000000..1990f21b --- /dev/null +++ b/test/integration/download-tests.js @@ -0,0 +1,110 @@ +/* global browser */ +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); + +const DownloadPage = require('./pages/desktop/download_page'); +const HomePage = require('./pages/desktop/home_page'); + +describe('Send', function() { + const homePage = new HomePage(); + const downloadDir = + browser.desiredCapabilities['moz:firefoxOptions']['prefs'][ + 'browser.download.dir' + ]; + const testFilesPath = path.join(__dirname, 'fixtures'); + const testFiles = fs.readdirSync(testFilesPath); + + beforeEach(function() { + homePage.open(); + }); + + testFiles.forEach(file => { + it(`should upload and download files, file: ${file}`, function() { + browser.chooseFile(homePage.uploadInput, `${testFilesPath}/${file}`); + browser.waitForExist(homePage.uploadButton); + browser.click(homePage.uploadButton); + browser.waitForExist(homePage.shareUrl); + const downloadPage = new DownloadPage( + browser.getValue(homePage.shareUrl) + ); + downloadPage.open(); + downloadPage.download(); + browser.waitForExist(downloadPage.downloadComplete); + assert.ok(fs.existsSync(path.join(downloadDir, file))); + }); + }); + + it('should update the download count on home page after 1 download', function() { + browser.chooseFile( + homePage.uploadInput, + `${testFilesPath}/${testFiles[0]}` + ); + browser.waitForExist(homePage.uploadButton); + browser.waitForExist(homePage.downloadCountSelect); + browser.selectByIndex(homePage.downloadCountSelect, 1); + browser.click(homePage.uploadButton); + browser.waitForExist(homePage.shareUrl); + const downloadPage = new DownloadPage(browser.getValue(homePage.shareUrl)); + downloadPage.open(); + downloadPage.download(); + browser.waitForExist(downloadPage.downloadComplete); + browser.back(); + browser.waitForExist('send-archive'); + assert( + browser + .getText('send-archive > div:first-of-type') + .includes('Expires after 1 download') + ); + }); + + it('should ensure that the downloaded file size matches the uploaded file size', function() { + browser.chooseFile( + homePage.uploadInput, + `${testFilesPath}/${testFiles[0]}` + ); + // get the file size for upload + const uploadSize = fs.statSync(`${testFilesPath}/${testFiles[0]}`).size; + + browser.waitForExist(homePage.uploadButton); + browser.click(homePage.uploadButton); + + browser.waitForExist(homePage.shareUrl); + const downloadPage = new DownloadPage(browser.getValue(homePage.shareUrl)); + downloadPage.open(); + downloadPage.download(); + browser.waitForExist(downloadPage.downloadComplete); + + // get the file size for download + const downloadFile = path.join(downloadDir, `${testFiles[0]}`); + const downloadSize = fs.statSync(downloadFile).size; + + // check if upload and download file sizes are equal + assert.equal(uploadSize, downloadSize); + }); + + it(`should upload and download file with added tracking parameter`, function() { + const trackingUrl = + '?fbclid=IaMFak3Tr4ck1ng1d_SDlP0shBk8SM2EN3cCLFKpHVl-k-Pvv0sf9Zy0tnTu9srqVY'; + const password = 'strongpassword'; + + browser.chooseFile( + homePage.uploadInput, + `${testFilesPath}/${testFiles[0]}` + ); + browser.waitForExist(homePage.addPassword); + browser.click(homePage.addPassword); + browser.waitForExist(homePage.passwordInput); + browser.setValue(homePage.passwordInput, password); + browser.click(homePage.uploadButton); + browser.waitForExist(homePage.shareUrl); + const shareUrl = browser.getValue(homePage.shareUrl); + const downloadPage = new DownloadPage( + shareUrl.replace('#', `${trackingUrl}#`) + ); + downloadPage.open(); + downloadPage.downloadUsingPassword(password); + browser.waitForExist(downloadPage.downloadComplete); + assert.ok(fs.existsSync(path.join(downloadDir, testFiles[0]))); + }); +}); diff --git a/test/integration/fixtures/txt-larger-testfile.txt b/test/integration/fixtures/txt-larger-testfile.txt new file mode 100644 index 00000000..2bf600de --- /dev/null +++ b/test/integration/fixtures/txt-larger-testfile.txt @@ -0,0 +1 @@ +THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST! diff --git a/test/integration/fixtures/txt-small-testfile.txt b/test/integration/fixtures/txt-small-testfile.txt new file mode 100644 index 00000000..1b9ac7bd --- /dev/null +++ b/test/integration/fixtures/txt-small-testfile.txt @@ -0,0 +1 @@ +THIS IS A TEST! diff --git a/test/integration/homepage-tests.js b/test/integration/homepage-tests.js new file mode 100644 index 00000000..e3eeb4fc --- /dev/null +++ b/test/integration/homepage-tests.js @@ -0,0 +1,35 @@ +/* global browser */ +const assert = require('assert'); +const HomePage = require('./pages/desktop/home_page'); + +describe('Send homepage', function() { + this.retries(2); + const homePage = new HomePage(); + const baseUrl = browser.options['baseUrl']; + const footerLinks = ['mozilla', 'cookies', 'github']; + + beforeEach(function() { + homePage.open(); + if (process.env.ANDROID) { + this.skip(); + } + }); + + it('should have the right title', function() { + assert.equal(browser.getTitle(), 'Send'); + }); + + footerLinks.forEach((link, i) => { + it(`should navigate to the correct page: ${link}`, function() { + // Click links on bottom of page + const els = browser.elements(homePage.footerLinks); + browser.elementIdClick(els.value[i].ELEMENT); + // Wait for page to load + browser.waitUntil(() => { + const url = browser.getUrl(); + return url !== baseUrl; + }); + assert.ok(browser.getUrl().includes(link)); + }); + }); +}); diff --git a/test/integration/pages/desktop/download_page.js b/test/integration/pages/desktop/download_page.js new file mode 100644 index 00000000..8bbb8458 --- /dev/null +++ b/test/integration/pages/desktop/download_page.js @@ -0,0 +1,26 @@ +/* global browser */ +const Page = require('./page'); + +class DownloadPage extends Page { + constructor(path) { + super(path); + this.fileId = /download\/(\w+)\/\??.*#/.exec(path)[1]; + this.downloadButton = '#download-btn'; + this.downloadComplete = '#download-complete'; + this.passwordInput = '#password-input'; + this.passwordButton = '#password-btn'; + } + + downloadUsingPassword(password) { + browser.waitForExist(this.passwordInput); + browser.setValue(this.passwordInput, password); + browser.click(this.passwordButton); + return browser.click(this.downloadButton); + } + + download() { + browser.waitForExist(this.downloadButton); + return browser.click(this.downloadButton); + } +} +module.exports = DownloadPage; diff --git a/test/integration/pages/desktop/home_page.js b/test/integration/pages/desktop/home_page.js new file mode 100644 index 00000000..ff613a7e --- /dev/null +++ b/test/integration/pages/desktop/home_page.js @@ -0,0 +1,31 @@ +/* global browser document */ +const Page = require('./page'); + +class HomePage extends Page { + constructor() { + super('/'); + this.footerLinks = 'footer a'; + this.uploadInput = '#file-upload'; + this.uploadButton = '#upload-btn'; + this.progress = 'progress'; + this.shareUrl = '#share-url'; + this.downloadCountSelect = '#expire-after-dl-count-select'; + this.addPassword = '#add-password'; + this.passwordInput = '#password-input'; + this.passwordButton = '#password-btn'; + } + + waitForPageToLoad() { + super.waitForPageToLoad(); + browser.waitForExist(this.uploadInput); + this.showUploadInput(); + return this; + } + + showUploadInput() { + browser.execute(() => { + document.getElementById('file-upload').style.display = 'block'; + }); + } +} +module.exports = HomePage; diff --git a/test/integration/pages/desktop/page.js b/test/integration/pages/desktop/page.js new file mode 100644 index 00000000..bc5856cf --- /dev/null +++ b/test/integration/pages/desktop/page.js @@ -0,0 +1,27 @@ +/* global browser window */ +class Page { + constructor(path) { + this.path = path; + } + + open() { + browser.url(this.path); + this.waitForPageToLoad(); + } + + /** + * @function waitForPageToLoad + * @returns {Object} An object representing the page. + * @throws ElementNotFound + */ + waitForPageToLoad() { + browser.waitUntil(function() { + return browser.execute(function() { + return typeof window.app !== 'undefined'; + }); + }, 3000); + browser.pause(100); + return this; + } +} +module.exports = Page; diff --git a/test/integration/progress-tests.js b/test/integration/progress-tests.js new file mode 100644 index 00000000..9be1be71 --- /dev/null +++ b/test/integration/progress-tests.js @@ -0,0 +1,18 @@ +/* global browser */ +const assert = require('assert'); +const HomePage = require('./pages/desktop/home_page'); + +describe('Send progress page', function() { + const homePage = new HomePage(); + beforeEach(function() { + homePage.open(); + }); + + it('should show progress when a file is uploading', function() { + browser.chooseFile(homePage.uploadInput, __filename); + browser.waitForExist(homePage.uploadButton); + browser.click(homePage.uploadButton); + + assert.ok(browser.waitForExist(homePage.progress)); + }); +}); diff --git a/test/integration/send-test.html b/test/integration/send-test.html new file mode 100644 index 00000000..1b41d52d --- /dev/null +++ b/test/integration/send-test.html @@ -0,0 +1,464 @@ + + + + + Test Report + + + +

    send-test.html

    +

    Report generated on 14-Jun-2018 at 14:20:27 by pytest-html v1.19.0

    +

    Environment

    + + + + + + + + + + + + + + + + + + + + + +
    Base URLhttp://localhost:1443
    DriverFirefox
    JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
    Packages{'pytest': '3.6.1', 'py': '1.5.3', 'pluggy': '0.6.0'}
    PlatformDarwin-17.5.0-x86_64-i386-64bit
    Plugins{'xdist': '1.22.2', 'variables': '1.7.1', 'selenium': '1.13.0', 'metadata': '1.7.0', 'html': '1.19.0', 'forked': '0.2', 'base-url': '1.4.1'}
    Python3.6.5
    +

    Summary

    +

    3 tests ran in 20.54 seconds.

    + 3 passed, 0 skipped, 0 failed, 0 errors, 0 expected failures, 0 unexpected passes +

    Results

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ResultTestDurationLinks
    Passedtest_download.py::test_download0.00
    +
    No log output captured.
    Passedtest_progress.py::test_progress0.00
    +
    No log output captured.
    Passedtest_upload.py::test_upload0.01
    +
    No log output captured.
    \ No newline at end of file diff --git a/test/readme.md b/test/readme.md new file mode 100644 index 00000000..4c336689 --- /dev/null +++ b/test/readme.md @@ -0,0 +1,23 @@ +# Tests + +To run all the tests use `npm test`. This will run the tests and produce a code coverage report at [coverage/index.html](../coverage/index.html). The full test suite is run as a hook on each `git push`. [Mocha](https://mochajs.org) is our preferred test runner. + +## Frontend + +Unit tests reside in `test/frontend/tests`. + +Frontend tests can be ran in the browser by running `npm start` and then browsing to http://localhost:8080/test. Doing it this way will watch for changes and rerun the suite automatically. + +You can also run them in headless Chrome by using `npm run test:frontend`. The results will be printed to the console. + +## Backend + +Unit tests reside in `test/backend` + +Backend test can be run with `npm run test:backend`. [Sinon](http://sinonjs.org/) and [proxyquire](https://github.com/thlorenz/proxyquire) are used for mocking. + +## Integration + +Integration tests include UI tests that run with Selenium. + +The preferred way to run these locally is with `npm run test-integration` which requires docker. To watch the tests connect with VNC. On mac enter `vnc://localhost:5900` in Safari and use the password `secret` to connect. For info on debugging a test see the [wdio debug docs](http://webdriver.io/api/utility/debug.html). diff --git a/test/server/server.test.js b/test/server/server.test.js deleted file mode 100644 index 89a6d1ed..00000000 --- a/test/server/server.test.js +++ /dev/null @@ -1,192 +0,0 @@ -const assert = require('assert'); -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -const request = require('supertest'); -const fs = require('fs'); - -const logStub = {}; -logStub.info = sinon.stub(); -logStub.error = sinon.stub(); - -const storage = proxyquire('../../server/storage', { - './log.js': function() { - return logStub; - } -}); - -storage.flushall(); - -describe('Server integration tests', function() { - let server; - let storage; - let uuid; - let fileId; - - before(function() { - const app = proxyquire('../../server/server', { - './log.js': function() { - return logStub; - } - }); - - server = app.server; - storage = app.storage; - }); - - after(function() { - storage.flushall(); - storage.quit(); - server.close(); - }); - - function upload() { - return request(server) - .post('/upload') - .field('fname', 'test_upload.txt') - .set( - 'X-File-Metadata', - JSON.stringify({ - id: '111111111111111111111111', - filename: 'test_upload.txt' - }) - ) - .attach('file', './test/test_upload.txt'); - } - - it('Responds with a 200 when the service is up', function() { - return request(server) - .get('/') - .expect(200); - }); - - it('Rejects with a 404 when a file id is not valid', function() { - return request(server) - .post('/upload/123') - .field('fname', 'test_upload.txt') - .set( - 'X-File-Metadata', - JSON.stringify({ - silly: 'text' - }) - ) - .attach('file', './test/test_upload.txt') - .expect(404); - }); - - it('Accepts a file and stores it when properly uploaded', function(done) { - upload().then(res => { - assert(res.body.hasOwnProperty('delete')); - uuid = res.body.delete; - assert(res.body.hasOwnProperty('url')); - assert(res.body.hasOwnProperty('id')); - fileId = res.body.id; - fs.access('./static/' + fileId, fs.constants.F_OK, err => { - if (err) { - done(new Error('The file does not exist')); - } else { - done(); - } - }); - }); - }); - - it('Responds with a 200 if a file exists', function() { - return request(server) - .get('/exists/' + fileId) - .expect(200); - }); - - it('Exists in the redis server', function() { - return storage - .exists(fileId) - .then(() => assert(1)) - .catch(err => assert.fail()); - }); - - it('Fails delete if the delete token does not match', function() { - return request(server) - .post('/delete/' + fileId) - .send({ delete_token: 11 }) - .expect(404); - }); - - it('Fails delete if the id is invalid', function() { - return request(server) - .post('/delete/1') - .expect(404); - }); - - it('Successfully deletes if the id is valid and the delete token matches', function( - done - ) { - request(server) - .post('/delete/' + fileId) - .send({ delete_token: uuid }) - .expect(200) - .then(() => { - fs.access('./static/' + fileId, fs.constants.F_OK, err => { - if (err) { - done(); - } else { - done(new Error('The file does not exist')); - } - }); - }); - }); - - it('Responds with a 404 if a file does not exist', function() { - return request(server) - .get('/exists/notfound') - .expect(404); - }); - - it('Uploads properly after a delete', function(done) { - upload().then(res => { - assert(res.body.hasOwnProperty('delete')); - uuid = res.body.delete; - assert(res.body.hasOwnProperty('url')); - assert(res.body.hasOwnProperty('id')); - fileId = res.body.id; - fs.access('./static/' + fileId, fs.constants.F_OK, err => { - if (err) { - done(new Error('The file does not exist')); - } else { - done(); - } - }); - }); - }); - - it('Responds with a 200 for the download page', function() { - return request(server) - .get('/download/' + fileId) - .expect(200); - }); - - it('Downloads a file properly', function() { - return request(server) - .get('/assets/download/' + fileId) - .then(res => { - assert(res.header.hasOwnProperty('content-disposition')); - assert(res.header.hasOwnProperty('content-type')); - assert(res.header.hasOwnProperty('content-length')); - assert(res.header.hasOwnProperty('x-file-metadata')); - assert.equal( - res.header['content-disposition'], - 'attachment; filename=test_upload.txt' - ); - assert.equal(res.header['content-type'], 'application/octet-stream'); - }); - }); - - it('The file is deleted after one download', function() { - assert(!fs.existsSync('./static/' + fileId)); - }); - - it('No longer exists in the redis server', function() { - return storage - .exists(fileId) - .then(() => assert.fail()) - .catch(err => assert(1)); - }); -}); diff --git a/test/testServer.js b/test/testServer.js new file mode 100644 index 00000000..235cd427 --- /dev/null +++ b/test/testServer.js @@ -0,0 +1,32 @@ +let server = null; + +module.exports = { + onPrepare: function() { + return new Promise(function(resolve) { + const webpack = require('webpack'); + const middleware = require('webpack-dev-middleware'); + const express = require('express'); + const expressWs = require('@dannycoates/express-ws'); + const assets = require('../common/assets'); + const routes = require('../server/routes'); + const tests = require('./frontend/routes'); + const app = express(); + const config = require('../webpack.config'); + const wpm = middleware(webpack(config(null, { mode: 'development' })), { + logLevel: 'silent' + }); + app.use(wpm); + assets.setMiddleware(wpm); + expressWs(app, null, { perMessageDeflate: false }); + routes(app); + app.ws('/api/ws', require('../server/routes/ws')); + tests(app); + wpm.waitUntilValid(() => { + server = app.listen(8000, resolve); + }); + }); + }, + onComplete: function() { + server.close(); + } +}; diff --git a/test/test_upload.txt b/test/test_upload.txt deleted file mode 100644 index 273c1a9f..00000000 --- a/test/test_upload.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test. \ No newline at end of file diff --git a/test/unit/aws.storage.test.js b/test/unit/aws.storage.test.js deleted file mode 100644 index 8c4d8b19..00000000 --- a/test/unit/aws.storage.test.js +++ /dev/null @@ -1,172 +0,0 @@ -const assert = require('assert'); -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -const crypto = require('crypto'); - -const redisStub = {}; -const exists = sinon.stub(); -const hget = sinon.stub(); -const hmset = sinon.stub(); -const expire = sinon.spy(); -const del = sinon.stub(); - -redisStub.createClient = function() { - return { - on: sinon.spy(), - exists: exists, - hget: hget, - hmset: hmset, - expire: expire, - del: del - }; -}; - -const fsStub = {}; -fsStub.statSync = sinon.stub(); -fsStub.createReadStream = sinon.stub(); -fsStub.createWriteStream = sinon.stub(); -fsStub.unlinkSync = sinon.stub(); - -const logStub = {}; -logStub.info = sinon.stub(); -logStub.error = sinon.stub(); - -const s3Stub = {}; -s3Stub.headObject = sinon.stub(); -s3Stub.getObject = sinon.stub(); -s3Stub.upload = sinon.stub(); -s3Stub.deleteObject = sinon.stub(); - -const awsStub = { - S3: function() { - return s3Stub; - } -}; - -const storage = proxyquire('../../server/storage', { - redis: redisStub, - fs: fsStub, - './log': function() { - return logStub; - }, - 'aws-sdk': awsStub, - './config': { - s3_bucket: 'test' - } -}); - -describe('Testing Length using aws', function() { - it('Filesize returns properly if id exists', function() { - s3Stub.headObject.callsArgWith(1, null, { ContentLength: 1 }); - return storage - .length('123') - .then(reply => assert.equal(reply, 1)) - .catch(err => assert.fail()); - }); - - it('Filesize fails if the id does not exist', function() { - s3Stub.headObject.callsArgWith(1, new Error(), null); - return storage - .length('123') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Get using aws', function() { - it('Should not error out when the file exists', function() { - const spy = sinon.spy(); - s3Stub.getObject.returns({ - createReadStream: spy - }); - - storage.get('123'); - assert(spy.calledOnce); - }); - - it('Should error when the file does not exist', function() { - const err = function() { - throw new Error(); - }; - const spy = sinon.spy(err); - s3Stub.getObject.returns({ - createReadStream: spy - }); - - assert.equal(storage.get('123'), null); - assert(spy.threw()); - }); -}); - -describe('Testing Set using aws', function() { - beforeEach(function() { - expire.reset(); - }); - - after(function() { - crypto.randomBytes.restore(); - }); - - it('Should pass when the file is successfully uploaded', function() { - const buf = Buffer.alloc(10); - sinon.stub(crypto, 'randomBytes').returns(buf); - s3Stub.upload.returns({ promise: () => Promise.resolve() }); - return storage - .set('123', { on: sinon.stub() }, 'Filename.moz', {}) - .then(() => { - assert(expire.calledOnce); - assert(expire.calledWith('123', 86400)); - }) - .catch(err => assert.fail()); - }); - - it('Should fail if there was an error during uploading', function() { - s3Stub.upload.returns({ promise: () => Promise.reject() }); - return storage - .set('123', { on: sinon.stub() }, 'Filename.moz', 'url.com') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Delete from aws', function() { - it('Returns successfully if the id is deleted off aws', function() { - hget.callsArgWith(2, null, 'delete_token'); - s3Stub.deleteObject.callsArgWith(1, null, {}); - return storage - .delete('file_id', 'delete_token') - .then(_reply => assert(1), err => assert.fail()); - }); - - it('Delete fails if id exists locally but does not in aws', function() { - hget.callsArgWith(2, null, 'delete_token'); - s3Stub.deleteObject.callsArgWith(1, new Error(), {}); - return storage - .delete('file_id', 'delete_token') - .then(_reply => assert.fail(), err => assert(1)); - }); - - it('Delete fails if the delete token does not match', function() { - hget.callsArgWith(2, null, {}); - return storage - .delete('Filename.moz', 'delete_token') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Forced Delete from aws', function() { - it('Deletes properly if id exists', function() { - s3Stub.deleteObject.callsArgWith(1, null, {}); - return storage - .forceDelete('file_id', 'delete_token') - .then(_reply => assert(1), err => assert.fail()); - }); - - it('Deletes fails if id does not exist', function() { - s3Stub.deleteObject.callsArgWith(1, new Error(), {}); - return storage - .forceDelete('file_id') - .then(_reply => assert.fail(), err => assert(1)); - }); -}); diff --git a/test/unit/local.storage.test.js b/test/unit/local.storage.test.js deleted file mode 100644 index 4f1c54bd..00000000 --- a/test/unit/local.storage.test.js +++ /dev/null @@ -1,162 +0,0 @@ -const assert = require('assert'); -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); - -const redisStub = {}; -const exists = sinon.stub(); -const hget = sinon.stub(); -const hmset = sinon.stub(); -const expire = sinon.stub(); -const del = sinon.stub(); - -redisStub.createClient = function() { - return { - on: sinon.spy(), - exists: exists, - hget: hget, - hmset: hmset, - expire: expire, - del: del - }; -}; - -const fsStub = {}; -fsStub.statSync = sinon.stub(); -fsStub.createReadStream = sinon.stub(); -fsStub.createWriteStream = sinon.stub(); -fsStub.unlinkSync = sinon.stub(); - -const logStub = {}; -logStub.info = sinon.stub(); -logStub.error = sinon.stub(); - -const storage = proxyquire('../../server/storage', { - redis: redisStub, - fs: fsStub, - './log': function() { - return logStub; - } -}); - -describe('Testing Exists from local filesystem', function() { - it('Exists returns true when file exists', function() { - exists.callsArgWith(1, null, 1); - return storage - .exists('test') - .then(() => assert(1)) - .catch(err => assert.fail()); - }); - - it('Exists returns false when file does not exist', function() { - exists.callsArgWith(1, null, 0); - return storage - .exists('test') - .then(() => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Length from local filesystem', function() { - it('Filesize returns properly if id exists', function() { - fsStub.statSync.returns({ size: 10 }); - return storage - .length('Filename.moz') - .then(_reply => assert(1)) - .catch(err => assert.fail()); - }); - - it('Filesize fails if the id does not exist', function() { - fsStub.statSync.returns(null); - return storage - .length('Filename.moz') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Get from local filesystem', function() { - it('Get returns properly if id exists', function() { - fsStub.createReadStream.returns(1); - if (storage.get('Filename.moz')) { - assert(1); - } else { - assert.fail(); - } - }); - - it('Get fails if the id does not exist', function() { - fsStub.createReadStream.returns(null); - if (storage.get('Filename.moz')) { - assert.fail(); - } else { - assert(1); - } - }); -}); - -describe('Testing Set to local filesystem', function() { - it('Successfully writes the file to the local filesystem', function() { - const stub = sinon.stub(); - stub.withArgs('finish', sinon.match.any).callsArgWithAsync(1); - stub.withArgs('error', sinon.match.any).returns(1); - fsStub.createWriteStream.returns({ on: stub }); - - return storage - .set('test', { pipe: sinon.stub(), on: sinon.stub() }, 'Filename.moz', {}) - .then(() => { - assert(1); - }) - .catch(err => assert.fail()); - }); - - it('Fails when the file is not properly written to the local filesystem', function() { - const stub = sinon.stub(); - stub.withArgs('error', sinon.match.any).callsArgWithAsync(1); - stub.withArgs('close', sinon.match.any).returns(1); - fsStub.createWriteStream.returns({ on: stub }); - - return storage - .set('test', { pipe: sinon.stub() }, 'Filename.moz', 'moz.la') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Delete from local filesystem', function() { - it('Deletes properly if id exists', function() { - hget.callsArgWith(2, null, '123'); - fsStub.unlinkSync.returns(1); - return storage - .delete('Filename.moz', '123') - .then(reply => assert(reply)) - .catch(err => assert.fail()); - }); - - it('Delete fails if id does not exist', function() { - hget.callsArgWith(2, null, null); - return storage - .delete('Filename.moz', '123') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); - - it('Delete fails if the delete token does not match', function() { - hget.callsArgWith(2, null, null); - return storage - .delete('Filename.moz', '123') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Forced Delete from local filesystem', function() { - it('Deletes properly if id exists', function() { - fsStub.unlinkSync.returns(1); - return storage.forceDelete('Filename.moz').then(reply => assert(reply)); - }); - - it('Deletes fails if id does not exist, but no reject is called', function() { - fsStub.unlinkSync.returns(0); - return storage.forceDelete('Filename.moz').then(reply => assert(!reply)); - }); -}); diff --git a/test/wdio.circleci.conf.js b/test/wdio.circleci.conf.js new file mode 100644 index 00000000..64f4f4b8 --- /dev/null +++ b/test/wdio.circleci.conf.js @@ -0,0 +1,16 @@ +// eslint-disable-next-line node/no-extraneous-require +const ip = require('ip'); +const common = require('./wdio.common.conf'); + +/*/ + +Config for running selenium from a circleci docker container against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: `http://${ip.address()}:8000`, + maxInstances: 1, + bail: 1, + services: [require('./testServer'), 'selenium-standalone'] +}); diff --git a/test/wdio.common.conf.js b/test/wdio.common.conf.js new file mode 100644 index 00000000..195528b9 --- /dev/null +++ b/test/wdio.common.conf.js @@ -0,0 +1,50 @@ +const path = require('path'); +const fs = require('fs'); +const rimraf = require('rimraf'); +const dir = path.join(__dirname, 'integration', 'downloads'); + +fs.mkdirSync(dir, { + recursive: true +}); +rimraf.sync(`${dir}${path.sep}*`); + +exports.config = { + specs: [path.join(__dirname, './integration/**/*-tests.js')], + exclude: [], + maxInstances: 10, + capabilities: [ + { + browserName: 'firefox', + 'moz:firefoxOptions': { + log: { level: 'trace' }, + prefs: { + 'browser.download.panel.shown': false, + 'browser.helperApps.neverAsk.openFile': 'text/plain', + 'browser.helperApps.neverAsk.saveToDisk': 'text/plain', + 'browser.download.folderList': 2, + 'browser.download.dir': dir + } + } + } + ], + pageLoadStrategy: 'normal', + watch: false, + async: true, + logLevel: 'error', + coloredLogs: true, + deprecationWarnings: true, + bail: 0, + screenshotOnReject: false, + baseUrl: 'http://localhost:8000', + waitforTimeout: 20000, + connectionRetryTimeout: 90000, + connectionRetryCount: 3, + services: ['firefox-profile'], + framework: 'mocha', + reporters: ['dot', 'spec'], + mochaOpts: { + ui: 'bdd', + timeout: 30000, + retries: 1 + } +}; diff --git a/test/wdio.docker.conf.js b/test/wdio.docker.conf.js new file mode 100644 index 00000000..a3282ab0 --- /dev/null +++ b/test/wdio.docker.conf.js @@ -0,0 +1,28 @@ +// eslint-disable-next-line node/no-extraneous-require +const ip = require('ip'); +const common = require('./wdio.common.conf'); +const dir = + common.config.capabilities[0]['moz:firefoxOptions'].prefs[ + 'browser.download.dir' + ]; + +/*/ + +Config for running selenium in a new docker container against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: `http://${ip.address()}:8000`, + maxInstances: 1, + services: ['docker', require('./testServer')], + dockerOptions: { + image: 'selenium/standalone-firefox-debug', + healthCheck: 'http://localhost:4444', + options: { + p: ['4444:4444', '5900:5900'], + mount: `type=bind,source=${dir},destination=${dir},consistency=delegated`, + shmSize: '2g' + } + } +}); diff --git a/test/wdio.local.conf.js b/test/wdio.local.conf.js new file mode 100644 index 00000000..7b39c7cb --- /dev/null +++ b/test/wdio.local.conf.js @@ -0,0 +1,16 @@ +// eslint-disable-next-line node/no-extraneous-require +const ip = require('ip'); +const common = require('./wdio.common.conf'); + +/*/ + +Config for running selenium against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: `http://${ip.address()}:8000`, + maxInstances: 1, + bail: 1, + services: [require('./testServer')] +}); diff --git a/test/wdio.remote.config.js b/test/wdio.remote.config.js new file mode 100644 index 00000000..74244d51 --- /dev/null +++ b/test/wdio.remote.config.js @@ -0,0 +1,29 @@ +const common = require('./wdio.common.conf'); +const path = require('path'); + +/*/ + +Config for running saucelabs against a hosted server + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: process.env.TEST_SERVER || 'https://send.dev.mozaws.net', + exclude: [ + // the /test endpoint only exists on localhost + path.join(__dirname, './integration/unit-tests.js'), + // we don't have access to the fs in this context + path.join(__dirname, './integration/download-tests.js') + ], + capabilities: [ + { browserName: 'firefox' }, + { browserName: 'chrome' }, + { browserName: 'MicrosoftEdge' }, + { + browserName: 'safari' + } + ], + services: ['sauce'], + user: process.env.SAUCE_USERNAME, + key: process.env.SAUCE_ACCESS_KEY +}); diff --git a/test/wdio.saucelabs.config.js b/test/wdio.saucelabs.config.js new file mode 100644 index 00000000..7d7cbf4e --- /dev/null +++ b/test/wdio.saucelabs.config.js @@ -0,0 +1,30 @@ +const common = require('./wdio.common.conf'); +const path = require('path'); + +/*/ + +Config for running saucelabs against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + maxInstances: 2, + exclude: [path.join(__dirname, './integration/download-tests.js')], + capabilities: [ + { browserName: 'firefox' }, + { browserName: 'chrome' }, + { browserName: 'MicrosoftEdge' }, + { + browserName: 'safari' + } + ], + services: ['sauce', require('./testServer')], + sauceConnect: true, + sauceConnectOpts: { + // uncomment to debug + // logfile: __dirname + '/sc.log', + // verbose: true + }, + user: process.env.SAUCE_USERNAME, + key: process.env.SAUCE_ACCESS_KEY +}); diff --git a/webpack.config.js b/webpack.config.js index a89509d9..aae4b99b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,147 +2,264 @@ const path = require('path'); const webpack = require('webpack'); const CopyPlugin = require('copy-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); -const IS_DEV = process.env.NODE_ENV === 'development'; +const VersionPlugin = require('./build/version_plugin'); +const AndroidIndexPlugin = require('./build/android_index_plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); -module.exports = { +// Fix for node 18+ +// See: +const crypto = require('crypto'); +const crypto_orig_createHash = crypto.createHash; +crypto.createHash = algorithm => + crypto_orig_createHash(algorithm == 'md4' ? 'sha256' : algorithm); + +const webJsOptions = { + babelrc: false, + presets: [ + [ + '@babel/preset-env', + { + bugfixes: true, + useBuiltIns: 'entry', + corejs: 3 + } + ] + ], + plugins: [ + '@babel/plugin-syntax-dynamic-import', + 'module:nanohtml', + ['@babel/plugin-proposal-class-properties', { loose: false }] + ] +}; + +const serviceWorker = { + target: 'webworker', entry: { - vendor: ['babel-polyfill', 'fluent'], - app: ['./app/main.js'] + serviceWorker: './app/serviceWorker.js' }, output: { - filename: '[name].[chunkhash:8].js', + filename: '[name].js', path: path.resolve(__dirname, 'dist'), publicPath: '/' }, - devtool: IS_DEV && 'inline-source-map', + devtool: 'source-map', + module: { + rules: [ + { + test: /\.(png|jpg)$/, + loader: 'file-loader', + options: { + name: '[name].[contenthash:8].[ext]', + esModule: false + } + }, + { + test: /\.svg$/, + use: [ + { + loader: 'file-loader', + options: { + name: '[name].[contenthash:8].[ext]', + esModule: false + } + }, + { + loader: 'svgo-loader', + options: { + plugins: [ + { + name: 'removeViewBox', + active: false // true causes stretched images + }, + { + name: 'convertStyleToAttrs', + active: true // for CSP, no unsafe-eval + }, + { + name: 'removeTitle', + active: true // for smallness + } + ] + } + } + ] + }, + { + // loads all assets from assets/ for use by common/assets.js + test: require.resolve('./common/generate_asset_map.js'), + use: ['babel-loader', 'val-loader'] + } + ] + }, + plugins: [new webpack.IgnorePlugin(/\.\.\/dist/)] +}; + +const web = { + target: 'web', + entry: { + app: ['./app/main.js'] + // android: ['./android/android.js'], + // ios: ['./ios/ios.js'] + }, + output: { + chunkFilename: '[name].[contenthash:8].js', + filename: '[name].[contenthash:8].js', + path: path.resolve(__dirname, 'dist') + }, module: { rules: [ { test: /\.js$/, oneOf: [ - { - include: require.resolve('./assets/cryptofill'), - use: [ - { - loader: 'file-loader', - options: { - name: '[name].[hash:8].[ext]' - } - } - ] - }, - { - include: [path.dirname(require.resolve('fluent'))], - use: [ - { - loader: 'expose-loader', - options: 'fluent' - }, - { - loader: 'babel-loader', - options: { - presets: [['env', { modules: false }]] - } - } - ] - }, { loader: 'babel-loader', include: [ path.resolve(__dirname, 'app'), path.resolve(__dirname, 'common'), - path.resolve(__dirname, 'node_modules/testpilot-ga/src') + // some dependencies need to get re-babeled because we + // have different targets than their default configs + path.resolve( + __dirname, + 'node_modules/@dannycoates/webcrypto-liner' + ), + path.resolve(__dirname, 'node_modules/@fluent'), + path.resolve(__dirname, 'node_modules/intl-pluralrules') ], - options: { - babelrc: false, - presets: [['env', { modules: false }], 'stage-2'], - plugins: ['yo-yoify'] - } + options: webJsOptions }, { + // Strip asserts from our deps, mainly choojs family include: [path.resolve(__dirname, 'node_modules')], + exclude: [ + path.resolve(__dirname, 'node_modules/crc'), + path.resolve(__dirname, 'node_modules/@fluent'), + path.resolve(__dirname, 'node_modules/@sentry'), + path.resolve(__dirname, 'node_modules/tslib'), + path.resolve(__dirname, 'node_modules/webcrypto-core') + ], loader: 'webpack-unassert-loader' } ] }, { - test: /\.(svg|png|jpg)$/, + test: /\.(png|jpg)$/, loader: 'file-loader', options: { - name: '[name].[hash:8].[ext]' + name: '[name].[contenthash:8].[ext]', + esModule: false } }, { - test: /\.css$/, + test: /\.svg$/, use: [ { loader: 'file-loader', options: { - name: '[name].[hash:8].[ext]' + name: '[name].[contenthash:8].[ext]', + esModule: false } }, - 'extract-loader', - { loader: 'css-loader', options: { importLoaders: 1 } }, - 'postcss-loader' + { + loader: 'svgo-loader', + options: { + plugins: [ + { + name: 'cleanupIDs', + active: false + }, + { + name: 'removeViewBox', + active: false // true causes stretched images + }, + { + name: 'convertStyleToAttrs', + active: true // for CSP, no unsafe-eval + }, + { + name: 'removeTitle', + active: true // for smallness + } + ] + } + } ] }, { - test: require.resolve('./package.json'), - use: [ - { - loader: 'file-loader', - options: { - name: 'version.json' - } - }, - 'extract-loader', - './build/package_json_loader' - ] + // creates style.css with all styles + test: /\.css$/, + use: ExtractTextPlugin.extract({ + use: [ + { + loader: 'css-loader', + options: { + importLoaders: 1, + esModule: false + } + }, + 'postcss-loader' + ] + }) }, { test: /\.ftl$/, - use: [ - { - loader: 'file-loader', - options: { - name: '[path][name].[hash:8].js' - } - }, - 'extract-loader', - './build/fluent_loader' - ] + use: 'raw-loader' }, { - test: require.resolve('./build/generate_asset_map.js'), + // creates test.js for /test + test: require.resolve('./test/frontend/index.js'), use: ['babel-loader', 'val-loader'] }, { - test: require.resolve('./build/generate_l10n_map.js'), + // loads all assets from assets/ for use by common/assets.js + test: require.resolve('./common/generate_asset_map.js'), use: ['babel-loader', 'val-loader'] } ] }, plugins: [ - new CopyPlugin([ - { - context: 'public', - from: '*.*' - } - ]), - new webpack.IgnorePlugin(/dist/), - new webpack.IgnorePlugin(/require-from-string/), - new webpack.HashedModuleIdsPlugin(), - new webpack.optimize.CommonsChunkPlugin({ - name: 'vendor', - minChunks: ({ resource }) => /node_modules/.test(resource) + new CopyPlugin({ + patterns: [ + { + context: 'public', + from: '*.*' + } + ] }), - new webpack.optimize.CommonsChunkPlugin({ - name: 'runtime' + new webpack.EnvironmentPlugin(['NODE_ENV']), + new webpack.IgnorePlugin(/\.\.\/dist/), // used in common/*.js + new ExtractTextPlugin({ + filename: '[name].[md5:contenthash:8].css' }), - new ManifestPlugin() + new VersionPlugin(), // used for the /__version__ route + new AndroidIndexPlugin(), + new ManifestPlugin() // used by server side to resolve hashed assets ], + devtool: 'source-map', devServer: { + before: + process.env.NODE_ENV === 'development' && require('./server/bin/dev'), compress: true, - before: IS_DEV ? require('./server/dev') : undefined + hot: false, + host: '0.0.0.0', + proxy: { + '/api/ws': { + target: 'ws://localhost:8081', + ws: true, + secure: false + } + } } }; + +module.exports = (env, argv) => { + const mode = argv.mode || 'production'; + // eslint-disable-next-line no-console + console.error(`mode: ${mode}`); + process.env.NODE_ENV = web.mode = serviceWorker.mode = mode; + if (mode === 'development') { + // istanbul instruments the source for code coverage + webJsOptions.plugins.push('istanbul'); + web.entry.tests = ['./test/frontend/index.js']; + } + return [web, serviceWorker]; +};